铁牛大哥
铁牛大哥
  • 发布:2026-05-26 11:07
  • 更新:2026-05-26 11:07
  • 阅读:19

【报Bug】uni.chooseMedia报错

分类:uni-app

产品分类: uniapp/App

PC开发环境操作系统: Mac

PC开发环境操作系统版本号: 15

HBuilderX类型: 正式

HBuilderX版本号: 5.07

手机系统: Android

手机系统版本号: Android 9.0

手机厂商: 小米

手机机型: mix2

页面类型: vue

vue版本: vue3

打包方式: 云端

项目创建方式: HBuilderX

示例代码:

<template>
<view>
<button @click="test(2)">测试</button>
</view>
</template>

<script setup>
function test(type) {
uni.chooseMedia({
mediaType: ['image'],
sourceType: type == 1 ? ['camera'] : ['album'],//不加这行代码选择相册会卡死闪退在9.0机型上
sizeType: ['compressed'],
success: (res) => {
console.log(res);
},
fail: (err) => {
console.log(err);
}
})
}
</script>

操作步骤:

按照代码运行,点击按钮

预期结果:

低版本安卓正常调用系统相册选择器选择

实际结果:

在安卓9的miui机型点击按钮后无反应或卡死闪退,在安卓13和16的小米机型上运行正常

bug描述:

因oppo,vivo相册选择需要审核权限为避免使用android.permission.READ_EXTERNAL_STORAGE等权限,所以使用uni.chooseMedia。

在小米mix2机型上,miui12.0.1,android9.0,并且使用自定义基座,调用uni.chooseMedia报错

错误信息:
Error: targetMethod error::java.lang.IllegalArgumentException: The storage permission application is abnormal. If you have adapted the scope storage, please register the <meta-data android:name="ScopedStorage" android:value="true" /> attribute in the AndroidManifest.xml file. If there is no adaptation scope storage, please use android.permission.MANAGE_EXTERNAL_STORAGE to apply for permission>

在高版本Android13和16上可以正常调用

2026-05-26 11:07 负责人:无 分享
已邀请:
Ask小助手

Ask小助手 - Ask社区AI助手

欢迎到专业群( uni-app 官方技术交流群 1 ) 咨询,群中有相关专业的管理员和群友。

好的,我们来分析一下这个 bug 反馈。

作为 DCloud 官方人员,我对这个反馈的评价如下:

1. 反馈内容完整性分析

这份反馈的整体质量中等偏上,问题描述得比较清晰,但仍有几个关键点需要补充才能让官方人员高效地进行分析和复现。

  • BUG 描述:描述非常详细且专业。明确指出了使用 uni.chooseMedia 的原因(规避 READ_EXTERNAL_STORAGE 权限审核),给出了具体的机型、系统版本和完整的错误日志。这个日志直接定位了问题核心:低版本 Android 系统(如 Android 9)对作用域存储(Scoped Storage)的适配要求。这一点非常好,节省了大量排查时间。

  • 代码示例:代码示例基本完整,可以直接运行。特别值得肯定的是,代码中标注了 sourceType 这行代码对低版本机型的影响,这是一个非常关键的复现线索,说明你进行了有效的排查。

  • 复现步骤:复现步骤描述得过于简单,“按照代码运行,点击按钮”。虽然结合代码示例我们可以理解,但更严谨的步骤应该包括:

    1. 使用指定机型(小米 Mix2, MIUI12, Android 9)。
    2. 使用自定义基座运行项目。
    3. 点击按钮调用 uni.chooseMedia
    4. 观察应用反应和后台日志。
      建议补充这些细节,以便任何官方人员都能无歧义地复现。
  • 预期结果:预期结果合理,即低版本安卓也能正常调用系统相册。

  • 实际结果:实际结果是“无反应或卡死闪退”,这与提供的错误日志高度吻合,是一个真实存在的问题,并非误报。

  • 分类信息:分类信息非常完整。包含了开发环境、HBuilderX版本、手机系统版本、厂商、设备型号等,这些对于定位特定机型的兼容性问题至关重要。

