Android 6.0 动态权限申请封装的处理方式

转载自:http://blog.csdn.net/lin_dianwei/article/details/79025324

Android M 或以上的设备,在使用涉及隐私的安全权限时,需要动态申请,虽然不难,但写下来代码工作量也不少,而且几乎每个应用都需要用到。所以一直在探索一个要足够简单简洁优雅的处理方式,强迫症的精神指导我要拒绝一切繁琐。至于完不完美那就仁者见仁了。

一、思路:

如果在每个用到权限的地方去申请,有点繁琐,所以做法是直接在每个Activity界面显示前就把该界面所需的权限全部申请允许了,再进入正常的流程。如果有权限未被允许,开发者可以在接口中自己处理,可以直接提示并退出,或者提示权限的作用后重新发起权限申请。


二、危险权限列表:Dangerous Permissions

在Android M 或以上,以下权限需要动态申请的意思。

[html]  view plain  copy
  1. group:android.permission-group.CONTACTS  
  2.   permission:android.permission.WRITE_CONTACTS  
  3.   permission:android.permission.GET_ACCOUNTS  
  4.   permission:android.permission.READ_CONTACTS  
  5.   
  6. group:android.permission-group.PHONE  
  7.   permission:android.permission.READ_CALL_LOG  
  8.   permission:android.permission.READ_PHONE_STATE  
  9.   permission:android.permission.CALL_PHONE  
  10.   permission:android.permission.WRITE_CALL_LOG  
  11.   permission:android.permission.USE_SIP  
  12.   permission:android.permission.PROCESS_OUTGOING_CALLS  
  13.   permission:com.android.voicemail.permission.ADD_VOICEMAIL  
  14.   
  15. group:android.permission-group.CALENDAR  
  16.   permission:android.permission.READ_CALENDAR  
  17.   permission:android.permission.WRITE_CALENDAR  
  18.   
  19. group:android.permission-group.CAMERA  
  20.   permission:android.permission.CAMERA  
  21.   
  22. group:android.permission-group.SENSORS  
  23.   permission:android.permission.BODY_SENSORS  
  24.   
  25. group:android.permission-group.LOCATION  
  26.   permission:android.permission.ACCESS_FINE_LOCATION  
  27.   permission:android.permission.ACCESS_COARSE_LOCATION  
  28.   
  29. group:android.permission-group.STORAGE  
  30.   permission:android.permission.READ_EXTERNAL_STORAGE  
  31.   permission:android.permission.WRITE_EXTERNAL_STORAGE  
  32.   
  33. group:android.permission-group.MICROPHONE  
  34.   permission:android.permission.RECORD_AUDIO  
  35.   
  36. group:android.permission-group.SMS  
  37.   permission:android.permission.READ_SMS  
  38.   permission:android.permission.RECEIVE_WAP_PUSH  
  39.   permission:android.permission.RECEIVE_MMS  
  40.   permission:android.permission.RECEIVE_SMS  
  41.   permission:android.permission.SEND_SMS  
  42.   permission:android.permission.READ_CELL_BROADCASTS  


三、使用方式:

先从Activity的使用开始。

[html]  view plain  copy
  1. public class MainActivity extends AppCompatActivity implements PermissionInterface {  
  2.   
  3.     private PermissionHelper mPermissionHelper;  
  4.   
  5.     @Override  
  6.     protected void onCreate(Bundle savedInstanceState) {  
  7.         super.onCreate(savedInstanceState);  
  8.         setContentView(R.layout.activity_main);  
  9.   
  10.         //初始化并发起权限申请  
  11.         mPermissionHelper = new PermissionHelper(this, this);  
  12.         mPermissionHelper.requestPermissions();  
  13.     }  
  14.   
  15.     @Override  
  16.     public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {  
  17.         if(mPermissionHelper.requestPermissionsResult(requestCode, permissions, grantResults)){  
  18.             //权限请求结果,并已经处理了该回调  
  19.             return;  
  20.         }  
  21.         super.onRequestPermissionsResult(requestCode, permissions, grantResults);  
  22.     }  
  23.   
  24.     @Override  
  25.     public int getPermissionsRequestCode() {  
  26.         //设置权限请求requestCode,只有不跟onRequestPermissionsResult方法中的其他请求码冲突即可。  
  27.         return 10000;  
  28.     }  
  29.   
  30.     @Override  
  31.     public String[] getPermissions() {  
  32.         //设置该界面所需的全部权限  
  33.         return new String[]{  
  34.                 Manifest.permission.WRITE_EXTERNAL_STORAGE,  
  35.                 Manifest.permission.READ_PHONE_STATE  
  36.         };  
  37.     }  
  38.   
  39.     @Override  
  40.     public void requestPermissionsSuccess() {  
  41.         //权限请求用户已经全部允许  
  42.         initViews();  
  43.     }  
  44.   
  45.     @Override  
  46.     public void requestPermissionsFail() {  
  47.         //权限请求不被用户允许。可以提示并退出或者提示权限的用途并重新发起权限申请。  
  48.         finish();  
  49.     }  
  50.       
  51.     private void initViews(){  
  52.         //已经拥有所需权限,可以放心操作任何东西了  
  53.           
  54.     }  
  55.   
  56. }  


四、其中使用到的两个类和一个接口实现:

1、Activity需要实现的接口PermissionInterface.java

