1.首先,6.0的权限管理包括:
关于日历的权限:
<uses-permission android:name="android.permission.READ_CALENDAR"/>
<uses-permission android:name="android.permission.WRITE_CALENDAR"/>
关于相机的权限:
<uses-permission android:name="android.permission.CAMERA"/>
关于联系人的权限:
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
<uses-permission android:name="android.permission.GET_CONTACTS"/>
关于位置的权限:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
关于电话的权限:
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.CALL_PHONE"/>
<uses-permission android:name="android.permission.READ_CALL_LOG"/>
<uses-permission android:name="android.permission.WRITE_CALL_LOG"/>
<uses-permission android:name="android.permission.USE_SIP"/>
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
关于传感器的权限:
<uses-permission android:name="android.permission.BODY_SENSORS"/>
关于短信的权限:
<uses-permission android:name="android.permission.SEND_SMS"/>
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<uses-permission android:name="android.permission.READ_SMS"/>
<uses-permission android:name="android.permission.RECEIVE_WAP_PUSH"/>
<uses-permission android:name="android.permission.RECEIVE_MMS"/>
<uses-permission android:name="android.permission.READ_CELL_BROADCASTS"/>
关于SD卡的权限
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
上面这些摘自:https://juejin.im/post/5af815b3f265da0b93486566
2.需要在每回使用这些危险,权限前判断系统版本和是否已经授权成功:
Build.VERSION.SDK_INT >= Build.VERSION_CODES.N
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {}
这里的Mainfest.permission.后面跟的是具体权限:
3.需要在
Packmanager.DENIED时候申请一下权限:
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
REQUEST_FOR_PERMISSION_GRANTED);
这个方法的第3个参数是回调的参数,随意设置。
4.需要在Activity的方法OnRequestPermissionResult(int request,String[] permission,int[] grantResults)中判断是否授权成功;
这个方法有3个参数回调:
第一个参数是你刚才传过去的回调参数;第二个是申请授权的权限;第三个是授权结果,封装着Packmanager.permission_GRAN和DENIED成功还是失败,这时候需要判断下是成功还是失败:
for (int grantResult : grantResults) {
if (grantResult != PackageManager.PERMISSION_GRANTED) {
return false;//用户未授权
}
}
成功按流程继续调用就可以了,失败就是弹个Tomast提示下"用户授权失败",但是,失败有2中情况.
5.在失败时候有2种情况1.是用户选择拒接,2.用户拒绝并且选择不再申请,需要一个api来判断了:
ActivityCompat.shouldshowRequestPermissionRationale(activity,permission);当返回false时候,需要提示用户去设置里面去勾选了,
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
startActivityForResult(intent, GOTO_SETTINGS_CAMERA);
在onActivityResult里面做判断,是否用户申请成功.
最后贴上一些第三发的申请框架:
AndPermission:https://github.com/yanzhenjie/AndPermission
PermissionDispatCher(一款根据注解的权限管理框架):https://github.com/permissions-dispatcher/PermissionsDispatcher