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

读写手机存储权限

应用需要保存运行状态等数据到手机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": "应用保存运行状态等信息,需要获取读写手机存储(系统提示为访问设备上的照片、媒体内容和文件)权限,请允许。"
}
  • equest
    字符串类型,必填,申请设备信息权限策略,可取值none、once、always。默认值为always。
  • prompt
    字符串类型,可选,用户拒绝时弹出提示框上的内容。
    默认值为:应用保存运行状态等信息,需要获取读写手机存储(系统提示为访问设备上的照片、媒体内容和文件)权限,请允许。
    国际化配置参考:https://ask.dcloud.net.cn/article/35860#strings
    设置自定义键名称为“dcloud_permission_write_external_storage_message”。

保存后提交云端打包生效

访问设备信息权限

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

华为手机应用的设置中权限列表中为“电话”权限

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

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

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

默认策略为once,即应用第一次启动时申请

源码视图配置

打开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
      字符串类型,可选,用户拒绝时弹出提示框上的内容。
      默认值为:为保证您正常、安全地使用,需要获取设备识别码(部分手机提示为获取手机号码)使用权限,请允许。
      国际化配置参考:https://ask.dcloud.net.cn/article/35860#strings
      设置自定义键名称为“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>

alue可取值为 none、once、always。

补充

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

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

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

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

转载于https://ask.dcloud.net.cn/article/36549

uni-app开发经验分享十二: Android平台应用启动时读写手机存储、访问设备信息(如IMEI)等权限策略及提示信息的更多相关文章

  1. Android应用程序启动时发生AndroidRuntime : ClassNotFoundException for Activity class的解决方法

    在android应用程序启动时抛出下面异常导致启动失败:07-09 17:12:35.709: ERROR/AndroidRuntime(3866): Uncaught handler: thread ...

  2. uni-app开发经验分享十六:发布android版App的详细过程

    开发环境 1. Android Studio下载地址:Android Studio官网 OR Android Studio中文社区 2. HBuilderX(开发工具) 3. App离线SDK下载:最 ...

  3. 分享十二个有用的jQuery代码

    分享7个有用的jQuery代码 这篇文章主要介绍了7个有用的jQuery技巧分享,本文给出了在新窗口打开链接.设置等高的列.jQuery预加载图像.禁用鼠标右键.设定计时器等实用代码片段,需要的朋友可 ...

  4. uni-app开发经验分享十五: uni-app 蓝牙打印功能

    最近在做uni-app项目时,遇到了需要蓝牙打印文件的功能需要制作,在网上找到了一个教程,这里分享给大家. 引入tsc.js 简单得引入到自己所需要得页面中去,本次我们只要到了标签模式,他同时还有账单 ...

  5. Android应用第一次启动时的欢迎界面制作

    原理是这样,我们在SharedPreferences中存储一个int型数据,用来代表第几次登录,每次启动时都读取出来判断是不是第一次启动,然后依次判断是否要显示欢迎界面, 具体实现如下: 设置一个欢迎 ...

  6. Android核心分析之二十二Android应用框架之Activity

    3 Activity设计框架 3.1 外特性空间的Activity    我们先来看看,android应用开发人员接触的外特性空间中的Activity,对于AMS来讲,这个Activity就是客服端的 ...

  7. uni-app开发经验分享十八:对接第三方h5

    1.uni-app中对接第三方为了防止跳出app使用了webview <template> <view> <web-view :src="url" @ ...

  8. uni-app开发经验分享十: 封装request请求

    http.js //封装requset,uploadFile和downloadFile请求,新增get和post请求方法 let http = { 'setBaseUrl': (url) => ...

  9. Android 核心分析之十二Android GEWS窗口管理之基本架构原理

    Android GWES之窗口管理之基本构架原理 Android的窗口管理是C/S模式的.Android中的Window是表示Top Level等顶级窗口的概念.DecorView是Window的To ...

随机推荐

  1. iframe高度自动随着子页面的高度变化而变化(不止要在iframe标签里加上this.height=this.contentWindow.document.body.scrollHeight)

    最近使用iframe整合页面遇到一些难题,走了很多弯路才解决,借此记录一下: 1 <!-- 页面主体内容 --> 2 <div class="iframe-wrapper& ...

  2. Autofac官方文档翻译--一、注册组件--2传递注册参数

    官方文档:http://docs.autofac.org/en/latest/register/parameters.html 二.Autofac 传递注册参数 当你注册组件时能够提供一组参数,可以在 ...

  3. BF,BM,KMP,就这?

    为保证代码严谨性,文中所有代码均在 leetcode 刷题网站 AC ,大家可以放心食用. 皇上生辰之际,举国同庆,袁记菜馆作为天下第一饭店,所以被选为这次庆典的菜品供应方,这次庆典对于袁记菜馆是一项 ...

  4. Nacos(一)源码分析Nacos注册示例流程

    nacos官方地址:https://nacos.io/zh-cn/ 大家可以看一下nacos的中文手册以及官方源码,博主就不带领大家快速入门 了,官方文档中都有而且非常标准,比其他博客写的好多了并且还 ...

  5. Java通过IO流输出文件目录

    //通过IO流输出文件目录,不同级的目录之间用*间隔 1 package com.fjnu.io; 2 3 import java.io.File; 4 5 public class dicOut { ...

  6. spring-quartz整合

    摘要 spring ,springboot整合quartz-2.3.2,实现spring管理jobBean 本文不涉及 JDBC存储的方式,springboot yml配置也没有 可自行百度 谷歌 本 ...

  7. Loki 初体验

    Loki 是什么 Loki 是 Grafana Lab开发的一套日志系统,使用Go语言实现.根据官方的介绍, Loki,高可用性,多租户的日志聚合系统,受到Prometheus的启发.它的设计非常经济 ...

  8. CentOS7离线安装mysql5.6

    下载mysql5.6,系统选择redhat,版本选择RHEL7,下载RPM Bundle后得到一个tar文件.这里得到文件MySQL-5.6.44-1.el7.x86_64.rpm-bundle.ta ...

  9. 干掉 powerdesigner,设计数据库表用它就够了

    最近有个新项目刚过完需求,正式进入数据库表结构设计阶段,公司规定统一用数据建模工具 PowerDesigner.但我并不是太爱用这个工具,因为它的功能实在是太多了,显得很臃肿,而平时设计表用的也就那么 ...

  10. Kafka 消费组消费者分配策略

    body { margin: 0 auto; font: 13px / 1 Helvetica, Arial, sans-serif; color: rgba(68, 68, 68, 1); padd ...