You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何在Xamarin Android中获取相机拍摄图片的文件名

获取相机拍摄图片文件名的解决方案

我来帮你搞定这个问题~你现在的代码只能拿到相机返回的缩略图,但默认的MediaStore.ActionImageCapture并不会直接返回完整图片的文件名。要获取文件名,我们需要让相机把拍摄的图片保存到我们指定的路径,之后从这个路径里提取文件名就可以了。

步骤1:创建生成图片文件的方法

首先写一个方法来生成唯一的图片文件,同时保存文件的路径:

private string _currentPhotoPath; // 用来保存图片的完整路径

private File CreateImageFile()
{
    // 用时间戳生成唯一文件名,避免重复
    string timeStamp = DateTime.Now.ToString("yyyyMMdd_HHmmss");
    string imageFileName = $"JPEG_{timeStamp}_";
    // 获取系统公共图片目录
    File storageDir = Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryPictures);
    
    // 创建临时图片文件
    File image = File.CreateTempFile(
        imageFileName,
        ".jpg",
        storageDir
    );

    // 保存文件的绝对路径,后续会用到
    _currentPhotoPath = image.AbsolutePath;
    return image;
}

步骤2:修改按钮点击事件,指定图片输出路径

原来的Intent没有指定保存位置,现在我们要给它加上输出Uri,让相机把图片存到我们刚才生成的文件里:

fab3.Click += (o, e) => 
{
    Intent intent = new Intent(MediaStore.ActionImageCapture);
    // 先检查有没有能处理这个Intent的相机应用
    if (intent.ResolveActivity(PackageManager) != null)
    {
        File photoFile = null;
        try
        {
            photoFile = CreateImageFile();
        }
        catch (IOException ex)
        {
            // 处理文件创建失败的情况,比如打印日志
            Console.WriteLine($"创建图片文件出错:{ex.Message}");
        }

        if (photoFile != null)
        {
            // Android 7.0+ 需要用FileProvider来获取Uri,避免权限问题
            Uri photoURI = FileProvider.GetUriForFile(
                this,
                "com.yourapp.package.fileprovider", // 这里替换成你的应用的FileProvider授权名
                photoFile
            );
            // 设置Intent的输出参数,让相机把图片存到指定位置
            intent.PutExtra(MediaStore.ExtraOutput, photoURI);
            StartActivityForResult(intent, 0);
        }
    }
    CloseFabMenu();
};

步骤3:配置FileProvider(Android 7.0+ 必需)

因为Android 7.0及以上禁止直接使用file://格式的Uri,所以我们需要配置FileProvider来生成安全的Uri:

  1. AndroidManifest.xml<application>标签里添加Provider配置:
<provider
    android:name="androidx.core.content.FileProvider"
    android:authorities="com.yourapp.package.fileprovider" <!-- 和上面代码里的授权名保持一致 -->
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/file_paths" />
</provider>
  1. res/xml目录下创建file_paths.xml文件(如果没有xml目录就新建一个),内容如下:
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 指定公共图片目录的访问路径 -->
    <external-public-path name="my_images" path="Pictures" />
</paths>

步骤4:在OnActivityResult中获取文件名

现在拍照完成后,我们可以直接从保存的_currentPhotoPath里提取文件名:

protected override void OnActivityResult(int requestCode, [GeneratedEnum] Result resultCode, Intent data)
{
    base.OnActivityResult(requestCode, resultCode, data);
    switch (requestCode)
    {
        case 0:
            if (resultCode == Result.Ok)
            {
                // 从路径中提取文件名
                string fileName = System.IO.Path.GetFileName(_currentPhotoPath);
                // 这里就可以使用文件名了,比如打印或者后续处理
                Console.WriteLine($"拍摄的图片文件名:{fileName}");

                // 如果需要加载完整图片,也可以用这个路径解码Bitmap
                Bitmap bitmap = BitmapFactory.DecodeFile(_currentPhotoPath);
            }
            break;
    }
}

为什么原来的代码拿不到文件名?

默认情况下,MediaStore.ActionImageCapture只会把缩略图放在data.Extras.Get("data")里,不会返回完整图片的路径或文件名。只有当我们指定了MediaStore.ExtraOutput参数,让相机把完整图片保存到我们指定的位置,才能通过这个路径获取到文件名。

内容的提问来源于stack exchange,提问作者Zubair Munir

火山引擎 最新活动