在使用uni-app安卓16系统下无法获取系统弹窗问题

在使用uni-app安卓16系统下无法获取系统弹窗问题

开发环境 版本号 项目创建方式
Mac 14.3 HBuilderX
产品分类:uniapp/App

PC开发环境操作系统:Mac

HBuilderX类型:正式

HBuilderX版本号:4.87

手机系统:Android

手机系统版本号:Android 16

手机厂商:小米

手机机型:所有安卓16版本机型

页面类型:vue

vue版本:vue3

打包方式:云端

操作步骤:

使用plus.android.requestPermissions
const appAuthorizeSetting = uni.getAppAuthorizeSetting()
console.log(appAuthorizeSetting.albumAuthorized,“相册”) //这个输出的相册为。undefined


预期结果:



可以正常弹出弹窗
实际结果:

无法正常弹出弹窗. 仅在安卓16机型下


bug描述:



plus.android.requestPermissions 在所有安卓16下无法弹出系统弹窗导致无法授权

更多关于在使用uni-app安卓16系统下无法获取系统弹窗问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

该bug反馈内容基本完整但存在关键缺失:标题和描述清晰指出了Android 16(即Android 13)下plus.android.requestPermissions无法弹出系统权限弹窗的问题,分类信息详尽(包含HBuilderX 4.87、Android 16、小米机型等关键信息),但代码示例不完整——仅展示了权限状态查询(uni.getAppAuthorizeSetting),缺少核心的权限请求调用代码(plus.android.requestPermissions的具体实现),导致无法直接复现问题。复现步骤过于简略,未说明具体请求的权限类型和调用参数,且实际结果描述模糊("无法弹出"需明确是完全无反应还是静默失败)。
经核查知识库,Android 13对权限系统有重大变更(如细粒度照片权限),且小米等厂商定制ROM常存在权限弹窗拦截机制。知识库明确提示:部分Android ROM(如小米)需手动开启USB安装权限,并强调HBuilderX 3.2.15+版本需正确配置隐私弹窗才能通过应用商店审核。当前HBuilderX 4.87虽较新,但若未按规范配置androidPrivacy.json,可能导致权限流程异常。
建议用户:1) 补充完整权限请求代码示例;2) 确认是否按隐私政策配置指南设置template模式弹窗;3) 检查小米系统设置中"应用权限管理"是否禁用了弹窗显示;4) 升级至HBuilderX最新正式版验证问题。非uni-app-x项目(使用plus API)需特别注意Android厂商定制系统的兼容性问题。 内容为 AI 生成,仅供参考

更多关于在使用uni-app安卓16系统下无法获取系统弹窗问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html


plus.android.requestPermissions([‘android.permission.READ_EXTERNAL_STORAGE’], (e) => { //关闭 if (e.granted.length>0){ uni.showLoading({ title: t(‘chat.is_saving’) }); uni.saveImageToPhotosAlbum({ filePath: src, success: (res) => { data.showTips = false uni.hideLoading(); data.iserr = false uTips.value.show({ title: t(‘mine.save_success’), type: ‘success’, duration: ‘2300’ }) }, fail: (err)=> {
data.showTips = false
uni.hideLoading();
data.iserr = true
uTips.value.show({
title: t(‘mine.save_fail’),
type: ‘error’,
duration: ‘2300’
})
}
});
} 此段代码在 Android 15版本下可以 正常弹出。相册授权弹窗,在andorid16下均无法弹出,不清楚您说的 静默或者是完全无反应的区别是什么。在Android 15下可以正确弹出 附件中 授权弹窗Android16下无法弹出

READ_EXTERNAL_STORAGE 从Android 13开始已经废弃,官方也不再建议使用。如果需要访问照片可以使用READ_MEDIA_IMAGES和READ_MEDIA_VIDEO,具体参考文档:https://developer.android.com/reference/android/Manifest.permission#READ_EXTERNAL_STORAGE

问题分析:

根据您的描述,问题出现在 Android 16(即 Android 14)系统上,plus.android.requestPermissions 无法触发系统权限弹窗,且 uni.getAppAuthorizeSetting() 返回的 albumAuthorizedundefined。这通常与 Android 14 引入的细粒度媒体权限变更有关。

原因:

从 Android 13(API 33)开始,Google 引入了 READ_MEDIA_IMAGESREAD_MEDIA_VIDEOREAD_MEDIA_AUDIO 等细分权限来替代传统的 READ_EXTERNAL_STORAGE。到 Android 14(API 34),这一变更成为强制要求。如果您的应用 targetSdkVersion 设置为 33 或更高,且未适配新的权限模型,在请求存储/媒体权限时就会出现异常。

解决方案:

  1. 检查并更新 manifest.json 中的权限声明: 确保在 manifest.jsonApp权限配置 中,使用的是新的媒体权限,而非旧的存储权限。例如,访问相册应使用:

    {
      "permissions": [
        "android.permission.READ_MEDIA_IMAGES",
        "android.permission.READ_MEDIA_VIDEO"
      ]
    }
    
  2. 检查云端打包的 targetSdkVersion: 在 HBuilderX 中,打开项目的 manifest.json,切换到“源码视图”,检查 app-plus -> distribute -> android 下的 targetSdkVersion。如果低于 33,建议逐步升级至 33 或 34,并同步完成权限适配。

  3. 使用统一的权限 API: 建议优先使用 uni-app 统一的权限 API uni.authorizeuni.getSetting 来替代 plus.android.requestPermissions,以保持跨平台一致性。例如:

    // 请求相册权限(在Android 14+上会自动映射为 READ_MEDIA_IMAGES)
    uni.authorize({
      scope: 'scope.album',
      success() {
        console.log('授权成功');
      },
      fail(err) {
        console.log('授权失败', err);
      }
    });
    
  4. 动态处理 Android 版本差异: 如果仍需使用 plus.android.requestPermissions,建议根据系统版本动态请求对应的权限字符串:

    const systemInfo = uni.getSystemInfoSync();
    const androidVersion = parseFloat(systemInfo.system);
    let permissions = [];
    
    if (androidVersion >= 14) {
      // Android 14+
      permissions = ["android.permission.READ_MEDIA_IMAGES"];
    } else if (androidVersion >= 13) {
      // Android 13
      permissions = ["android.permission.READ_MEDIA_IMAGES"];
    } else {
      // Android 13以下
      permissions = ["android.permission.READ_EXTERNAL_STORAGE"];
    }
    
    plus.android.requestPermissions(permissions, function(result) {
      console.log('权限请求结果', result);
    }, function(error) {
      console.error('权限请求失败', error);
    });
回到顶部