Android块设备应用读写,Android平台应用启动时读写手机存储、访问设备信息(如IMEI)等权限策略及提示信息,解决uniapp上传华为应用市场提示获取手机存储敏感权限,用户不同意时强制退出应...

一、问题背景

最近将app上传至华为应用市场时总是拒绝,其中有一条就是:我们发现您的应用提示获取手机存储敏感权限,用户不同意时强制退出应用,请参考审核指南......, 修改建议:请在用户不统一获取手机存储敏感权限时,应用不能自动退出或关闭。

未通过原因: 1、详细描述:我们发现您应用的隐私政策未以明示同意的方式征得用户同意。请参考《审核指南》第7.5相关审核要求:

https://developer.huawei.com/consumer/cn/doc/50104

­测试步骤:登录界面默认同意《用户协议》和《隐私政策》。

­修改建议:应用的隐私政策需以明示同意的方式征得用户同意(如提供主动勾选按钮或点击“同意”按钮)。2、详细描述:我们发现您的应用在用户不同意获取存储敏感权限时,应用强制退出、无法登录/注册、无法进入。请参考《审核指南》第7.17相关审核要求:

https://developer.huawei.com/consumer/cn/doc/50104

­测试步骤:启动应用后,提示需获取存储等权限,拒绝后直接退出应用

­修改建议:请在用户不同意获取存储敏感权限时,应用不能自动退出或无法进入。

您可以 登录 到华为应用市场管理中心进行下列操作:1、您可以联系客服,咨询和反馈您的需求;2、您可以修改并重新发布您的应用。

就是说在应用市场安装时,一般都会弹出授权,让用户允许授权访问存储权限。如果用户禁止的话,不能退出应用,要仍然可以进入使用应用。

其他应用市场都没这个原因拒绝,只有华为有。所以查资料,网上的博文也是说啥的都有,有好多自己也踩坑了估计不自知。

这篇说的是:在 manifest.json 文件中添加一句话,忽略提示存储弹框问题。

"android": {//避免华为上架问题

"permissionExternalStorage": {"request" : "none","prompt" : "应用保存运行状态等信息,需要获取读写手机存储(系统提示为访问设备上的照片、媒体内容和文件)权限,请允许。"},//此处内容省略

}

注意他这个解决很危险,直接设为了“none”,也就是说完全不弹出授权。这样的话,后期如果app里需要保持图片或者上传图片的时候,因为没有授权访问设备的存储权限,保存图片时会保存不了,上传图片时选择的也全都是空的,选不了。

uniapp云打包后生成apk,第一次启动会申请存储权限,用户点击不同意会退出app,而且这个申请是uniapp基座包做的,和开发者写的代码无关,是uniapp基座运行起来就会申请这个权限。

问题原因:uniapp支持增量更新,想要支持热更新就需要存储权限,但是wgt热更新是应用市场不乐见的。

解决方案:在manifest.json中打开源码视图,在‘distribute’下的“android”节点添加

//应用发布信息

"distribute": {//android打包配置

"android": {"permissionPhoneState": {"request" : "once","prompt" : "为保证您正常、安全地使用,需要获取设备识别码(部分手机提示为获取手机号码)使用权限,请允许。"},"permissionExternalStorage": {"request" : "once","prompt" : "应用保存运行状态等信息,需要获取读写手机存储(系统提示为访问设备上的照片、媒体内容和文件)权限,请允许。"},//省略其他配置

}

}

他这个设置是“once”,也就是第一次安装时会弹出授权让用户选择“允许”或“禁止”,但是这种情况就是用户选择“禁止”,应用不会退出,仍然可以进入自由访问。但是就是会存在与上面一样的问题。

保存之后,云打包生成apk,再次安装启动的时候还是会申请权限,但是拒绝后不会出现,强制退出应用。上传华为应用市场,是可以通过的。

二、解决方案:Android平台应用启动时读写手机存储、访问设备信息(如IMEI)等权限策略及提示信息

Android平台从6.0(API23)开始系统对权限的管理更加严格,所有涉及敏感权限都需要用户授权允许才能获取。

因此一些应用基础业务逻辑需要的权限会在应用启动时申请,并引导用户允许。

1、读写手机存储权限

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

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

注意:此权限目标不是要访问相册,是Android把相册写入权限和存储写入权限合并在一个权限里了。

注意:wgt热更新是应用市场不乐见的,不建议明显提示给用户或告知应用市场。

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

HBuilderX2.4.2及以下版本,用户拒绝此权限则直接退出应用。

HBuilderX2.4.3+版本,用户拒绝后键会弹出以下提示框引导用户重新允许

