Android6.0运行时权限。

本文系转载,原文地址:http://blog.csdn.net/yechaoa/article/details/61920584




一、集成三方库PermissionsDispatcher



1.添加依赖

a. project目录下的build.gradle文件

[java]  view plain  copy
  1. classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'  
b. app目录下的build.gradle文件
[java]  view plain  copy
  1. compile 'com.github.hotchemi:permissionsdispatcher:2.2.0'  
  2. apt 'com.github.hotchemi:permissionsdispatcher-processor:2.2.0'  


2.给Activity或者Fragment注册

[java]  view plain  copy
  1. @RuntimePermissions  
  2. public class LoginActivity extends <span style="font-size: 18px;">AppCompatActivity</span>{  
因为考虑到兼容性,所以Activity得继承AppCompatActivity

3.实现五个方法

[java]  view plain  copy
  1. /** 
  2.      * 处理当用户允许该权限时需要处理的方法(括号里面是当前需要请求的权限) 
  3.      */  
  4.     @NeedsPermission(Manifest.permission.READ_PHONE_STATE)  
  5.     void doACacheNeedsPermission() {  
  6.         //do something  
  7.     }  
  8.     @OnShowRationale(Manifest.permission.READ_PHONE_STATE)  
  9.     void ACacheShowRationale(PermissionRequest request) {  
  10.         request.proceed(); // 提示用户权限使用的对话框  
  11.     }  
  12.   
  13.     @OnNeverAskAgain(Manifest.permission.READ_PHONE_STATE)  
  14.     void ACacheOnNeverAskAgain() {  
  15.         new AlertDialog.Builder(this)  
  16.                 .setPositiveButton("重新设置"new DialogInterface.OnClickListener() {  
  17.                     @Override  
  18.                     public void onClick(@NonNull DialogInterface dialog, int which) {  
  19.                         Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);  
  20.                         intent.setData(Uri.parse("package:" + getPackageName()));  
  21.                         startActivity(intent);  
  22.                     }  
  23.                 })  
  24.                 .setNegativeButton("取消"null)  
  25.                 .setCancelable(false)  
  26.                 .setMessage("您已拒绝授予权限")  
  27.                 .show();  
  28.     }  
  29.   
  30.     /** 
  31.      * 如果用户拒绝该权限执行的方法 
  32.      */  
  33.     @OnPermissionDenied(Manifest.permission.READ_PHONE_STATE)  
  34.     void ACacheOnPermissionDenied() {  
  35.         MyUtil.showToast("真的确定拒绝授予权限吗");  
  36.     }  
  37.     /** 
  38.      * 权限请求回调,提示用户之后,用户点击“允许”或者“拒绝”之后调用此方法 
  39.      * @param requestCode  定义的权限编码 
  40.      * @param permissions 权限名称 
  41.      * @param grantResults 允许/拒绝 
  42.      */  
  43.     public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {  
  44.         super.onRequestPermissionsResult(requestCode, permissions, grantResults);  
  45.         LoginActivityPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);  
  46.     }  


4.调用

比如是一个点击事件

[java]  view plain  copy
  1. <span style="white-space:pre">  </span>case R.id.btn:  
  2.                 //6.0权限  
  3.                 LoginActivityPermissionsDispatcher.doACacheNeedsPermissionWithCheck(this);  
  4.                 break;  
LoginActivityPermissionsDispatcher.doACacheNeedsPermissionWithCheck(this);这个文件是没有的,需要build一下就行了。


二、Android6.0M权限管理实战,完美轻量级封装


1.第一步:检测所有的权限是否都已授权

[java]  view plain  copy
  1. /** 
  2.       * 检测所有的权限是否都已授权 
  3.       * 
  4.       * @param permissions 
  5.       * @return 
  6.       */  
  7.      private boolean checkPermissions(String[] permissions) {  
  8.          if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {  
  9.              return true;  
  10.          }  
  11.   
  12.          for (String permission : permissions) {  
  13.              if (ContextCompat.checkSelfPermission(this, permission) !=  
  14.                      PackageManager.PERMISSION_GRANTED) {  
  15.                  return false;  
  16.              }  
  17.          }  
  18.          return true;  
  19.      }  

2.第二步:获取权限集中需要申请权限的列表

[java]  view plain  copy
  1. /** 
  2.     * 获取权限集中需要申请权限的列表 
  3.     * 
  4.     * @param permissions 
  5.     * @return 
  6.     */  
  7.    private List<String> getDeniedPermissions(String[] permissions) {  
  8.        List<String> needRequestPermissionList = new ArrayList<>();  
  9.        for (String permission : permissions) {  
  10.            if (ContextCompat.checkSelfPermission(this, permission) !=  
  11.                    PackageManager.PERMISSION_GRANTED ||  
  12.                    ActivityCompat.shouldShowRequestPermissionRationale(this, permission)) {  
  13.                needRequestPermissionList.add(permission);  
  14.            }  
  15.        }  
  16.        return needRequestPermissionList;  
  17.    }  
