uni-app Android平台应用启动时读写手机存储、访问设备信息(如IMEI)等权限策略及提示信息

uni-app Android平台应用启动时读写手机存储、访问设备信息(如IMEI)等权限策略及提示信息

说明

Android平台从6.0(API23)开始系统对权限的管理更加严格,所有涉及敏感权限都需要用户授权允许才能获取。 因此一些应用基础业务逻辑需要的权限会在应用启动时申请,并引导用户允许。

读写手机存储权限

HBuilderX3.5.5+版本调整申请读写手机存储权限策略默认值为 none

应用需要保存运行状态等数据到手机SD卡中,启动时需要获取读写手机存储权限,此权限为基础权限,影响真机运行、wgt升级。

  • 注意:此权限目标不是要访问相册,是Android把相册写入权限和存储写入权限合并在一个权限里了。
  • 注意:wgt热更新是应用市场不乐见的,不建议明显提示给用户或告知应用市场。

申请读写手机存储需要用户授权,会弹出如下提示框:

读写手机存储权限提示框

  • HBuilderX2.4.2及以下版本,用户拒绝此权限则直接退出应用。
  • HBuilderX2.4.3+版本,用户拒绝后键会弹出以下提示框引导用户重新允许

HBuilderX2.4.3+版本提示框

点击“取消”退出应用; 点击“确定”重新弹出授权框,如果用户已经勾选“不再询问”则打开应用的设置界面。 此提示语可在manifest.json中配置

HBuilderX2.5.0+开始支持配置应用启动时申请获取手机存储权限,支持以下三种策略

  • none
    • 应用启动时不申请
  • once
    • 应用第一次启动时申请,用户可以拒绝
  • always
    • 应用每次启动都申请,并且用户必须允许,用户拒绝时会弹出以下提示框引导用户重新允许

源码视图配置

打开manifest.json文件,切换到“源码视图”项

  • uni-app项目
    • 在"app-plus" -> “distribute” -> “android” 节点下添加 permissionExternalStorage 节点
  • 5+ App项目
    • 在 “plus” -> “distribute” -> “google” 节点下添加 permissionExternalStorage 节点

permissionExternalStorage节点数据格式如下:

"permissionExternalStorage": {  
    "request": "always",  
    "prompt": "应用保存运行状态等信息,需要获取读写手机存储(系统提示为访问设备上的照片、媒体内容和文件)权限,请允许。"  
}
  • request
    • 字符串类型,必填,申请读写手机存储权限策略,可取值none、once、always。
      • HBuilderX3.5.5+版本默认值调整为none
      • HBuilderX3.0以下版本默认值always
  • prompt
    • 字符串类型,可选,用户拒绝时弹出提示框上的内容。
      • 默认值为:应用保存运行状态等信息,需要获取读写手机存储(系统提示为访问设备上的照片、媒体内容和文件)权限,请允许。
      • 国际化配置参考:国际化配置
      • 设置自定义键名称为“dcloud_permission_write_external_storage_message”。

保存后提交云端打包生效

访问设备信息权限

Android平台应用获取设备信息(如IMEI、IMSI等),统计、推送、广告等业务功能依赖这些信息。 此权限不是必选,拒绝此权限不影响App端基座运行。但拥有本权限可以给开发者提供更准确的统计报表。 而申请获取这些信息需要用户授权,会弹出如下提示框:

访问设备信息权限提示框

华为手机应用的设置中权限列表中为“电话”权限 部分手机设备对该权限描述为“拨打电话,管理电话权限”

HBuilderX2.3.8+开始支持配置应用启动时申请获取设备信息权限,支持以下三种策略

  • none
    • 应用启动时不申请
  • once
    • 应用第一次启动时申请,用户可以拒绝
  • always
    • 应用每次启动都申请,并且用户必须允许,用户拒绝时会弹出以下提示框引导用户重新允许

always策略提示框

此提示框删的文本可自定义,参考下面的prompt字段

HX3.5.5+版本开始默认策略为none,即应用启动不再主动申请

源码视图配置

打开manifest.json文件,切换到“源码视图”项

  • uni-app项目
    • 在 “app-plus” -> “distribute” -> “android” 节点下添加 permissionPhoneState 节点
  • 5+ App项目
    • 在 “plus” -> “distribute” -> “google” 节点下添加 permissionPhoneState 节点

permissionPhoneState节点数据格式如下:

"permissionPhoneState": {  
    "request": "always",  
    "prompt": "为保证您正常、安全地使用,需要获取设备识别码(部分手机提示为获取手机号码)使用权限,请允许。"  
}
  • request
    • 字符串类型,必填,申请设备信息权限策略,可取值none、once、always。默认值为once。
  • prompt
    • 字符串类型,可选,用户拒绝时弹出提示框上的内容。
      • 默认值为:为保证您正常、安全地使用,需要获取设备识别码(部分手机提示为获取手机号码)使用权限,请允许。
      • 国际化配置参考:国际化配置
      • 设置自定义键名称为“dcloud_permission_read_phone_state_message”。

保存后提交云端打包生效

离线打包提示语配置及弹窗配置。

