Android 6.0 运行时权限实践要点

Android在6.0之后添加了新的权限管理模型,每个应用必须在原油的Manifest.xml声明的基础上增加运行时的权限申请才能进行相关API的调用,这对终端用户的隐私保护是一大利好,浏览一下国内的很多应用,一个很简单的APP也会申请Contact、Location、ID、SMS、 *History等权限。自从6.0之后App安装完成未启动前你就可以去应用设置中关闭没必要的权限。当然国内的很多定制ROM比如MIUI、EMUI等在之前android版本中已经定制了相关模型,但这一次是从API级别上标准化了这一设置,所有支持后续版本的APP都必须实现这一原则。

相关运行时权限申请开发过程,可通过Android官方网站浏览。更多Android权限相关

这里只说明了几个开发要点:

  • 1、当前流行的运行时权限申请流程有两种:

a)在App启动时强制检测所有预申请权限,有一项必须权限用户没有授权则弹出对话框提示到应用设置页面进行授权打开。

b)在App运行时需要某一项或者多项权限时临时授权,然后继续下一项操作

当前国内应用大多采用a)方法,微信、支付宝采用此方法,可能导致后面一票儿的App采用这种方式,而且有些非必要权限一旦拒绝授权,应用立刻退出,体验相当暴力。Google系、国外其他App大多采用b)方法,非必要情况下不会预先申请授权。

采用a)简单直接但是用户体验相当冲突,尤其是用户拒绝申请授权时,所以建议使用方法b)。

  • 2、多必要权限的同时申请

由于调用ContextCompat.checkSelfPermission()时只能进行一项权限检查导致后续的requestPermissions()虽然方法支持多项权限的申请,但在此情况下只能进行一项权限授权申请,进而导致后续只能在onRequestPermissionsResult()检查第一项权限授权是否通过后再进行下一项授权申请。这其间onResume()调用还需要记录每一项权限的授权结果。

方法:构建一个权限数组,onStart()时每次循环遍历所有预申请权限,如果所有权限均授权通过,则进行下一步操作,如果是未授权,则调用requestPermissions(),如果是拒绝,则提示用户跳转APP设置界面进行授权。在onRequestPermissionsResult()方法中不检查权限的授权结果而是继续调用循环遍历来检查权限授权结果。这里需要注意一个无限循环的问题,如下。

  • 3、权限授权过程无限循环

requestPermissions()调用后弹出的是由PackageManager管理的Dialog主题的Activity(B),如果此时用户屏幕锁屏,B调用onStop(),授权申请Activity(A)调用onStop(),开屏后A将触发onStart()再次调用requestPermissions(),此时B还在前台,再创建B‘实例导致B回调onRequestPermissionsResult()继续重复要点2的逻辑,导致进入无限循环,在API>23后会有多次请求权限授权的日志输出,可以注意观察。为了避免上述情况发生,可以在授权申请Activity(A)添加标记位避免开锁屏时的重复调用或者锁屏后的onStop()中发起取消申请授权,然后在onRequestPermissionsResult()中判断是否要继续调用。

  • 4、取消授权申请

在公开的API中并没有在申请授权过程中的取消操作,因为运行时授权申请本身并不允许并行执行,所以当前状态下只有三种可能性:不再提醒、允许、拒绝。但当出现上述3逻辑时就需要有可以取消的流程。在Activity.java的源码中提供了一种方式:

通过主动调用授权结果返回,然后根据后面两个参数来结束授权流程。

  • 5、Fragment、Activity中的使用

Fragment中直接使用父类的requestPermissions()

Activity兼容模式下调用ActivityCompat.requestPermissions()

  • 6、友好性的授权拒绝提示

微信、支付宝都是采用对话框的方式,但在用户体验上很冲突,推荐采用SnackBar

“怀疑”死亡

个头不高,脸上一层层的皱纹写满岁月的痕迹,穿着一件深蓝色花格子的长袖衣服,下身藏青色裤子,轻微束脚成尖的脚上穿着一双黑色略新的布鞋,上身后躺在床头板儿上,双腿撑起成拱形,双手放在膝盖上,脸上一副安详的表情,没有任何痛苦与挣扎,是的,她就这样走了,当听到阵阵的哭声时,我们周边才意识到这位老奶奶的离去。赶忙跑过去时,村里医生正在验证是否还有生命迹象,把脉,验证呼吸,看眼睛瞳孔,最后告诉旁边已经哭的不成样子的儿子:“三儿,你妈走了,很幸福的走了,别把眼泪滴到你妈身上,别哭了,你妈没病没灾地走的很安心”。一个生命就此宣告-死亡。

死亡,在宗教里意味着升天、皈依,在自然界里意味着回归尘土,这就是那句“生不带来死不带去”的起点,在精神境界里,死亡意味着什么?你是否惧怕死亡?我们需要永生吗?