3.第三步:请求权限

[java]  view plain  copy
  1. /** 
  2.      * 请求权限 
  3.      * 
  4.      * @param permissions 请求的权限 
  5.      * @param requestCode 请求权限的请求码 
  6.      */  
  7.     public void requestPermission(String[] permissions, int requestCode) {  
  8.         this.REQUEST_CODE_PERMISSION = requestCode;  
  9.         if (checkPermissions(permissions)) {  
  10.             permissionSuccess(REQUEST_CODE_PERMISSION);  
  11.         } else {  
  12.             List<String> needPermissions = getDeniedPermissions(permissions);  
  13.             ActivityCompat.requestPermissions(this, needPermissions.toArray(new String[needPermissions.size()]), REQUEST_CODE_PERMISSION);  
  14.         }  
  15.     }  
4.第四步:处理权限请求回调

[java]  view plain  copy
  1. /** 
  2.     * 系统请求权限回调 
  3.     * 
  4.     * @param requestCode 
  5.     * @param permissions 
  6.     * @param grantResults 
  7.     */  
  8.    @Override  
  9.    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {  
  10.        super.onRequestPermissionsResult(requestCode, permissions, grantResults);  
  11.        if (requestCode == REQUEST_CODE_PERMISSION) {  
  12.            if (verifyPermissions(grantResults)) {  
  13.                permissionSuccess(REQUEST_CODE_PERMISSION);  
  14.            } else {  
  15.                permissionFail(REQUEST_CODE_PERMISSION);  
  16.                showTipsDialog();  
  17.            }  
  18.        }  
  19.    }  
5.第五步:查看处理权限请求回调用户是否已经授权

[java]  view plain  copy
  1. /** 
  2.     * 确认所有的权限是否都已授权 
  3.     * 
  4.     * @param grantResults 
  5.     * @return 
  6.     */  
  7.    private boolean verifyPermissions(int[] grantResults) {  
  8.        for (int grantResult : grantResults) {  
  9.            if (grantResult != PackageManager.PERMISSION_GRANTED) {  
  10.                return false;  
  11.            }  
  12.        }  
  13.        return true;  
  14.    }  
6.第六步:授权成功处理函数

[java]  view plain  copy
  1. /** 
  2.     * 获取权限成功 
  3.     * 
  4.     * @param requestCode 
  5.     */  
  6.    public void permissionSuccess(int requestCode) {  
  7.        Log.d(TAG, "获取权限成功=" + requestCode);  
  8.   
  9.    }  
7.第七步:授权失败处理函数与弹出用户提示

[java]  view plain  copy
  1. /** 
  2.     * 权限获取失败 
  3.     * @param requestCode 
  4.     */  
  5.    public void permissionFail(int requestCode) {  
  6.        Log.d(TAG, "获取权限失败=" + requestCode);  
  7.    }  
  8.   
  9.    /** 
  10.     * 显示提示对话框 
  11.     */  
  12.    private void showTipsDialog() {  
  13.        new AlertDialog.Builder(this)  
  14.                .setTitle("提示信息")  
  15.                .setMessage("当前应用缺少必要权限,该功能暂时无法使用。如若需要,请单击【确定】按钮前往设置中心进行权限授权。")  
  16.                .setNegativeButton("取消"new DialogInterface.OnClickListener() {  
  17.                    @Override  
  18.                    public void onClick(DialogInterface dialog, int which) {  
  19.                    }  
  20.                })  
  21.                .setPositiveButton("确定"new DialogInterface.OnClickListener() {  
  22.                    @Override  
  23.                    public void onClick(DialogInterface dialog, int which) {  
  24.                        startAppSettings();  
  25.                    }  
  26.                }).show();  
  27.    }  
8.第八步:授权失败给用户提示后想再次开启跳到设置app权限界面

[java]  view plain  copy
  1. /** 
  2.     * 启动当前应用设置页面 
  3.     */  
  4.    private void startAppSettings() {  
  5.        Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);  
  6.        intent.setData(Uri.parse("package:" + getPackageName()));  
  7.        startActivity(intent);  
  8.    }  


一)完整代码:

