1.Android6.0(APIlevel23)开始targetSdkVersion>=23的应用必须在运行时动态申请权限
  2.权限请求对话框是操作系统进行管理的,应用无法也不应该干预。
  3.系统对话框描述的是权限组而不是某个具体权限
  4.调用requestPermissions并不意味着系统一定会弹出权限请求对话框,也就是说不能假设调用该方法后就发生了用户交互,因为如果用户之前勾选了“禁止后不再询问”或者系统策略禁止应用获取权限,那么系统会直接拒绝此次权限请求,没有任何交互
  5.如果某个权限跟应用的主要功能无关,如应用中广告可能需要位置权限,用户可能很费解,此时在申请权限之前弹出对话框向用户解释为什么需要这个权限是个不错的选择。但不要在所有申请权限之前都弹出对话框解释,因为频繁地打断用户的操作或让用户进行选择容易让用户不耐烦
  6.Fragment中的onRequestPermissionsResult方法只有在使用Fragment#requestPermissions方法申请权限时才可能接收到回调,建议将权限放在所属Activity中申请和处理
  7.应用应该尽量少地申请权限,像让用户拍一张照片或者选择一张图片完全不需要相机权限和外存权限,可以通过隐式Intent拉起系统相机或其他应用完成,应用只需要在onActivityResult回调中接收数据就行了。但是有一点一定要注意,如果你在AndroidManifest.xml文件中声明了相机权限,你就必须得动态申请并获得相机权限才能拉起系统相机.android
 

//请求通讯录权限的模板代码如下
   privatevoidshowContactsWithPermissionsCheck{
   if(ContextCompat.checkSelfPermission(MainActivity.this,
   Manifest.permission.READ_CONTACTS)
   !=PackageManager.PERMISSION_GRANTED){
   if(ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this,
   Manifest.permission.READ_CONTACTS)){
   //TODO:弹框解释为什么需要这个权限.【下一步】->再次请求权限
   }else{
   ActivityCompat.requestPermissions(MainActivity.this,
   newString[]{Manifest.permission.READ_CONTACTS},
   RC_CONTACTS);
   }
   }else{
   showContacts;
   }
   }
   privatevoidshowContacts{
   startActivity(ContactsActivity.getIntent(MainActivity.this));
   }
   @Override
   publicvoidonRequestPermissionsResult(intrequestCode,@NonNullString[]permissions,
   @NonNullint[]grantResults){
   super.onRequestPermissionsResult(requestCode,permissions,grantResults);
   switch(requestCode){
   caseRC_CONTACTS:
   if(grantResults.length>0
   &&grantResults[0]PackageManager.PERMISSION_GRANTED){
   showContacts;
   }else{
   if(!ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this,
   Manifest.permission.READ_CONTACTS)){
   //TODO:弹框引导用户去设置页主动授予该权限.【去设置】->应用信息页
   }else{
   //TODO:弹框解释为什么需要这个权限.【下一步】->再次请求权限
   }
   }
   break;
   default:
   break;
   }
   }
   @Override
   protectedvoidonActivityResult(intrequestCode,intresultCode,@NullableIntentdata){
   super.onActivityResult(requestCode,resultCode,data);
   if(requestCodeRC_SETTINGS){
   //TODO:在用户主动授予权限后重新检查权限,但不要在这里进行事务提交等生命周期敏感操作
   }
   }