一个人骑着自行车从农田的十字路口经过,但是庄稼略微挡住了视线,当他骑到十字路口的边缘时,侧方向来车已经无法急刹车,瞬间人被撞飞,血肉模糊,从一个意识清醒的人到瞬间的巨大伤痛,再到脏器受损,最终生命体征消失,这或许只需要几分钟。他在之前的几分钟或许还在思考怎么回家给儿子做一顿可口的饭菜,或许还在想庄稼是不是应该浇灌了,但此刻这一切都不重要了,因为他的意识已经停止了,他在这个自然界唯一可被尊重的东西消失了。从一个社会人走向一个非组织非高级的自然重组过程,他独一无二的意识就此终止于此,如果我们相信记忆可以被存储在上帝那里做一个备份的话,这是一份珍重,一份独一无二的礼物,于他的家人,于与他打过交道的任何一个生命…

当我们不小心患上咳嗽感冒时,或许你没意识到这样的小病还会威胁到心脏,在很多人眼中去医院总不算是一件好事,在医疗发展到今天,在医院治疗后不幸离世的人与在家自然死亡的比率只会越来越高,当然疾病于此也在升级。当踏入医院大楼门诊时,才发现我们的生命在与疾病斗争的过程中所付出的艰辛。人满为患的挂号队伍,住院部里步履蹒跚的病号,周围三五成群的家属,我们为了维持和挽救一个生命所要付出的代价-金钱、精力。

最近某个论坛上特别火的一个讨论:一个小康的家庭,父亲身患癌症晚期,医生提醒他们如果继续进行放疗化疗能够支撑半年或一年但要花费100多万,如果不治疗现在就拔管可能几个月就要准备后事了,因为癌症细胞还在继续扩散。最后妻子决定放弃丈夫治疗,家底虽还算殷实,但想想还没结婚的儿子这是一场徒劳。儿子却坚持继续给父亲治疗。最后这位父亲又坚持治疗了几个月后离世。大家在众说评论中,有人顶儿子尽到了做儿子的孝道,有人也顶妻子面对现实的决绝。目前国内的很多家庭如果家里某个人患上一场大病,基本会导致一夜返贫。在家庭收支的现状下,我们是选择给亲人一个现实的死亡,还是给亲人一个延长生命的机会。作为一个医生,或许早已对此不再颤抖与怀疑,每天面对不同生命的死亡,他们尽力了,身为医者,他们也想让世间多一份不同的欢笑,但自然却不允许。

有一天去医院碰到一位东北来的阿姨,叫号进去之后没多久就被医生说了几句给请出来了,我还在怀疑到底怎么了。原来是这位阿姨的病已经相当严重,她不识字也看不懂化验单,只能挨个来检查,带着之前的一堆单子,医生看了几个单子后没有直接和她明说,只是告诉她去另外一个科室去检查一下,他的这个门诊不看这个病,这个阿姨脸上直接茫然了,在记下了一个电话号码后走了出去。后来医生才私下和我说,那个阿姨基本无药可治了,不止是胸肺有问题,心脏也有严重问题,这样的患者如果收治,基本是无望,尤其是外地的患者情况更加复杂。随后我俩竟也不约而同地叹息了一声。或许这也是医生的一种无奈吧。如我乃是神,我赦无人之死,这或许只是神话。

在医院医生虽手握病人之生命,但谁人也不敢保证你在我的治疗下能够完全康复。无论是医学还是工程学,人类都在试图改造自然,但“人定胜天”的愚蠢在一直警示着我们,尊重远比强权更加重要。在每次手术时,医生都会再三强调手术的风险性,家属也需要签字确认。这是生命的嘱托,也是对生的期待。谈及最近各种纷繁复杂的医患关系,这其中有一环就是对待死亡的双方。医生是否尽到了拯救患者于死亡之外,家属是否认识到疾病的危害性和手术的风险性及死亡的可能性。最近的看到的几起手术死亡医患矛盾的案例,后续的进展大多不了了之,至于医生是否存在手术失误或者不当作为非专业人不可罔顾发言,但作为家属的一方对待死亡的态度是否有足够的心理准备?更有甚者叫嚣以命偿命的可笑之谈,在医生尽专业之力挽救一个生命时的努力患者何时去体会?

生命从降生到死亡,一个更替,一个更迭。

一个生命降临时我们开怀大笑,尽心尽力,奔走相贺,世界为我而生。这是一份独一无二。

一个生命死亡时我们缅怀过去,面对现实,尊重自然,尽力而为,为这一次的落幕争取一份勇气。
sunflower

健身派 大陆用户使用Google Fit (非root)

Google Location History在国内目前处于非可用状态,可能是由于地图拍照之类的问题,所以基于地理位置实时跟踪的Google Fit也就悲剧了。

网上修复或者绕过的各种路数是手机rooted,然后更改google play注册地欺骗Google通过,还有其他的比如SIM卡贴欺骗,总之的意思就是让Google以为你在国外开放Location History的地方。

手机如果被rooted使用的风险性会大大增加,不建议使用。除了通过Location History来记录健身,还可以通过Google Fit API来正常使用Google Fit。

Google Fit API内建了各种数据模型,比如步数统计、骑自行车、业余训练等等。

相关API详情参考

这里我也写了一个App,可以提供这些功能,欢迎下载使用。

Get it on Google Play

当然如上这些还是需要某项技能才能同步。