[java]  view plain  copy
  1. package cn.bluemobi.dylan.mpermissions;  
  2.   
  3. import android.content.DialogInterface;  
  4. import android.content.Intent;  
  5. import android.content.pm.PackageManager;  
  6. import android.net.Uri;  
  7. import android.os.Build;  
  8. import android.provider.Settings;  
  9. import android.support.annotation.NonNull;  
  10. import android.support.v4.app.ActivityCompat;  
  11. import android.support.v4.content.ContextCompat;  
  12. import android.support.v7.app.AlertDialog;  
  13. import android.support.v7.app.AppCompatActivity;  
  14. import android.util.Log;  
  15.   
  16. import java.util.ArrayList;  
  17. import java.util.List;  
  18.   
  19. /** 
  20.  * Created by yuandl on 2016-11-16. 
  21.  */  
  22.   
  23. public class MPermissionsActivity extends AppCompatActivity {  
  24.     private final String TAG = "MPermissions";  
  25.     private int REQUEST_CODE_PERMISSION = 0x00099;  
  26.   
  27.     /** 
  28.      * 请求权限 
  29.      * 
  30.      * @param permissions 请求的权限 
  31.      * @param requestCode 请求权限的请求码 
  32.      */  
  33.     public void requestPermission(String[] permissions, int requestCode) {  
  34.         this.REQUEST_CODE_PERMISSION = requestCode;  
  35.         if (checkPermissions(permissions)) {  
  36.             permissionSuccess(REQUEST_CODE_PERMISSION);  
  37.         } else {  
  38.             List<String> needPermissions = getDeniedPermissions(permissions);  
  39.             ActivityCompat.requestPermissions(this, needPermissions.toArray(new String[needPermissions.size()]), REQUEST_CODE_PERMISSION);  
  40.         }  
  41.     }  
  42.   
  43.     /** 
  44.      * 检测所有的权限是否都已授权 
  45.      * 
  46.      * @param permissions 
  47.      * @return 
  48.      */  
  49.     private boolean checkPermissions(String[] permissions) {  
  50.         if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {  
  51.             return true;  
  52.         }  
  53.   
  54.         for (String permission : permissions) {  
  55.             if (ContextCompat.checkSelfPermission(this, permission) !=  
  56.                     PackageManager.PERMISSION_GRANTED) {  
  57.                 return false;  
  58.             }  
  59.         }  
  60.         return true;  
  61.     }  
  62.   
  63.     /** 
  64.      * 获取权限集中需要申请权限的列表 
  65.      * 
  66.      * @param permissions 
  67.      * @return 
  68.      */  
  69.     private List<String> getDeniedPermissions(String[] permissions) {  
  70.         List<String> needRequestPermissionList = new ArrayList<>();  
  71.         for (String permission : permissions) {  
  72.             if (ContextCompat.checkSelfPermission(this, permission) !=  
  73.                     PackageManager.PERMISSION_GRANTED ||  
  74.                     ActivityCompat.shouldShowRequestPermissionRationale(this, permission)) {  
  75.                 needRequestPermissionList.add(permission);  
  76.             }  
  77.         }  
  78.         return needRequestPermissionList;  
  79.     }  
  80.   
  81.   
  82.     /** 
  83.      * 系统请求权限回调 
  84.      * 
  85.      * @param requestCode 
  86.      * @param permissions 
  87.      * @param grantResults 
  88.      */  
  89.     @Override  
  90.     public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {  
  91.         super.onRequestPermissionsResult(requestCode, permissions, grantResults);  
  92.         if (requestCode == REQUEST_CODE_PERMISSION) {  
  93.             if (verifyPermissions(grantResults)) {  
  94.                 permissionSuccess(REQUEST_CODE_PERMISSION);  
  95.             } else {  
  96.                 permissionFail(REQUEST_CODE_PERMISSION);  
  97.                 showTipsDialog();  
  98.             }  
  99.         }  
  100.     }  
  101.   
  102.     /** 
  103.      * 确认所有的权限是否都已授权 
  104.      * 
  105.      * @param grantResults 
  106.      * @return 
  107.      */  
  108.     private boolean verifyPermissions(int[] grantResults) {  
  109.         for (int grantResult : grantResults) {  
  110.             if (grantResult != PackageManager.PERMISSION_GRANTED) {  
  111.                 return false;  
  112.             }  
  113.         }  
  114.         return true;  
  115.     }  
  116.   
  117.     /** 
  118.      * 显示提示对话框 
  119.      */  
  120.     private void showTipsDialog() {  
  121.         new AlertDialog.Builder(this)  
  122.                 .setTitle("提示信息")  
  123.                 .setMessage("当前应用缺少必要权限,该功能暂时无法使用。如若需要,请单击【确定】按钮前往设置中心进行权限授权。")  
  124.                 .setNegativeButton("取消"new DialogInterface.OnClickListener() {  
  125.                     @Override  
  126.                     public void onClick(DialogInterface dialog, int which) {  
  127.                     }  
  128.                 })  
  129.                 .setPositiveButton("确定"new DialogInterface.OnClickListener() {  
  130.                     @Override  
  131.                     public void onClick(DialogInterface dialog, int which) {  
  132.                         startAppSettings();  
  133.                     }  
  134.                 }).show();  
  135.     }  
  136.   
  137.     /** 
  138.      * 启动当前应用设置页面 
  139.      */  
  140.     private void startAppSettings() {  
  141.         Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);  
  142.         intent.setData(Uri.parse("package:" + getPackageName()));  
  143.         startActivity(intent);  
  144.     }  
  145.   
  146.     /** 
  147.      * 获取权限成功 
  148.      * 
  149.      * @param requestCode 
  150.      */  
  151.     public void permissionSuccess(int requestCode) {  
  152.         Log.d(TAG, "获取权限成功=" + requestCode);  
  153.   
  154.     }  
  155.   
  156.     /** 
  157.      * 权限获取失败 
  158.      * @param requestCode 
  159.      */  
  160.     public void permissionFail(int requestCode) {  
  161.         Log.d(TAG, "获取权限失败=" + requestCode);  
  162.     }  
  163. }  
