请选择 进入手机版 | 继续访问电脑版

APP动态权限及Android平台targetSdkVersion设置

技术博客 2021-11-2 09:52 76人浏览 376人回复
原作者: 常山赵子云 收藏 邀请
摘要

友情提醒:所有看这个帖子的同学,不管你是大牛还是小白,建议花5分钟,仔细从头到尾完整的阅读一遍下面的内容,再动手,否则你可能会多花N个5分钟来排查你遇到的新问题。 --关于Android动态权限和targetSdkVersio ...

友情提醒:所有看这个帖子的同学,不管你是大牛还是小白,建议花5分钟,仔细从头到尾完整的阅读一遍下面的内容,再动手,否则你可能会多花N个5分钟来排查你遇到的新问题。


--关于Android动态权限和targetSdkVersion背景:

       targetSdkVersion:自2018年11月开始,GooglePlay以及国内大部分应用市场要求APP编译目标SDK必须为26及以上,否则不予提交审核;有许多已有APP转到APICloud开发后,因targetSdkVersion降级而导致无法覆盖安装;

       动态权限:Android自系统6.0开始,提供动态权限机制,对于敏感权限(存储,定位,录音,拍照,录像等),需要在APP运行过程中动态向用户申请,这就和IOS系统的权限使用体验保持一致了(IOS一直以来就是动态权限)。

    因此我们统一了Android和IOS两个平台的动态权限操作,提供两个API:hasPermission | requestPermission

    在Android上使用动态权限,要求APP编译的目标SDK(即targetSdkVersion)为23及以上(对应为android6.0及以上系统),22及以下系统会执行缺省处理(手机厂商也可能定制处理),APICloud为满足更普遍的开发需求,默认配置targetSdkVersion为22,即权限走系统缺省处理,如何开启动态权限,需要按照如下说明操作。

--现介绍如何自定义编译targetSdkVersion值以及使用动态动态权限

1、下载附件中的manifest.xml,将其中的targetSdkVersion更新为目标值,例如26;
2、将manifest.xml置于你的/项目代码/res/目录下(widget/res/manifest.xml);
3、将你的app代码中所有涉及到需要动态权限的操作,参照附件中的代码,改造一遍
(例如进行拍照录制视频等需要使用摄像头,以前的缺省处理中不需要申请摄像头权限,而开启动态权限后,必须在进行拍照之前,判断是否有摄像头权限,没有则进行申请,只有用户同意了摄像头权限才能进行接下来拍照的操作);
4、提交代码;
5、云编译界面勾选APP所需的权限;
6、使用升级环境编译APP或自定义loader即可。

--注意:当你设置的targetSdkVersion大于等于23时,即意味着开启了动态权限,如果你的APP带有获取IMEI,定位,录音,拍照,录像等敏感功能时(所有权限见文档),必须使用动态权限机制,先判断是否具有该功能操作权限,再进行操作,如果不具备相应的权限,对应的功能是失效的,也可能导致APP崩溃

为保证动态权限尽可能适配更多厂商的手机以及顺利上线Google Play,targetSdkVersion目前推荐设置为29.

补充:当你设置的targetSdkVersion大于等于23时,如果是编译自定义loader,安装到手机后,需要先在设置中给应用打开存储空间权限。否则,WiFi同步后,loader无法正常加载代码。

:附件中的demo仅仅是作为动态权限相关api的演示和使用指引,并非商用代码,具体使用场景建议多去体验市面上主流app是如何设计权限申请体验后,再结合自己产品的特点写代码实现。




manifest.zip
动态权限完整示范代码.zip
评论
76人参与,376条评论

