从Android 6.0(API 23)开始,允许用户在应用运行时决定是否允许权限,而不是在应用安装的时候。这种方法简化了应用的安装过程,因为用户在安装或更新应用的时候不需要允许权限。他也让用户对应用的功能有更多的控制;例如,用户可以选择给予相机应用相机的权限但是不允许使用设备位置的权限。用户可进入应用设置随时撤销权限。
系统权限被分为两种类型,正常的(normal)和敏感的(dangerous):
正常的权限不会直接让用户的隐私处于危险中。如果你的应用在清单文件中列入了正常的权限,系统会自动允许这些权限。
敏感权限给予应用方位用户的机密数据。如果你的应用在清单文件中列入危险类权限,会明确地让用户对你的应用允许权限。
敏感权限(Dangerous permissions)
Permission Group | Permissions |
---|---|
CALENDAR | READ_CALENDAR, WRITE_CALENDAR |
CAMERA | CAMERA |
CONTACTS | READ_CONTACTS ,WRITE_CONTACTS, GET_ACCOUNTS |
LOCATION | ACCESS_FINE_LOCATION , ACCESS_COARSE_LOCATION |
MICROPHONE | RECORD_AUDIO |
PHONE | READ_PHONE_STATE, CALL_PHONE READ_CALL_LOG , WRITE_CALL_LOG , ADD_VOICEMAIL , USE_SIP, PROCESS_OUTGOING_CALLS |
SENSORS | BODY_SENSORS |
SMS | SEND_SMS RECEIVE_SMS , READ_SMS RECEIVE_WAP_PUSH , RECEIVE_MMS |
STORAGE | READ_EXTERNAL_STORAGE , WRITE_EXTERNAL_STORAGE |
如果在android6.0以上版本需要申请敏感权限,需要动态申请权限,自己封装了两个函数如下:
private boolean checkAndRequestPermission(final Context context, final String permission, final int requestCode){
boolean bResult=false;
if (ContextCompat.checkSelfPermission(context, permission)!= PackageManager.PERMISSION_GRANTED){
if (!ActivityCompat.shouldShowRequestPermissionRationale((MainActivity)context,permission)){
AlertDialog.Builder dialogBuilder=new AlertDialog.Builder(context);
dialogBuilder.setTitle("Notice").setMessage("App need permission"+permission);
dialogBuilder.setNegativeButton("Cancel",null);
dialogBuilder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
ActivityCompat.requestPermissions((MainActivity)context,new String[]{permission},requestCode);
}
});
dialogBuilder.create().show();
}else{
ActivityCompat.requestPermissions((MainActivity)context,new String[]{permission},requestCode);
}
}else{
bResult=true;
}
return bResult;
}
@Override
public void onRequestPermissionsResult(int requestCode,String[] permissions,int[] grantedResult){
switch (requestCode){
case REQUEST_CODE_FOR_READ_EXTERNAL_STORAGE:
if (grantedResult.length>0 && grantedResult[0]==PackageManager.PERMISSION_GRANTED){
//申请权限成功后执行的代码
}
break;
default:
break;
}
}
补充说明:
如果用户拒绝某授权。下一次弹框,用户会有一个“不再提醒”的选项的来防止app以后继续请求授权。如果这个选项在拒绝授权前被用户勾选了。下次为这个权限请求requestPermissions时,对话框就不弹出来了,结果就是,app啥都不干。
这将是很差的用户体验,用户做了操作却得不到响应。这种情况需要好好处理一下。在请求requestPermissions前,我们需要检查是否需要展示请求权限的提示通过activity的shouldShowRequestPermissionRationale进行检查。
某些厂商(比如小米)的手机尽管操作系统版本低于6.0,某些时候也需要动态申请权限。
参考链接:http://blog.csdn.net/kjunchen/article/details/51366845
http://itindex.net/detail/54289-android-%E5%BC%80%E5%8F%91
http://blog.csdn.net/lmj623565791/article/details/50709663