点击“取消”退出应用;

点击“确定”重新弹出授权框,如果用户已经勾选“不再询问”则打开应用的设置界面。

2、此提示语可在manifest.json中配置

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

(1)none:应用启动时不申请

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

(3)always:应用每次启动都申请,并且用户必须允许,用户拒绝时会弹出如上的提示框引导用户重新允许

3、源码视图配置

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

(1)uni-app项目:在"app-plus" -> "distribute" -> "android" 节点下添加 permissionExternalStorage 节点

(2)5+ App项目:在 "plus" -> "distribute" -> "google" 节点下添加 permissionExternalStorage 节点

permissionExternalStorage节点数据格式如下:

"permissionExternalStorage": {"request": "always","prompt": "应用保存运行状态等信息,需要获取读写手机存储(系统提示为访问设备上的照片、媒体内容和文件)权限,请允许。"}

(2-1)request:字符串类型,必填,申请读写手机存储权限策略,可取值none、once、always。

HBuilderX3.0+版本默认值调整为once;HBuilderX3.0以下版本默认值always。

(2-2)prompt:字符串类型,可选,用户拒绝时弹出提示框上的内容。

默认值为:应用保存运行状态等信息,需要获取读写手机存储(系统提示为访问设备上的照片、媒体内容和文件)权限,请允许。

设置自定义键名称为“dcloud_permission_write_external_storage_message”。

保存后提交云端打包生效

4、访问设备信息权限

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

此权限不是必选,拒绝此权限不影响App端基座运行。但拥有本权限可以给开发者提供更准确的统计报表。而申请获取这些信息需要用户授权,会弹出如下提示框:

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

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

(1)none:应用启动时不申请

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

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

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

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

5、源码视图配置

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

(1)uni-app项目:在 "app-plus" -> "distribute" -> "android" 节点下添加 permissionPhoneState 节点

(2)5+ App项目:在 "plus" -> "distribute" -> "google" 节点下添加 permissionPhoneState 节点

permissionPhoneState节点数据格式如下:

"permissionPhoneState": {"request": "always","prompt": "为保证您正常、安全地使用,需要获取设备识别码(部分手机提示为获取手机号码)使用权限,请允许。"}

request:字符串类型,必填,申请设备信息权限策略,可取值none、once、always。默认值为once。

prompt:字符串类型,可选,用户拒绝时弹出提示框上的内容。

默认值为:为保证您正常、安全地使用,需要获取设备识别码(部分手机提示为获取手机号码)使用权限,请允许。

设置自定义键名称为“dcloud_permission_read_phone_state_message”。

保存后提交云端打包生效

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

1、提示语配置:

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

(1)存储权限提示语配置

存储权限提示语

(2)读取手机状态权限配置

读取手机状态权限提示语

2、弹窗配置:

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

(1)存储权限弹窗配置

value可取值为 none、once、always。

(2)读取手机状态弹窗配置

value可取值为 none、once、always。

补充:部分开发者在main.js里面调用了plus.device.getInfo这类方法。但是其实API操作与permissionExternalStorage设置无关,permissionExternalStorage用于设置应用内部逻辑是否申请访问SD卡权限。

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

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

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您提供一些思路供您参考。首先,我们需要定义一个抽象类或接口来表示移动存储设备,比如: ```java public interface StorageDevice { void read(); // 读取数据 void write(); // 写入数据 } ``` 然后,我们可以定义具体的移动存储设备类,比如: ```java public class USBFlashDrive implements StorageDevice { @Override public void read() { System.out.println("从U盘中读取数据"); } @Override public void write() { System.out.println("向U盘中写入数据"); } } public class MemoryCard implements StorageDevice { @Override public void read() { System.out.println("从手机卡中读取数据"); } @Override public void write() { System.out.println("向手机卡中写入数据"); } } // 其他存储设备类的定义... ``` 接下来,我们可以编写一个测试类来测试这些移动存储设备读写功能,如下所示: ```java public class StorageDeviceTest { public static void main(String[] args) { StorageDevice usb = new USBFlashDrive(); StorageDevice card = new MemoryCard(); // 创建其他存储设备对象... usb.read(); // 从U盘中读取数据 usb.write(); // 向U盘中写入数据 card.read(); // 从手机卡中读取数据 card.write(); // 向手机卡中写入数据 // 测试其他存储设备读写功能... } } ``` 这样,我们就可以通过调用不同存储设备对象的 read() 和 write() 方法来模拟计算机对移动存储设备读写操作了。当然,实际应用中可能还需要考虑异常处理、数据存储格式等问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值