如何在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:
- 在
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>
- 在
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




