uni-app开发经验分享十二: Android平台应用启动时读写手机存储、访问设备信息(如IMEI)等权限策略及提示信息
<p>Android平台从6.0(API23)开始系统对权限的管理更加严格,所有涉及敏感权限都需要用户授权允许才能获取。<br>因此一些应用基础业务逻辑需要的权限会在应用启动时申请,并引导用户允许。</p><h2>读写手机存储权限</h2>
<p>应用需要保存运行状态等数据到手机SD卡中,启动时需要获取读写手机存储权限,此权限为基础权限,影响真机运行、wgt升级。</p>
<ul>
<li>注意:此权限目标不是要访问相册,是Android把相册写入权限和存储写入权限合并在一个权限里了。</li>
<li>注意:wgt热更新是应用市场不乐见的,不建议明显提示给用户或告知应用市场。</li>
</ul>
<p>申请读写手机存储需要用户授权,会弹出如下提示框:</p>
<p><img src="https://img2020.cnblogs.com/blog/2149129/202012/2149129-20201207195209010-178057224.png" alt="" loading="lazy"></p>
<ul>
<li>HBuilderX2.4.2及以下版本,用户拒绝此权限则直接退出应用。</li>
<li>HBuilderX2.4.3+版本,用户拒绝后键会弹出以下提示框引导用户重新允许</li>
</ul>
<p> <img src="https://img2020.cnblogs.com/blog/2149129/202012/2149129-20201207195231451-398368810.png" alt="" loading="lazy"></p>
<ul>
<ul>
<li>点击“取消”退出应用;<br>点击“确定”重新弹出授权框,如果用户已经勾选“不再询问”则打开应用的设置界面。<br>此提示语可在manifest.json中配置</li>
<li>HBuilderX2.5.0+开始支持配置应用启动时申请获取手机存储权限,支持以下三种策略
<ul>
<li>none<br>应用启动时不申请</li>
<li>once<br>应用第一次启动时申请,用户可以拒绝</li>
<li>always<br>应用每次启动都申请,并且用户必须允许,用户拒绝时会弹出以下提示框引导用户重新允许</li>
</ul>
</li>
</ul>
</ul>
<h3>源码视图配置</h3>
<p>打开manifest.json文件,切换到“源码视图”项</p>
<ul>
<li>uni-app项目<br>在"app-plus" -> "distribute" -> "android" 节点下添加 permissionExternalStorage 节点</li>
<li>5+ App项目<br>在 "plus" -> "distribute" -> "google" 节点下添加 permissionExternalStorage 节点</li>
</ul>
<p>permissionExternalStorage节点数据格式如下:</p>
<div class="cnblogs_Highlighter">
<pre class="brush:css;gutter:true;"> "permissionExternalStorage": {
"request": "always",
"prompt": "应用保存运行状态等信息,需要获取读写手机存储(系统提示为访问设备上的照片、媒体内容和文件)权限,请允许。"
}</pre>
</div>
<ul>
<li>equest<br>字符串类型,必填,申请设备信息权限策略,可取值none、once、always。默认值为always。</li>
<li>prompt<br>字符串类型,可选,用户拒绝时弹出提示框上的内容。<br>默认值为:应用保存运行状态等信息,需要获取读写手机存储(系统提示为访问设备上的照片、媒体内容和文件)权限,请允许。<br>国际化配置参考:https://ask.dcloud.net.cn/article/35860#strings<br>设置自定义键名称为“dcloud_permission_write_external_storage_message”。</li>
</ul>
<p>保存后提交云端打包生效</p>
<p> </p>
<h2>访问设备信息权限</h2>
<p>Android平台应用获取设备信息(如IMEI、IMSI等),统计、推送、广告等业务功能依赖这些信息。<br>此权限不是必选,拒绝此权限不影响App端基座运行。但拥有本权限可以给开发者提供更准确的统计报表。<br>而申请获取这些信息需要用户授权,会弹出如下提示框:</p>
<p><img src="https://img2020.cnblogs.com/blog/2149129/202012/2149129-20201207195331790-525914435.png" alt="" loading="lazy"></p>
<p> </p>
<p> 华为手机应用的设置中权限列表中为“电话”权限</p>
<p> </p>
<p>HBuilderX2.3.8+开始支持配置应用启动时申请获取设备信息权限,支持以下三种策略</p>
<ul>
<ul>
<li>none<br>应用启动时不申请</li>
<li>once<br>应用第一次启动时申请,用户可以拒绝</li>
<li>always<br>应用每次启动都申请,并且用户必须允许,用户拒绝时会弹出以下提示框引导用户重新允许</li>
</ul>
</ul>
<p><img src="https://img2020.cnblogs.com/blog/2149129/202012/2149129-20201207195355359-637996561.png" alt="" loading="lazy"></p>
<p> </p>
<ul>
<li>此提示框删的文本可自定义,参考下面的prompt字段</li>
</ul>
<p>默认策略为once,即应用第一次启动时申请</p>
<h3>源码视图配置</h3>
<p>打开manifest.json文件,切换到“源码视图”项</p>
<ul>
<li>uni-app项目<br>在 "app-plus" -> "distribute" -> "android" 节点下添加 permissionPhoneState 节点</li>
<li>5+ App项目<br>在 "plus" -> "distribute" -> "google" 节点下添加 permissionPhoneState 节点</li>
</ul>
<p>permissionPhoneState节点数据格式如下:</p>
<div class="cnblogs_Highlighter">
<pre class="brush:css;gutter:true;"> "permissionPhoneState": {
"request": "always",
"prompt": "为保证您正常、安全地使用,需要获取设备识别码(部分手机提示为获取手机号码)使用权限,请允许。"
}
</pre>
</div>
<ul>
<ul>
<li>request<br>字符串类型,必填,申请设备信息权限策略,可取值none、once、always。默认值为once。</li>
<li>prompt<br>字符串类型,可选,用户拒绝时弹出提示框上的内容。<br>默认值为:为保证您正常、安全地使用,需要获取设备识别码(部分手机提示为获取手机号码)使用权限,请允许。<br>国际化配置参考:https://ask.dcloud.net.cn/article/35860#strings<br>设置自定义键名称为“dcloud_permission_read_phone_state_message”。</li>
</ul>
</ul>
<p>保存后提交云端打包生效</p>
<h2>离线打包提示语配置及弹窗配置。</h2>
<h3>提示语配置</h3>
<p>在主项目的strings.xml中添加如下字段。strings.xml位于 项目目录/src/main/res/values下,如果文件或文件夹不存在,直接新建即可。</p>
<p>存储权限提示语配置</p>
<div class="cnblogs_Highlighter">
<pre class="brush:css;gutter:true;"><resources>
<string name="dcloud_permission_write_external_storage_message">存储权限提示语</string>
</resources>
</pre>
</div>
<p>读取手机状态权限配置</p>
<div class="cnblogs_Highlighter">
<pre class="brush:css;gutter:true;"><resources>
<string name="dcloud_permission_read_phone_state_message">读取手机状态权限提示语</string>
</resources>
</pre>
</div>
<h3>弹窗配置</h3>
<p>在androidManifest.xml的application节点下添加如下字段。</p>
<p>存储权限弹窗配置</p>
<div class="cnblogs_Highlighter">
<pre class="brush:css;gutter:true;"><application>
<meta-data android:name="DCLOUD_WRITE_EXTERNAL_STORAGE" android:value="once"/>
</application>
</pre>
</div>
<p>value可取值为 none、once、always。</p>
<p>读取手机状态弹窗配置</p>
<div class="cnblogs_Highlighter">
<pre class="brush:css;gutter:true;"><application>
<meta-data android:name="DCLOUD_READ_PHONE_STATE" android:value="once"/>
</application>
</pre>
</div>
<p>alue可取值为 none、once、always。</p>
<h2>补充</h2>
<p>沟通发现,部分开发者在main.js里面调用了plus.device.getInfo这类方法。</p>
<p>但是其实API操作与permissionExternalStorage设置无关,permissionExternalStorage用于设置应用内部逻辑是否申请访问SD卡权限</p>
<p>开发者是因为在启动的时候调用API触发了权限申请,误以为permissionExternalStorage设置无效(其实设置是生效的)。</p>
<p>其它API操作会根据功能需求来申请权限,比如操作系统相册也会申请访问SDK卡权限、定位操作会申请定位权限等。</p>
<p>转载于https://ask.dcloud.net.cn/article/36549</p><br><br>
来源:https://www.cnblogs.com/smileZAZ/p/14099272.html
頁:
[1]