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+版本,用户拒绝后键会弹出以下提示框引导用户重新允许
点击“取消”退出应用; 点击“确定”重新弹出授权框,如果用户已经勾选“不再询问”则打开应用的设置界面。 此提示语可在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
- 字符串类型,必填,申请读写手机存储权限策略,可取值none、once、always。
- prompt
- 字符串类型,可选,用户拒绝时弹出提示框上的内容。
- 默认值为:应用保存运行状态等信息,需要获取读写手机存储(系统提示为访问设备上的照片、媒体内容和文件)权限,请允许。
- 国际化配置参考:国际化配置
- 设置自定义键名称为“dcloud_permission_write_external_storage_message”。
- 字符串类型,可选,用户拒绝时弹出提示框上的内容。
保存后提交云端打包生效
访问设备信息权限
Android平台应用获取设备信息(如IMEI、IMSI等),统计、推送、广告等业务功能依赖这些信息。 此权限不是必选,拒绝此权限不影响App端基座运行。但拥有本权限可以给开发者提供更准确的统计报表。 而申请获取这些信息需要用户授权,会弹出如下提示框:
华为手机应用的设置中权限列表中为“电话”权限 部分手机设备对该权限描述为“拨打电话,管理电话权限”
HBuilderX2.3.8+开始支持配置应用启动时申请获取设备信息权限,支持以下三种策略
- none
- 应用启动时不申请
- once
- 应用第一次启动时申请,用户可以拒绝
- 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卡权限、定位操作会申请定位权限等。
开发环境 | 版本号 | 项目创建方式 |
---|---|---|
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
更多关于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平台上处理权限请求提供了基本框架,具体实现可能需要根据实际业务需求进行调整。