[html]  view plain  copy
  1. /**  
  2.  * 权限请求接口  
  3.  * Created by dway on 2018/1/10.  
  4.  */  
  5. public interface PermissionInterface {  
  6.   
  7.     /**  
  8.      * 可设置请求权限请求码  
  9.      */  
  10.     int getPermissionsRequestCode();  
  11.   
  12.     /**  
  13.      * 设置需要请求的权限  
  14.      */  
  15.     String[] getPermissions();  
  16.   
  17.     /**  
  18.      * 请求权限成功回调  
  19.      */  
  20.     void requestPermissionsSuccess();  
  21.   
  22.     /**  
  23.      * 请求权限失败回调  
  24.      */  
  25.     void requestPermissionsFail();  
  26.   
  27. }  
2、工具类PermissionUtil.java

[html]  view plain  copy
  1. /**  
  2.  * 动态权限工具类  
  3.  * Created by dway on 2017/1/13.  
  4.  */  
  5. public class PermissionUtil {  
  6.   
  7.     /**  
  8.      * 判断是否有某个权限  
  9.      * @param context  
  10.      * @param permission  
  11.      * @return  
  12.      */  
  13.     public static boolean hasPermission(Context context, String permission){  
  14.         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {  
  15.             if(context.checkSelfPermission(permission)  != PackageManager.PERMISSION_GRANTED){  
  16.                 return false;  
  17.             }  
  18.         }  
  19.         return true;  
  20.     }  
  21.   
  22.     /**  
  23.      * 弹出对话框请求权限  
  24.      * @param activity  
  25.      * @param permissions  
  26.      * @param requestCode  
  27.      */  
  28.     public static void requestPermissions(Activity activity, String[] permissions, int requestCode){  
  29.         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {  
  30.             activity.requestPermissions(permissions, requestCode);  
  31.         }  
  32.     }  
  33.   
  34.     /**  
  35.      * 返回缺失的权限  
  36.      * @param context  
  37.      * @param permissions  
  38.      * @return 返回缺少的权限,null 意味着没有缺少权限  
  39.      */  
  40.     public static String[] getDeniedPermissions(Context context, String[] permissions){  
  41.         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {  
  42.             ArrayList<String> deniedPermissionList = new ArrayList<>();  
  43.             for(String permission : permissions){  
  44.                 if(context.checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED){  
  45.                     deniedPermissionList.add(permission);  
  46.                 }  
  47.             }  
  48.             int size = deniedPermissionList.size();  
  49.             if(size > 0){  
  50.                 return deniedPermissionList.toArray(new String[deniedPermissionList.size()]);  
  51.             }  
  52.         }  
  53.         return null;  
  54.     }  
  55.   
  56. }  
3、权限操作帮助类PermissionHelper.java

[html]  view plain  copy
  1. package com.dway.permission;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.pm.PackageManager;  
  5. import android.support.annotation.NonNull;  
  6.   
  7. /**  
  8.  * 动态权限帮助类  
  9.  * Created by dway on 2018/1/10.  
  10.  */  
  11. public class PermissionHelper {  
  12.   
  13.     private Activity mActivity;  
  14.     private PermissionInterface mPermissionInterface;  
  15.   
  16.     public PermissionHelper(@NonNull Activity activity, @NonNull PermissionInterface permissionInterface) {  
  17.         mActivity = activity;  
  18.         mPermissionInterface = permissionInterface;  
  19.     }  
  20.   
  21.     /**  
  22.      * 开始请求权限。  
  23.      * 方法内部已经对Android M 或以上版本进行了判断,外部使用不再需要重复判断。  
  24.      * 如果设备还不是M或以上版本,则也会回调到requestPermissionsSuccess方法。  
  25.      */  
  26.     public void requestPermissions(){  
  27.         String[] deniedPermissions = PermissionUtil.getDeniedPermissions(mActivity, mPermissionInterface.getPermissions());  
  28.         if(deniedPermissions != null && deniedPermissions.length > 0){  
  29.             PermissionUtil.requestPermissions(mActivity, deniedPermissions, mPermissionInterface.getPermissionsRequestCode());  
  30.         }else{  
  31.             mPermissionInterface.requestPermissionsSuccess();  
  32.         }  
  33.     }  
  34.   
  35.     /**  
  36.      * 在Activity中的onRequestPermissionsResult中调用  
  37.      * @param requestCode  
  38.      * @param permissions  
  39.      * @param grantResults  
  40.      * @return true 代表对该requestCode感兴趣,并已经处理掉了。false 对该requestCode不感兴趣,不处理。  
  41.      */  
  42.     public boolean requestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults){  
  43.         if(requestCode == mPermissionInterface.getPermissionsRequestCode()){  
  44.             boolean isAllGranted = true;//是否全部权限已授权  
  45.             for(int result : grantResults){  
  46.                 if(result == PackageManager.PERMISSION_DENIED){  
  47.                     isAllGranted = false;  
  48.                     break;  
  49.                 }  
  50.             }  
  51.             if(isAllGranted){  
  52.                 //已全部授权  
  53.                 mPermissionInterface.requestPermissionsSuccess();  
  54.             }else{  
  55.                 //权限有缺失  
  56.                 mPermissionInterface.requestPermissionsFail();  
  57.             }  
  58.             return true;  
  59.         }  
  60.         return false;  
  61.     }  
  62.       
  63. }  


OK,完成。哪个Activity需要权限就实现接口,其他用帮助类就全部搞定。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值