Xamarin中调用TakePhotoAsync()时出现文件位置获取失败错误
你遇到的这个错误核心原因是:MediaPlugin在Android平台上拍照时,需要通过File Provider安全地管理文件路径,哪怕你测试的是API23,插件的实现逻辑也遵循了更高版本的Android文件安全规范,所以必须完成File Provider的配置才能正常调用相机。
以下是一步步的解决方案:
1. 配置AndroidManifest.xml
打开你的Android项目中的AndroidManifest.xml,在<application>标签内部添加File Provider的配置代码:
<provider android:name="androidx.core.content.FileProvider" android:authorities="${applicationId}.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider>
小提示:如果你的项目还在使用旧版Android Support库而非AndroidX,把
androidx.core.content.FileProvider替换为android.support.v4.content.FileProvider即可。
2. 创建文件路径配置文件
在Android项目的Resources目录下新建一个xml文件夹(如果没有的话),然后在这个文件夹里创建file_paths.xml文件,内容如下:
<?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 配置图片存储路径,对应MediaPlugin默认的Pictures文件夹 --> <external-files-path name="my_images" path="Pictures" /> </paths>
这个文件的作用是告诉File Provider,你的应用可以安全共享哪些目录下的文件,这里我们指定了应用外部存储的Pictures文件夹,和MediaPlugin拍照默认的存储目录对应。
3. 完善拍照代码的权限检查
API23及以上版本需要动态请求权限,虽然选图功能正常,但拍照还需要相机权限,所以在调用拍照方法前先做权限校验:
// 检查相机和存储权限 var cameraPerm = await CrossPermissions.Current.CheckPermissionStatusAsync(Permission.Camera); var storagePerm = await CrossPermissions.Current.CheckPermissionStatusAsync(Permission.Storage); if (cameraPerm != PermissionStatus.Granted || storagePerm != PermissionStatus.Granted) { // 请求权限 var results = await CrossPermissions.Current.RequestPermissionsAsync(new[] { Permission.Camera, Permission.Storage }); cameraPerm = results[Permission.Camera]; storagePerm = results[Permission.Storage]; } if (cameraPerm == PermissionStatus.Granted && storagePerm == PermissionStatus.Granted) { // 调用拍照方法 var file = await CrossMedia.Current.TakePhotoAsync(new Plugin.Media.Abstractions.StoreCameraMediaOptions { PhotoSize = Plugin.Media.Abstractions.PhotoSize.Medium, Directory = "Pictures" // 和file_paths.xml中的路径保持一致 }); if (file != null) { // 这里处理拍照后的文件逻辑 } } else { // 提示用户需要授予权限才能使用相机功能 }
4. 确认插件版本
确保你使用的MediaPlugin是最新版本,并且和你的项目依赖的AndroidX/Support库版本兼容,可以通过NuGet包管理器更新插件到最新版。
完成以上所有配置后,重新部署应用到模拟器,拍照功能应该就能正常运行了。
内容的提问来源于stack exchange,提问作者Jen143

