Android – 6.0 动态权限

前言

很早就知道Android 6.0新功能动态权限申请,但是一直没接触过,因为特殊权限也没怎么用过。但是最近看到好多文章阐述,一时技痒,就搞搞看。做过之后才知道,掌握这个知识点还是很有必要的,因为在Android 6.0 以上的设备上,一些特殊权限必须是在运行时动态赋予给用户的。如果直接Intent跳转的话,应用直接Crash了。

申请步骤

  • targetSdkVersion >= 32
  • AndroidManifest.xml中申请需要的权限,包括普通权限和特殊权限
  • 开始动态申请权限

​ (1):检查是否有此权限 ContextCompat.checkSelfPermission(),返回整形,和PackageManager.PERMISSION_GRANTED对比,相等则说明有此权限,如果有此权限,完全OK

​ (2):没有此权限,则判断是否需要向用户解释为何申请权限 shouldShowRequestPermissionRationale() ,然后通过ActivityCompat.requestPermissions()方法申请权限,该方法有三个参数,即当前Activity,要申请的权限(字符串数组),requestCode。这样就可以知道一次可以申请多个权限,而requestCode就是用来在第三部回调的时候判断是谁申请了权限。

​ (3):在当前Activity中的onRequestPermissionsResult()方法中处理用户是否授予了此权限。

  1. 在小米5上测试的时候,发现当用户拒绝了权限,之后在点击就不会在弹出提示框,而在原生的Android系统中,拒绝一次之后再次点击,第二次弹出申请权限的对话框中会出现”以后不再弹出“的复选框。参考网上一个比较好的做法是,在再次点击的时候打开当前应用的信息界面,让用户可以手动来赋予权限。代码如下:
1
2
3
4
5
6
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
String pkg = "com.android.settings";
String cls = "com.android.settings.applications.InstalledAppDetails";
intent.setComponent(new ComponentName(pkg, cls));
intent.setData(Uri.parse("package:" + getPackageName()));
startActivity(intent);
  1. 测试了两个权限,一个是打开相册权限,一个是拨打电话权限,在点击提示框赋予权限之后,可以直接跳转的系统相册界面,但是在赋予通话权限之后,还需要再次点击才能进去通话界面,主要是通电话的Intent不能写入到onRequestPermissionsResult()方法中,提示“ Call requires permission which may be rejected by user: code should explicitly check to see if permission is available (with checkPermission) or explicitly handle a potential SecurityException “,这不是开玩笑吗?留个坑吧,待解决。

Demo 地址:

https://github.com/Omooo/DynPermissionsDemo

参考

http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/1110/3670.html

http://www.jianshu.com/p/a51593817825

http://www.cnblogs.com/dubo-/p/6018262.html


特殊的节日

随着天气变冷,越来越懒惰了,在这个特殊的节日还是勉励自己勤奋一点,每天都有收获。

总有一些时候贪玩和放松自己,但是还是很开心,祝贺RNG和WE进入四强!

最后,放一个福利吧。

GitHub上受欢迎的Android UI Library

我觉得少了点什么,但是却无法解释。

或许人生就是这么简单优雅吧,明天接着跑步!


Android – 计步器的实现

前言

之前对微信的计步器一直很感兴趣,当时并不知道怎么实现,今天看到简书上的一篇文章,实现了和微信计步几乎一致的效果,以此记录,并了解一下实现原理。

原文链接:http://www.jianshu.com/p/cfc2a200e46d

两种计步方式

  1. 加速度传感器 Sensor.TYPE_ACCELEROME 计步方式:这种方式是有开源的算法根据加速度传感器进行计算步数;

    优点:只要有加速度传感器的设备都可以使用,相对来说可以使用的设备较多。

    缺点:步数的准确性取决于算法且算法比较难优化;需要后台保活 Service 否则不能计步;计步算法比较耗电;部分手机锁屏不能计步;

  2. 计步传感器 Sensor.TYPE_STEP_COUNTER 计步方式:这种传感器是返回手机系统启动到当前时间的所有步数。手机系统重启传感器返回步数为0。还返回一个时间戳,表示最后一次步数的时间。这个计步传感器是一个硬件,功耗非常低。如果你想记录步数,注册该传感器不要注销,他能自动在后台计步,在app唤醒的时候返回计步总数。应用程序需要注册该传感器,否则不能不能记步。

    优点:硬件计步准确性高;功耗小;只要注册不用后台 Service 自动计步;

    缺点:Android4.4系统以上的部分手机;手机系统重启计步器清零;不能返回步数明细(步数对应时间),只是返回当前时间的总步数。

项目地址

Github 地址:https://github.com/jiahongfei/TodayStepCounter


香格里拉

我以为认真去做就能实现我的梦

以为写首好歌走路就能抬起头

以为骑摩托车旅行就能变英雄

现在的我,失去了冲动

有才华的人唾弃金光闪闪的奖座

亲爱的Cobain是否也曾爱慕虚荣

多希望有人冲破疑惑带我前走

现在的我,变得好懦弱

雨会下雨会停 这是不变的道理

夜空中北极星 迷路的人不恐惧

我唱歌你在听 一切风平又浪静

G和弦的根音 抚平脆弱的心灵

我只想牵着你 走到很远的梦里

小木屋红屋顶 地址是一个秘密

你抱着小猫咪 蓝眼睛不再忧郁

香格里拉 让我们去找寻


WebView 的那些坑

前言

最近,在用到 WebView 的时候,真的算是体会到了什么叫坑爹了。从最开始的无法跳转页面到之后无法播放视频等等,网上的一些解决办法也都尝试了,但是到最后还是无法解决播放MP4。还有一大堆的 WebSetting 搞的我很焦灼,有时候压根就不知道有没有用。被逼不得已,网上找开源库,看了一下腾讯的 TBS (腾讯浏览服务)文档,当时就惊了,原来是替换了Android SDK里面的系统内置浏览器内核,替换包和类就让我有点放弃。然后问问群里面的大佬,提到了一个开源库。那就是……

AgentWeb

不得不说,大佬就是大佬。用起来超简单,我的问题也解决了。

Github地址:https://github.com/Justson/AgentWeb

完善的文档,不用多说。

最后

放上自己写的Demo,其中包括自己利用系统的WebView(只是无法播放视频……)和使用AgentWeb写的小应用。

Github:https://github.com/Omooo/Joke

给个Star就是给我最大的鼓励,谢谢。

我们一直都向往,面朝大海,春暖花开。 但是几人能做到,心中有爱,四季不败?