精彩评论
  • 52yaoer 官方版主 2666Y币
    发表于 2018-8-27 13:06
    支持,,棒棒滴。。。。。
  • 哈哈哈哈 官方版主 2666Y币
    发表于 2018-8-27 13:41
    终于可以解决问题了,赞
  • hanyucq 官方版主 2666Y币
    发表于 2018-8-27 19:25
    非常感谢。官方承诺1个月内解决该问题,但自为提出该问题到现在仅20天,即解决了。
    再次感谢
  • tanjingwaini 官方版主 2666Y币
    发表于 2018-8-28 14:54
  • java_chen 官方版主 2666Y币
    发表于 2018-9-3 16:26
    安卓系统出了个问题,安卓系统下授权应该是granted = ture,,但是在未授权返回也是granted = ture,为啥我吧这个文件引入到项目,还是老样子,完全按照你得方式去执行了...
  • 常山赵子云 官方版主 2666Y币
    发表于 2018-9-3 20:36
    java_chen 发表于 2018-9-3 16:26
    安卓系统出了个问题,安卓系统下授权应该是granted = ture,,但是在未授权返回也是granted = ture,为啥我 ...

    返回ture就是就是有这个权限,其他的不用关心。
  • Jason526 官方版主 2666Y币
    发表于 2018-9-5 15:44
    本帖最后由 Jason526 于 2018-9-5 15:46 编辑

    如果添加这个文件以后,在云编译自定义loader后,无法同步,提示同步成功,但是打开依然空白页面。控制台提示的信息如下:Using unescaped '#' characters in a data URI body is deprecated and will be removed in M68, around July 2018. Please use '%23' instead. See https://www.chromestatus.com/features/5656049583390720 for more details. at JsRuntime : 0
    疑问:是否不支持自定义loader使用?

  • 米枔 官方版主 2666Y币
    发表于 2018-9-6 11:13
    apk包仍然不能用啊   现在应用市场上的是23 我现在包提不上去  怎么解决啊
  • 米枔 官方版主 2666Y币
    发表于 2018-9-6 11:15
    有没有人啊 帮我解决一下问题    这个targetsdk为啥就不能改呢 好麻烦啊
  • 常山赵子云 官方版主 2666Y币
    发表于 2018-9-6 12:54
    米枔 发表于 2018-9-6 11:15
    有没有人啊 帮我解决一下问题    这个targetsdk为啥就不能改呢 好麻烦啊

    说明你改错了,认真点。
  • zhouwei1991 官方版主 2666Y币
    发表于 2018-9-6 17:17
    我的也是云编译可以但是自定义编译不行
  • 常山赵子云 官方版主 2666Y币
    发表于 2018-9-13 15:24
    zhouwei1991 发表于 2018-9-6 17:17
    我的也是云编译可以但是自定义编译不行

    编译自定义loader勾选使用升级环境。
  • still 官方版主 2666Y币
    发表于 2018-9-25 16:23
    这个必须用升级环境编译才生效吗?普通编译可以不?
  • still 官方版主 2666Y币
    发表于 2018-9-27 17:47
    权限改为26,使用升级环境编译之后,项目里openframegroup的时候app就会崩溃,以前时好的,是怎么回事呢?
  • dadiao 官方版主 2666Y币
    发表于 2018-10-1 21:06
    米枔 发表于 2018-9-6 11:13
    apk包仍然不能用啊   现在应用市场上的是23 我现在包提不上去  怎么解决啊

    打包的时候勾选上使用升级环境编译包就可以了
  • dadiao 官方版主 2666Y币
    发表于 2018-10-1 21:08
    米枔 发表于 2018-9-6 11:15
    有没有人啊 帮我解决一下问题    这个targetsdk为啥就不能改呢 好麻烦啊

    manifest的配置和上面教程一样
  • bailaoshi 官方版主 2666Y币
    发表于 2018-10-9 12:46
    哈哈哈哈 发表于 2018-8-27 13:41
    终于可以解决问题了,赞

    你是怎么做发好的,能告诉我一下流程吗,谢谢
  • bailaoshi 官方版主 2666Y币
    发表于 2018-10-9 12:46
    hanyucq 发表于 2018-8-27 19:25
    非常感谢。官方承诺1个月内解决该问题,但自为提出该问题到现在仅20天,即解决了。
    再次感谢 ...

    你好,你是怎么处理好的,能告诉我具体的操作流程吗
  • information_hdz 官方版主 2666Y币
    发表于 2018-10-13 16:53
    我配置这个成功了,权限接口也可以使用。
    不过contacts模块安卓变成无法获取数据了 用的是queryByPage接口
    配置这个之前是可以获取到通讯录的

查看全部评论>>