uni-app UTSAndroid.requestSystemPermission申请“android.permission.READ_EXTERNAL_STORAGE”时没弹窗,申请其他权限都正常

发布于 1周前 作者 yibo5220 来自 Uni-App

uni-app UTSAndroid.requestSystemPermission申请“android.permission.READ_EXTERNAL_STORAGE”时没弹窗,申请其他权限都正常

4 回复

这个指的是API 33以上不能用READ_EXTERNAL_STORAGE,但我本地环境主工程SDK是 compileSdkVersion 31,uts插件模块也是 compileSdkVersion 31,真机安卓10,测试了UTSAndroid.requestSystemPermission申请“android.permission.READ_EXTERNAL_STORAGE”都没弹窗

https://doc.dcloud.net.cn/uni-app-x/uts/utsandroid.html#requestsystempermission
shallUnCheck 配置成 true 测试可以解决这个问题。
本质上是因为 UTSAndroid.requestSystemPermission 所依赖的 XXPermission 框架对过时的权限存在严格校验,配置此参数可以避免校验过时的权限。

针对您提到的在uni-app中使用UTSAndroid.requestSystemPermission申请android.permission.READ_EXTERNAL_STORAGE权限时没有弹窗的问题,这通常与Android系统的权限管理策略有关,特别是从Android 6.0(API级别23)开始,对于敏感权限,需要在运行时请求,并且用户需要明确授予权限。以下是一些可能的原因和相应的代码案例,帮助您排查和解决问题。

可能原因

  1. Android版本和目标SDK版本:如果您的应用目标SDK版本高于Android 10(API级别29),则READ_EXTERNAL_STORAGE权限已被废弃,并被MANAGE_EXTERNAL_STORAGEScoped Storage(分区存储)机制取代。

  2. 权限已在manifest中声明但未正确请求:虽然权限在AndroidManifest.xml中声明了,但运行时请求代码可能存在问题。

  3. 系统权限弹窗被系统策略阻止:某些设备或定制ROM可能修改了权限请求的行为。

解决方案代码示例

首先,确保在AndroidManifest.xml中声明权限(对于Android 9及以下版本):

<manifest ...>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    ...
</manifest>

然后,在uni-app中使用以下代码请求权限(注意,这里使用的是uni-app的API封装,具体实现可能需要根据uni-app的版本调整):

// 检查并请求权限
function requestReadStoragePermission() {
    #ifdef APP-PLUS
    plus.android.requestPermissions(['android.permission.READ_EXTERNAL_STORAGE'], function(event) {
        if (event.deniedAlways.length > 0 || event.denied.length > 0) {
            console.error('权限申请被拒绝');
        } else {
            console.log('权限申请成功');
        }
    });
    #endif
}

// 调用函数请求权限
requestReadStoragePermission();

注意事项

  • 如果您的应用目标SDK版本是Android 10及以上,应考虑使用Scoped Storage或请求MANAGE_EXTERNAL_STORAGE(对于特定用例,且需用户授予特殊应用访问权限)。
  • 确保您的uni-app和HBuilderX开发环境为最新版本,以利用最新的API和修复。
  • 在真实设备上进行测试,因为模拟器可能不完全反映真实设备的行为。

如果以上方法仍无法解决问题,建议检查设备的系统日志,以获取更多关于权限请求失败的信息。同时,考虑用户隐私和数据安全,合理使用权限请求。

回到顶部