写之前,先发个牢骚,特么天天加班,感觉身体被掏空了........................
-------------------------------------------------------------------------------------------------------------------------
回到正题,对于6.0以下的权限及在安装的时候,根据权限声明产生一个权限列表,用户只有在同意之后才能完成app的安装(比如是个app都要访问通讯录、短信,SD卡,相机等)。而在6.0以后,我们可以直接安装,当app需要我们授予不恰当的权限的时候,我们可以予以拒绝(比如:获取短信,SD卡,我一般都是拒绝的)。当然你也可以在设置界面对每个app的权限进行查看,以及对单个权限进行授权或者解除授权。Android6.0添加了运行时权限,用户可以在已安装的app上立刻同意或者拒绝权限,那么就意味着我们在使用APP的时候,当一个app会使用一些危险权限的时候就会提示用户是否授权.新的权限机制更好的保护了用户的隐私,Google将权限分为两类,一类是Normal Permissions,这类权限一般不涉及用户隐私,是不需要用户进行授权的,比如手机震动、访问网络等;另一类是Dangerous Permission,一般是涉及到用户隐私的,需要用户进行授权,比如读取sdcard、访问通讯录等。
那么这个权限机制对于用户来说是挺好的,但是对于我们开发人员来讲,却又多了一种适配-权限适配.
就拿申请访问SD卡来说吧,如果用户在第一次弹出授权申请的时候,用户选择了拒绝并不再提示,那么我们访问SD卡的路径就会出错.那么怎么去避免出错呢.
我的解决思路是,先判断权限,再去决定是否响应事件.然后根据回调函数判断是否授权.未授权弹出dialog提示用户去开启权限.
判断当前版本是否为6.0及以上(在清单文件中已经申请权限了)
if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.M) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, PermissionsUtils.REQUEST_EXTERNAL_STORAGE); }else { //正常响应事件 }回调函数
@Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); switch (requestCode){ case PermissionsUtils.REQUEST_EXTERNAL_STORAGE: if(grantResults.length>0 && grantResults[0]== PackageManager.PERMISSION_GRANTED){ //已获取权限 //响应事件 }else{ //权限被拒绝 new SimpleBaseDialog(this, "需要开启权限后才能使用", "去设置", "取消", new SimpleClickListener() { @Override public void ok() { Intent intent=CMethod.getAppDetailSettingIntent(PulishWriteActivity.this); startActivity(intent); } @Override public void cancle() { } }).show(); } break; } /** * 获取应用详情页面intent * * @return */ public static Intent getAppDetailSettingIntent(Context context) { Intent localIntent = new Intent(); localIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); if (Build.VERSION.SDK_INT >= 9) { localIntent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS"); localIntent.setData(Uri.fromParts("package", context.getPackageName(), null)); } else if (Build.VERSION.SDK_INT <= 8) { localIntent.setAction(Intent.ACTION_VIEW); localIntent.setClassName("com.android.settings", "com.android.settings.InstalledAppDetails"); localIntent.putExtra("com.android.settings.ApplicationPkgName", context.getPackageName()); } return localIntent; }最后附上一个工具类
public class PermissionUtils { public static final int MY_PERMISSIONS_REQUEST_CODE=10001; public static boolean checkAudioPermission(Context context){ //检查麦克风权限 ,写入文件,读出文件权限 if (ContextCompat.checkSelfPermission(context, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) { //申请RECORD_AUDIO WRITE_EXTERNAL_STORAGE READ_EXTERNAL_STORAGE 权限 ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.RECORD_AUDIO,Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_CODE); }else if (ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { //申请RECORD_AUDIO WRITE_EXTERNAL_STORAGE READ_EXTERNAL_STORAGE 权限 ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.RECORD_AUDIO,Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_CODE); }else if (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { //申请RECORD_AUDIO WRITE_EXTERNAL_STORAGE READ_EXTERNAL_STORAGE 权限 ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.RECORD_AUDIO,Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_CODE); }else{ //权限已经允许 请执行下一步操作 // Toast.makeText(context,"Permission Granted",Toast.LENGTH_LONG).show(); return true; } return false; } public static boolean checkCameraPermission(Context context){ //检查拍照权限 ,写入文件,读出文件权限 if (ContextCompat.checkSelfPermission(context, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { //CAMERA WRITE_EXTERNAL_STORAGE READ_EXTERNAL_STORAGE 权限 ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.CAMERA,Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_CODE); }else if (ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { //CAMERA WRITE_EXTERNAL_STORAGE READ_EXTERNAL_STORAGE 权限 ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.CAMERA,Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_CODE); }else if (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { //CAMERA WRITE_EXTERNAL_STORAGE READ_EXTERNAL_STORAGE 权限 ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.CAMERA,Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_CODE); }else{ return true; } return false; } public static boolean checkCameraScanPermission(Context context){ //检查拍照权限 if (ContextCompat.checkSelfPermission(context, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { //CAMERA 权限 ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.CAMERA}, MY_PERMISSIONS_REQUEST_CODE); }else{ return true; } return false; } public static boolean checkExternalStoragePermission(Context context){ //检查写入文件,读出文件权限 if (ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { //CAMERA WRITE_EXTERNAL_STORAGE READ_EXTERNAL_STORAGE 权限 ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_CODE); }else if (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { //CAMERA WRITE_EXTERNAL_STORAGE READ_EXTERNAL_STORAGE 权限 ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_CODE); }else{ return true; } return false; } public static boolean checkLocationPermission(Context context){ //检查获取位置权限 if (ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { //ACCESS_COARSE_LOCATION ACCESS_FINE_LOCATION 权限 ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.ACCESS_COARSE_LOCATION}, MY_PERMISSIONS_REQUEST_CODE); }else if (ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { //ACCESS_COARSE_LOCATION ACCESS_FINE_LOCATION 权限 ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.ACCESS_COARSE_LOCATION}, MY_PERMISSIONS_REQUEST_CODE); }else{ //权限已经允许 请执行下一步操作 // Toast.makeText(context,"Permission Granted",Toast.LENGTH_LONG).show(); return true; } return false; } public static boolean checkContactsPermission(Context context){ //检查获取联系人权限 if (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) { //READ_CONTACTS GET_ACCOUNTS 权限 ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.READ_CONTACTS}, MY_PERMISSIONS_REQUEST_CODE); }else if (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED){ return true; } return false; } public static boolean checkSendSMSPermission(Context context){ //检查获取发短信权限 if (ContextCompat.checkSelfPermission(context, Manifest.permission.SEND_SMS) != PackageManager.PERMISSION_GRANTED) { //SEND_SMS 权限 ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.SEND_SMS}, MY_PERMISSIONS_REQUEST_CODE); }else{ //权限已经允许 请执行下一步操作 // Toast.makeText(context,"Permission Granted",Toast.LENGTH_LONG).show(); return true; } return false; } public static boolean checkPhonePermission(Context context){ //检查获取电话权限 if (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) { //READ_PHONE_STATE CALL_PHONE 权限 ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.READ_PHONE_STATE,Manifest.permission.CALL_PHONE}, MY_PERMISSIONS_REQUEST_CODE); }else if (ContextCompat.checkSelfPermission(context, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) { //READ_PHONE_STATE CALL_PHONE 权限 ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.READ_PHONE_STATE,Manifest.permission.CALL_PHONE}, MY_PERMISSIONS_REQUEST_CODE); }else{ //权限已经允许 请执行下一步操作 // Toast.makeText(context,"Permission Granted",Toast.LENGTH_LONG).show(); return true; } return false; }}
that's all THX