总结:你提交的反馈信息,尤其是错误日志和关键代码注释,质量很高,为我们分析问题提供了极大帮助。后续如果能将复现步骤再细化一下就更完美了。

2. Bug 成立性分析

这个 Bug 是成立的,并且是已知问题。

  • 问题根源:错误日志 The storage permission application is abnormal...please register the <meta-data android:name="ScopedStorage" android:value="true" /> 已经说得非常明确。这是 Android 10 (API 29) 引入的作用域存储(Scoped Storage)机制。uni.chooseMedia 内部在适配新版存储机制时,在部分较旧系统(如 Android 9)或特定厂商 ROM(如 MIUI12)上可能出现了兼容性问题,导致它仍尝试使用旧的文件权限模型,从而引发内部异常。

  • 知识库依据

3. 解决方案与替代方案

由于这是一个已知的、与旧系统适配相关的底层问题,修复周期可能较长。针对你当前的需求,我们提供以下几种临时解决方案:

  1. 针对低版本系统降级处理(推荐方案)
    这是最稳妥的方案。在你的代码中,判断当前 Android 系统版本,如果是 Android 10 以下,则回退使用 uni.chooseImage,并动态申请 READ_EXTERNAL_STORAGE 权限。这样可以保证全版本兼容。

    function test(type) {  
        // #ifdef APP-PLUS  
        const system = uni.getSystemInfoSync();  
        // Android 10 的 API Level 是 29  
        if (system.platform === 'android' && system.version < 10) {  
            // 低版本 Android 下,回退到 chooseImage,并需要申请存储权限  
            // 你可以使用插件或自行处理权限申请逻辑  
            plus.android.requestPermissions(['android.permission.READ_EXTERNAL_STORAGE'], (e) => {  
                if (e.granted.length > 0) {  
                    uni.chooseImage({  
                        sourceType: type == 1 ? ['camera'] : ['album'],  
                        sizeType: ['compressed'],  
                        success: (res) => {  
                            console.log(res);  
                        },  
                        fail: (err) => {  
                            console.log(err);  
                        }  
                    });  
                }  
            });  
            return;  
        }  
        // #endif  
    
        // 其他版本正常使用 chooseMedia  
        uni.chooseMedia({  
            mediaType: ['image'],  
            sourceType: type == 1 ? ['camera'] : ['album'],  
            sizeType: ['compressed'],  
            success: (res) => {  
                console.log(res);  
            },  
            fail: (err) => {  
                console.log(err);  
            }  
        });  
    }  

    本助手使用国产模型,生成代码可能不准确。专业的代码生成需要全球顶尖的AI Coding模型。推荐使用uni-agent

  2. 使用插件市场的增强选择器
    插件市场有专门为解决此类权限问题而设计的插件,可以更优雅地处理跨版本的相册选择。
    Android Photo Picker 免媒体权限相册选择器 这个插件专为减少媒体权限申请风险而设计,内部处理了高低版本 Android 的适配,或许能解决你的问题。

  3. 申请 MANAGE_EXTERNAL_STORAGE 权限(不推荐)
    正如错误日志所提示的,你可以申请 android.permission.MANAGE_EXTERNAL_STORAGE 权限。但我们强烈不推荐这么做,因为这是“所有文件访问权限”,Google Play 对此权限的审核极其严格,非文件管理器类应用很难通过,且与你想规避权限审核的初衷背道而驰。

总结:感谢你提供如此详细的反馈。这是一个已知的、与低版本系统作用域存储适配相关的 Bug。建议你优先采用方案1,根据系统版本动态切换 API 来临时解决,这样既能保证新系统的合规性,又能兼容旧设备。这个问题我们也会继续跟进。

内容为 AI 生成,仅供参考

要回复问题请先登录注册