欢迎到专业群( uni-app 官方技术交流群 1 ) 咨询,群中有相关专业的管理员和群友。
好的,我们来分析一下这个 bug 反馈。
作为 DCloud 官方人员,我对这个反馈的评价如下:
1. 反馈内容完整性分析
这份反馈的整体质量中等偏上,问题描述得比较清晰,但仍有几个关键点需要补充才能让官方人员高效地进行分析和复现。
-
BUG 描述:描述非常详细且专业。明确指出了使用 uni.chooseMedia 的原因(规避 READ_EXTERNAL_STORAGE 权限审核),给出了具体的机型、系统版本和完整的错误日志。这个日志直接定位了问题核心:低版本 Android 系统(如 Android 9)对作用域存储(Scoped Storage)的适配要求。这一点非常好,节省了大量排查时间。
-
代码示例:代码示例基本完整,可以直接运行。特别值得肯定的是,代码中标注了 sourceType 这行代码对低版本机型的影响,这是一个非常关键的复现线索,说明你进行了有效的排查。
-
复现步骤:复现步骤描述得过于简单,“按照代码运行,点击按钮”。虽然结合代码示例我们可以理解,但更严谨的步骤应该包括:
- 使用指定机型(小米 Mix2, MIUI12, Android 9)。
- 使用自定义基座运行项目。
- 点击按钮调用
uni.chooseMedia。
- 观察应用反应和后台日志。
建议补充这些细节,以便任何官方人员都能无歧义地复现。
-
预期结果:预期结果合理,即低版本安卓也能正常调用系统相册。
-
实际结果:实际结果是“无反应或卡死闪退”,这与提供的错误日志高度吻合,是一个真实存在的问题,并非误报。
-
分类信息:分类信息非常完整。包含了开发环境、HBuilderX版本、手机系统版本、厂商、设备型号等,这些对于定位特定机型的兼容性问题至关重要。
总结:你提交的反馈信息,尤其是错误日志和关键代码注释,质量很高,为我们分析问题提供了极大帮助。后续如果能将复现步骤再细化一下就更完美了。
2. Bug 成立性分析
这个 Bug 是成立的,并且是已知问题。
3. 解决方案与替代方案
由于这是一个已知的、与旧系统适配相关的底层问题,修复周期可能较长。针对你当前的需求,我们提供以下几种临时解决方案:
-
针对低版本系统降级处理(推荐方案):
这是最稳妥的方案。在你的代码中,判断当前 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
-
使用插件市场的增强选择器:
插件市场有专门为解决此类权限问题而设计的插件,可以更优雅地处理跨版本的相册选择。
Android Photo Picker 免媒体权限相册选择器 这个插件专为减少媒体权限申请风险而设计,内部处理了高低版本 Android 的适配,或许能解决你的问题。
-
申请 MANAGE_EXTERNAL_STORAGE 权限(不推荐):
正如错误日志所提示的,你可以申请 android.permission.MANAGE_EXTERNAL_STORAGE 权限。但我们强烈不推荐这么做,因为这是“所有文件访问权限”,Google Play 对此权限的审核极其严格,非文件管理器类应用很难通过,且与你想规避权限审核的初衷背道而驰。
总结:感谢你提供如此详细的反馈。这是一个已知的、与低版本系统作用域存储适配相关的 Bug。建议你优先采用方案1,根据系统版本动态切换 API 来临时解决,这样既能保证新系统的合规性,又能兼容旧设备。这个问题我们也会继续跟进。
1 个回复
Ask小助手 - Ask社区AI助手
好的,我们来分析一下这个 bug 反馈。
作为 DCloud 官方人员,我对这个反馈的评价如下:
1. 反馈内容完整性分析
这份反馈的整体质量中等偏上,问题描述得比较清晰,但仍有几个关键点需要补充才能让官方人员高效地进行分析和复现。
BUG 描述:描述非常详细且专业。明确指出了使用
uni.chooseMedia的原因(规避READ_EXTERNAL_STORAGE权限审核),给出了具体的机型、系统版本和完整的错误日志。这个日志直接定位了问题核心:低版本 Android 系统(如 Android 9)对作用域存储(Scoped Storage)的适配要求。这一点非常好,节省了大量排查时间。代码示例:代码示例基本完整,可以直接运行。特别值得肯定的是,代码中标注了
sourceType这行代码对低版本机型的影响,这是一个非常关键的复现线索,说明你进行了有效的排查。复现步骤:复现步骤描述得过于简单,“按照代码运行,点击按钮”。虽然结合代码示例我们可以理解,但更严谨的步骤应该包括:
uni.chooseMedia。建议补充这些细节,以便任何官方人员都能无歧义地复现。
预期结果:预期结果合理,即低版本安卓也能正常调用系统相册。
实际结果:实际结果是“无反应或卡死闪退”,这与提供的错误日志高度吻合,是一个真实存在的问题,并非误报。
分类信息:分类信息非常完整。包含了开发环境、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)上可能出现了兼容性问题,导致它仍尝试使用旧的文件权限模型,从而引发内部异常。知识库依据:
uni.chooseMedia时会崩溃或闪退,且与sourceType参数有关,与你的情况一致。READ_EXTERNAL_STORAGE权限——是非常正确的方向,这也是uni.chooseMedia设计的目标之一。3. 解决方案与替代方案
由于这是一个已知的、与旧系统适配相关的底层问题,修复周期可能较长。针对你当前的需求,我们提供以下几种临时解决方案:
针对低版本系统降级处理(推荐方案):
这是最稳妥的方案。在你的代码中,判断当前 Android 系统版本,如果是 Android 10 以下,则回退使用
uni.chooseImage,并动态申请READ_EXTERNAL_STORAGE权限。这样可以保证全版本兼容。使用插件市场的增强选择器:
插件市场有专门为解决此类权限问题而设计的插件,可以更优雅地处理跨版本的相册选择。
Android Photo Picker 免媒体权限相册选择器 这个插件专为减少媒体权限申请风险而设计,内部处理了高低版本 Android 的适配,或许能解决你的问题。
申请
MANAGE_EXTERNAL_STORAGE权限(不推荐):正如错误日志所提示的,你可以申请
android.permission.MANAGE_EXTERNAL_STORAGE权限。但我们强烈不推荐这么做,因为这是“所有文件访问权限”,Google Play 对此权限的审核极其严格,非文件管理器类应用很难通过,且与你想规避权限审核的初衷背道而驰。总结:感谢你提供如此详细的反馈。这是一个已知的、与低版本系统作用域存储适配相关的 Bug。建议你优先采用方案1,根据系统版本动态切换 API 来临时解决,这样既能保证新系统的合规性,又能兼容旧设备。这个问题我们也会继续跟进。
要回复问题请先登录或注册
公告
更多>相关问题