目录

  • 一、控制缘由
  • 二、说明
  • 三、云端打包配置
  • 1.读写手机存储权限
  • (1)源码视图配置
  • 2.访问设备信息权限
  • (1)源码视图配置
  • 四、离线打包提示语配置及弹窗配置
  • 1.提示语配置
  • 2.弹窗配置
  • 五、问题解决



一、控制缘由

vivo 上架审核不通过,驳回原因如下:

场景7:APP首次打开或运行中,未见使用权限对应的相关功能或服务时,不应提前向用户弹窗申请开启通讯录、定位、短信、录音、相机、日历等权限。

检测结果: 存在问题

改进建议: APP业务功能所需的权限最好在对应业务功能执行时动态申请,在用户未触发相关业务功能时,不提前申请与当前业务功能无关的权限。

设备信息权限 android 手机设备信息权限_android


设备信息权限 android 手机设备信息权限_默认值_02

二、说明

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

三、云端打包配置

1.读写手机存储权限

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

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

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

设备信息权限 android 手机设备信息权限_android_03

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

once
应用第一次启动时申请,用户可以拒绝

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

(1)源码视图配置

打开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.0+版本默认值调整为once
HBuilderX3.0以下版本默认值always

prompt
字符串类型,可选,用户拒绝时弹出提示框上的内容。
默认值为:应用保存运行状态等信息,需要获取读写手机存储(系统提示为访问设备上的照片、媒体内容和文件)权限,请允许。

保存后提交云端打包生效。

2.访问设备信息权限

Android平台应用获取设备信息(如IMEI、IMSI等),统计、推送、广告等业务功能依赖这些信息。

此权限不是必选,拒绝此权限不影响App端基座运行。但拥有本权限可以给开发者提供更准确的统计报表。

而申请获取这些信息需要用户授权,会弹出如下提示框:

设备信息权限 android 手机设备信息权限_提示框_04


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

none
应用启动时不申请

once
应用第一次启动时申请,用户可以拒绝

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

(1)源码视图配置

打开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
字符串类型,可选,用户拒绝时弹出提示框上的内容。
默认值为:为保证您正常、安全地使用,需要获取设备识别码(部分手机提示为获取手机号码)使用权限,请允许。

保存后提交云端打包生效。

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

1.提示语配置

在主项目的 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>

2.弹窗配置

在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。

五、问题解决

在 androidManifest.xml 的application 节点下配置存储权限弹窗值为 none:

<application>  
<meta-data android:name="DCLOUD_WRITE_EXTERNAL_STORAGE" android:value="none"/>  
</application>

配置读取手机状态弹窗值为 none:

<application>  
<meta-data android:name="DCLOUD_READ_PHONE_STATE" android:value="none"/>  
</application>