二)用法:

1.布局文件activity_main.xml

[java]  view plain  copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     xmlns:tools="http://schemas.android.com/tools"  
  4.     android:id="@+id/activity_main"  
  5.     android:layout_width="match_parent"  
  6.     android:layout_height="match_parent"  
  7.     android:orientation="vertical"  
  8.     android:paddingBottom="@dimen/activity_vertical_margin"  
  9.     android:paddingLeft="@dimen/activity_horizontal_margin"  
  10.     android:paddingRight="@dimen/activity_horizontal_margin"  
  11.     android:paddingTop="@dimen/activity_vertical_margin"  
  12.     tools:context="cn.bluemobi.dylan.mpermissions.MainActivity">  
  13.   
  14.     <TextView  
  15.         android:layout_width="wrap_content"  
  16.         android:layout_height="wrap_content"  
  17.         android:text="Hello World!" />  
  18.   
  19.     <Button  
  20.         android:id="@+id/button"  
  21.         android:layout_width="match_parent"  
  22.         android:layout_height="wrap_content"  
  23.         android:onClick="onClick1"  
  24.         android:text="打电话" />  
  25.   
  26.     <Button  
  27.         android:id="@+id/button2"  
  28.         android:layout_width="match_parent"  
  29.         android:layout_height="wrap_content"  
  30.         android:onClick="onClick2"  
  31.         android:text="写SD卡" />  
  32.   
  33.     <Button  
  34.         android:id="@+id/button3"  
  35.         android:layout_width="match_parent"  
  36.         android:layout_height="wrap_content"  
  37.         android:onClick="onClick3"  
  38.         android:text="拍照" />  
  39. </LinearLayout>  
2.MainActivity中使用:继承MPermissionsActivity即可

[java]  view plain  copy
  1. package cn.bluemobi.dylan.mpermissions;  
  2.   
  3. import android.Manifest;  
  4. import android.content.Intent;  
  5. import android.net.Uri;  
  6. import android.os.Bundle;  
  7. import android.view.View;  
  8.   
  9. public class MainActivity extends MPermissionsActivity {  
  10.   
  11.     @Override  
  12.     protected void onCreate(Bundle savedInstanceState) {  
  13.         super.onCreate(savedInstanceState);  
  14.         setContentView(R.layout.activity_main);  
  15.     }  
  16.   
  17.     /** 
  18.      * 打电话 
  19.      * 
  20.      * @param view 
  21.      */  
  22.     public void onClick1(View view) {  
  23.         requestPermission(new String[]{Manifest.permission.CALL_PHONE}, 0x0001);  
  24.     }  
  25.   
  26.     /** 
  27.      * 写SD卡 
  28.      * 
  29.      * @param view 
  30.      */  
  31.     public void onClick2(View view) {  
  32.         requestPermission(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 0x0002);  
  33.     }  
  34.   
  35.     /** 
  36.      * 拍照 
  37.      * 
  38.      * @param view 
  39.      */  
  40.     public void onClick3(View view) {  
  41.         requestPermission(new String[]{Manifest.permission.CAMERA}, 0x0003);  
  42.     }  
  43.   
  44.     /** 
  45.      * 权限成功回调函数 
  46.      * 
  47.      * @param requestCode 
  48.      */  
  49.     @Override  
  50.     public void permissionSuccess(int requestCode) {  
  51.         super.permissionSuccess(requestCode);  
  52.         switch (requestCode) {  
  53.             case 0x0001:  
  54.                 Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:13468857714"));  
  55.                 startActivity(intent);  
  56.                 break;  
  57.         }  
  58.   
  59.     }  
  60.   
  61. }  


轻量级封装原链接:http://blog.csdn.net/linglongxin24/article/details/53189359
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值