You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xamarin中调用TakePhotoAsync()时出现文件位置获取失败错误

解决Xamarin MediaPlugin 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:37:19