支持原创哦。yhGO。
写在前面
前段时间,遇到了这个问题。就研究了一下,并且写了一个简单的Util(在文章最后),自己觉得用着还行。
现在,让我们来总结一下,首先。。。
为什么要添加动态权限机制
这个网上有很多非常官方的说法。在这里我就用自己话说了。我认为就是Google为了提升用户体验,让用户觉得更加有安全感(确实更加安全),更加人性化(以前你不同意这个权限,这个应用你就装不了。。)而推出的。
内心OS:还不是被IOS逼的,安全方面Android确实是短板。
什么是动态权限
以前我们在AndroidManifest中申请的权限叫静态权限。而现在有些权限我们不光需要先在AndroidManifest中申请,当程序运行到需要该权限的地方时,我们需要再次申请该权限。并且这次是向用户来申请,当用户同意了,我们才能使用这个功能。
比如:
以前我们我们使用拍照功能,需要android.permission.CAMERA权限,在AndroidManifest中申请即可。
而现在,当用户点击你APP的拍照功能是,你需要向用户申请这个权限。告诉用户:“如果你想用我这个程序拍照,就得同意我使用这个权限,要不你就用不了”。
怎么使用动态权限
上文我也说了,并不是所有的权限都需要动态申请。有些无关痛痒的权限,比如RECEIVE_BOOT_COMPLETED,监听启动广播的权限,你弄这个去让用户确认不是蛋疼么。所以:
需要动态申请的权限
(官方)
我们可以看出这些权限被分为了几组:
CALENDAR 日历
CAMERA 相机
CONTACTS 联系人
LOCATION 定位
MICROPHONE 麦克相关,比如录音
PHONE 手机状态
SENSORS 传感器
SMS 短信
STORAGE 存储权限
这些分组的意义在于:
同一组的权限只需动态申请其中一个,同组的权限就全部都申请了。(方便使用)
but。。。在定制化非常严重的国内,这一条在有些手机上并不适用,所以为了适配顺利,建议大家还是老老实实将需要用到的动态权限都申请一个遍吧。
API
这才是怎么使用的重点
int checkSelfPermission(String permission) 用来检测应用是否已经具有权限。
void requestPermissions(String[] permissions, int requestCode) 进行请求单个或多个权限,第一个参数是请求的权限集合,第二个参数是请求码,在回调监听中可以用来判断是哪个权限请求的结果。效果就是在界面上谈一个弹框,让用户选择授权还是不授权。
void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) 用户对请求作出响应后的回调,请求成功或者失败的监听
shouldShowRequestPermissionRationale这个API可以帮我们判断接下来的对话框是否包含”不再询问“选择框。在6.0之前的版本永远返回的是fasle。
说的很清楚,我们上Demo
Demo
public void onClick(View v) {
if (!(checkSelfPermission(Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED)) {
//申请权限
requestPermissions(new String[]{Manifest.permission.CAMERA}, REQUEST_PERMISSION_CAMERA_CODE);
}
private static final int REQUEST_PERMISSION_CAMERA_CODE = 1;
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
//判断标识码
if (requestCode == REQUEST_PERMISSION_CAMERA_CODE) {
int grantResult = grantResults[0];
//判断用户是否授权
boolean granted = grantResult ==
PackageManager.PERMISSION_GRANTED;
Log.i(LOGTAG, "onRequestPermissionsResult=" + granted);
}
}
注:
在使用动态权限前,你需要先静态申请该权限。也就是在AndroidManifest中先申请。否则还是用不了。
如果你需要一次申请多个权限,那就在requestPermissions的new String[]{}里挨个添加就行。
当然这个Demo如果要在实际中应用还欠缺很多东西。比如:没有判断是不是6.0以上的设备。因为以上API的方法是6.0以上才有的。(除非你使用V4包中的方法:
ContextCompat.checkSelfPermission
ActivityCompat.requestPermissions
ActivityCompat.shouldShowRequestPermissionRationale
代替)。
如果需要再项目中应用,推荐使用下面我写的Util。很方便,很强大哦。(虽然逻辑不复杂,嘿嘿)
RuntimePermissionUtil
该工具类优点:
1.会在失败方法中显示用户是第几次使用该权限申请。(适配所有机型)(在某些机型中,只要用户第一次拒绝该权限申请,以后再申请该权限则没有任何提示。) 而在该工具类中,你可以根据次数自行进行处理。
2.代码中不用判断是否是6.0以上机器,只用调用这两个方法即可。工具中会自动判断。
3.使用方便。
使用方法:
1.在需要动态申请权限的地方调用: RequestPermissionsUtil.needPermission()方法。
2.同时在该activity或者fragment中的onRequestPermissionsResult方法中调用 RequestPermissionsUtil.setPermissionsResult()方法即可。
是不是很方便。
下载地址:https://github.com/yhGO/RuntimePermissionUtil
如果用着不错,别忘了star哦~~~
欢迎提出建议和意见,相互交流,共同进步!!GO!GO!GO!!!