今日快讯
三星于上周四在韩国正式开启了新机皇Galaxy Note 8的预定工作,截至周五,韩国本土的预定量已经达到了39.5万台,看起来好像只是比去年Galaxy Note 7多了区区1.5万台,但Galaxy Note 8只用了不到一天的时间就完成了Galaxy Note 7在整个18天预售期间的成绩,这速度着实有点吓人啊!
作者简介
又到了周一,大家好!新的一周动起来!
本篇来自jokermonn的投稿,分享了 Android 权限开发的相关内容,希望大家喜欢!
jokermonn的博客地址:
前言
permissions4m最初的设计是仅仅做成一个编译器注解框架,在1.0.0版本时,它纯粹地实现了原生 Android 请求流程,关于它的设计思路可以查看这篇如何打造一个 Android 编译时注解框架。地址为:
但是当投入笔者自己项目中使用的时候,笔者发现国产手机有许多适配缺陷,例如:
相信做过权限适配的小伙伴们都知道适配国产 Android 机的权限会有多少坑,而国内也并没有任何权限申请框架解决这些问题,于是笔者在 1.0.2 版本中增强了权限申请功能的适配,现在对于这三个问题permissions4m都有良好的解决:
情景再现
Boss: “mmp,为什么展示联系人这块在小米手机显示不出来?”
Programmer: “boss,其他手机都没问题,我这块做了权限申请的,但是小米就是不弹出权限申请对话框,与此同时小米默认授权失败,所以不能读取通讯录。”
Boss: “mmp,那这块呢,明明说了读取日历权限成功了,为什么还是没读取到?”
Programmer: “boss,其他手机都没问题,我这块做了权限申请的,但是小米就是不弹出权限申请对话框,与此同时小米默认授权成功,但是实际上是授权失败的。”
Boss: “mmp,那这块呢,明明我拒绝授予权限,为什么你提示我授权成功?”
Programmer: “boss,其他手机都没问题,我这块做了权限申请的,小米弹出权限申请对话框,与此同时你点了拒绝,但是小米做了手脚,实际上调用了授权成功的方法。”
Boss: “你有个毛用?测试机我都给你买好了,还这么菜,收拾收拾滚蛋吧。”
Programmer: “f**k 小米!”
原生 Android 请求方式在小米等国内机型上适配的情形,相信有部分读者已经有过经历,这里就不做原生测试了,拿出国内一个比较有名的权限申请框架我们来看看:
小米申请地理位置:
小米申请联系人:
小米申请手机状态:
其实不仅仅是小米,国内其它手机也会有一样的问题,笔者再做了一份 oppo a57 的截图:
可以看到,在申请过程中并没有任何弹窗弹出,并且提示授权成功,而实际上我们到权限管理界面可以看到并未得到权限。
下图是使用permissions4m的效果:
permissions4m 申请地理位置(小米):
permissions4m 申请联系人(小米):
permissions4m 申请手机状态(小米):
permissions4m 申请短信、日历(OPPO A57)
我们可以看到弹出了权限申请对话框,而且授予权限的情况下确实获得了权限。
生活中,无论是作为开发者还是普通用户,应该都有接触到过 5.0+ 的小米/魅族手机,使用过这些手机的读者们应该还有些许印象——部分国产手机早在 android 6.0 之前,也就是在 google 推出动态权限之前就有了权限申请,而国产的 5.0 权限申请使用 6.0 的权限申请代码是行不通的,理由很简单——在5.0的系统源码里没有6.0权限申请的源码,这个问题在permissions4m2.0.0版本中已经迎刃而解了,这意味着从2.0.0版本开始,permissions4m开始支持国产手机 5.0 权限申请了。
permissions4m 简介
简介中只是节选了部分内容,更详细完整的请移至项目:
注:截止笔者发布博客为止,permissions4m最新版本为2.0.0
引入依赖
Gradle 依赖
project中的build.gradle:
app中的build.gradle:
注解回调
在需要权限申请的地方调用
如:
然后将会回调相应的@PermissionsGranted、@PermissionsDenied、@PermissionsRationale/PermissionsCustomRationale、@PermissionsNonRationale所修饰的方法
@PermissionsGranted
授权成功时回调,注解中需要传入参数,分为两种情况:
@PermissionsDenied
授权失败时回调,注解中需要传入参数,分为两种情况:
@PermissionsRationale
二次授权时回调,用于解释为何需要此权限,注解中需要传入参数,分为两种情况:
注:系统弹出权限申请 dialog 与 toast 提示是异步操作,所以如果存在希望自行弹出一个 dialog 后(或其他同步需求)再弹出系统对话框,那么请使用@PermissionsCustomRationale
@PermissionsCustomRationale
二次授权时回调,用于解释为何需要此权限,注解中需要传入参数,分为两种情况:
注:除上述以外的 dialog,开发者可以自定义其他展示效果,调用权限申请时请使用,否则会陷入无限调用自定义 Rationale 循环中:
@PermissionsNotRationale
用户太傻逼,拒绝权限且不再提示(国产畸形权限适配扩展)情况下调用,此时意味着无论是@PermissionsCustomRationale或者@PermissionsRationale都不会被调用,无法给予用户提示,此时该注解修饰的函数被调用,注解中需要传入参数,分为两种情况:
Intent 类型为两种,一种是跳转至系统设置页面,另一种是跳至手机管家页面,而具体的设置方法请参考注解回调中.requestPageType(int)设置方法。
Listener 回调
例:
同步申请
使用Permissions4M.get(MainActivity.this).requestSync();进行同步权限申请
例:参考 sample 中MainActivity上的设置 ——
后记
permissions4m 的目标是适配尽可能多的国产机型,包括但不限于小米、魅族、OPPO、VIVO、华为等机型,不仅是6.0+版本,后期也会支持到小米、魅族等低版本也有权限申请的手机。但是由于笔者个人能力有限,所以希望尽可能多的开发者参与到此项目的开发当中,更多详情请移至permissions4m。
限 时 特 惠: 本站每日持续更新海量各大内部创业教程,一年会员只需98元,全站资源免费下载 点击查看详情
站 长 微 信: lzxmw777