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

升级至Android 13时Xamarin.Android应用图片权限异常问题

针对Xamarin.Android升级targetSdkVersion到33后相册访问问题的排查方向
  • 权限申请逻辑未适配Android 13版本
    Android 13开始拆分媒体权限,READ_EXTERNAL_STORAGE已被废弃,仅需申请READ_MEDIA_IMAGES。但要注意代码中需根据系统版本分支处理:

    if (Build.VERSION.SdkInt >= BuildVersionCodes.Tiramisu)
    {
        // Android 13及以上请求媒体图片权限
        ActivityCompat.RequestPermissions(this, new string[] { Manifest.Permission.ReadMediaImages }, REQUEST_CODE);
    }
    else
    {
        // Android 12及以下请求外部存储读取权限
        ActivityCompat.RequestPermissions(this, new string[] { Manifest.Permission.ReadExternalStorage }, REQUEST_CODE);
    }
    

    同时要确保代码中主动发起了权限请求,仅在Manifest中声明权限不会自动弹出申请提示。

  • Manifest中冗余权限干扰
    Android 13下WRITE_EXTERNAL_STORAGE对媒体文件访问已无作用,建议移除该权限;同时给旧版本的READ_EXTERNAL_STORAGE添加版本限制,避免在Android 13中被误处理:

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
    <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
    
  • 文件访问方式未适配新权限模型
    若仍使用File类直接访问相册路径,在targetSdk33下会因权限限制失效。需改用MediaStore查询媒体文件Uri,通过ContentResolver读取内容:

    // 示例:查询相册图片
    var uri = MediaStore.Images.Media.ExternalContentUri;
    var projection = new string[] { MediaStore.Images.Media.Id, MediaStore.Images.Media.DisplayName };
    var cursor = ContentResolver.Query(uri, projection, null, null, null);
    // 处理cursor获取图片信息
    
  • 权限申请时机/上下文错误
    权限申请必须在用户交互触发时发起(比如点击“选择图片”按钮的事件中),不能在后台线程或应用启动时自动请求;同时要确保发起请求的Activity/Fragment处于活跃状态,否则系统可能不弹出权限提示。

  • 模拟器安装问题的替代方案
    跳过Visual Studio内置SDK管理器的报错,用命令行工具安装API 33镜像:

    sdkmanager "system-images;android-33;google_apis;x86_64"
    

    手动安装后即可创建API 33模拟器,准确测试权限行为。

  • 权限被用户拒绝且勾选“不再询问”
    若用户之前拒绝过权限并勾选了不再提示,再次申请时系统会直接返回拒绝,不会弹出提示。需在权限回调中判断此情况,引导用户跳转至应用设置页开启权限:

    public override void OnRequestPermissionsResult(int requestCode, string[] permissions, Permission[] grantResults)
    {
        base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == REQUEST_CODE && grantResults[0] == Permission.Denied)
        {
            if (!ActivityCompat.ShouldShowRequestPermissionRationale(this, Manifest.Permission.ReadMediaImages))
            {
                // 用户勾选了不再询问,跳转设置页
                Intent intent = new Intent(Settings.ActionApplicationDetailsSettings);
                Uri uri = Uri.FromParts("package", PackageName, null);
                intent.SetData(uri);
                StartActivity(intent);
            }
        }
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 06:32:58