提示语配置

在主项目的strings.xml中添加如下字段。strings.xml位于 项目目录/src/main/res/values下,如果文件或文件夹不存在,直接新建即可。

  • 存储权限提示语配置
<resources>  
    <string name="dcloud_permission_write_external_storage_message">存储权限提示语</string>  
</resources>
  • 读取手机状态权限配置
<resources>  
    <string name="dcloud_permission_read_phone_state_message">读取手机状态权限提示语</string>  
</resources>

弹窗配置

在androidManifest.xml的application节点下添加如下字段。

  • 存储权限弹窗配置
<application>  
<meta-data android:name="DCLOUD_WRITE_EXTERNAL_STORAGE" android:value="once"/>  
</application>

value可取值为 none、once、always。

  • 读取手机状态弹窗配置
<application>  
<meta-data android:name="DCLOUD_READ_PHONE_STATE" android:value="once"/>  
</application>

value可取值为 none、once、always。

补充

沟通发现,部分开发者在main.js里面调用了plus.device.getInfo这类方法。

但是其实API操作与permissionExternalStorage设置无关,permissionExternalStorage用于设置应用内部逻辑是否申请访问SD卡权限

开发者是因为在启动的时候调用API触发了权限申请,误以为permissionExternalStorage设置无效(其实设置是生效的)。

其它API操作会根据功能需求来申请权限,比如操作系统相册也会申请访问SDK卡权限、定位操作会申请定位权限等。

Android平台隐私与政策提示框配置方法

开发环境 版本号 项目创建方式
HBuilderX 3.5.5+ 支持配置应用启动时申请获取手机存储权限,支持三种策略:none、once、always
HBuilderX 2.4.2及以下 用户拒绝此权限则直接退出应用
HBuilderX 2.4.3+ 用户拒绝后键会弹出提示框引导用户重新允许
HBuilderX 2.5.0+ 支持配置应用启动时申请获取手机存储权限,支持三种策略:none、once、always
HBuilderX 2.3.8+ 支持配置应用启动时申请获取设备信息权限,支持三种策略:none、once、always

更多关于uni-app Android平台应用启动时读写手机存储、访问设备信息(如IMEI)等权限策略及提示信息的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于uni-app Android平台应用启动时读写手机存储、访问设备信息(如IMEI)等权限策略及提示信息的实战教程也可以访问 https://www.itying.com/category-93-b0.html


在uni-app中处理Android平台应用启动时读写手机存储、访问设备信息(如IMEI)等权限策略时,可以通过manifest.json配置文件以及代码动态请求权限来实现。以下是相关代码案例:

1. 配置manifest.json

首先,在manifest.json文件中配置需要的权限。在mp-weixin或其他平台配置下,找到android配置项,添加如下内容:

"android": {
  "permissions": [
    "android.permission.READ_EXTERNAL_STORAGE",
    "android.permission.WRITE_EXTERNAL_STORAGE",
    "android.permission.READ_PHONE_STATE"  // IMEI等设备信息权限
  ]
}

2. 动态请求权限(在代码中)

由于Android 6.0(API 级别 23)及以上版本需要在运行时请求权限,可以使用uni-app提供的API进行动态权限请求。以下是一个示例代码,展示了如何在应用启动时请求这些权限:

// 引入uni-app的权限管理模块
const permissions = require('@dcloudio/uni-permissions');

// 检查并请求权限
function requestPermissions() {
  // 请求读写存储权限
  permissions.request({
    scope: 'scope.writeExternalStorage',
    success: () => {
      console.log('读写存储权限请求成功');
    },
    fail: (err) => {
      console.error('读写存储权限请求失败:', err);
    }
  });

  // 请求访问设备信息权限(注意:IMEI等敏感信息在部分Android版本中可能无法直接获取)
  permissions.request({
    scope: 'scope.userInfo', // 注意:实际获取IMEI等可能需要使用其他scope或API,这里以userInfo为例
    success: () => {
      console.log('访问设备信息权限请求成功');
      // 可以尝试获取设备信息,但注意隐私政策和合规性
    },
    fail: (err) => {
      console.error('访问设备信息权限请求失败:', err);
    }
  });
}

// 在应用启动时调用请求权限函数
export default {
  onLaunch() {
    #ifdef APP-PLUS
      requestPermissions();
    #endif
  }
}

3. 权限提示信息

uni-app的权限请求API会默认弹出系统的权限请求对话框,显示系统自带的权限提示信息。如果需要自定义提示信息,可以在请求权限前通过uni.showModal等UI组件给用户一个自定义的提示,告知用户为什么需要这些权限。

注意事项

  • 获取IMEI等敏感信息需要特别小心,确保符合当地的隐私政策和法律法规。
  • 在Android 10及以上版本中,直接访问IMEI等硬件标识符已被限制,建议使用其他替代方案,如广告ID。
  • 始终确保在请求权限前向用户清晰解释为什么需要这些权限,以提升用户体验和信任度。

以上代码和配置为uni-app在Android平台上处理权限请求提供了基本框架,具体实现可能需要根据实际业务需求进行调整。

回到顶部