直接上代码
package com.example.deviceinfo.util;
public class Permission {
/**
* 请求码
*/
public int requestCode;
/**
* Manifest.permission.***
*/
public String permission;
/**
* 是否有权限
*/
public boolean hasPermission;
public Permission(int requestCode, String permission, boolean hasPermission) {
this.requestCode = requestCode;
this.permission = permission;
this.hasPermission = hasPermission;
}
}
package com.example.deviceinfo.util;
import android.Manifest;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Build;
import java.util.ArrayList;
import java.util.List;
/**
* 描述: 动态权限管理类
* 该类会自动判断系统版本,如果高于23,则会动态申请权限
*/
@SuppressLint("NewApi") public class Permissions {
private static List<Permission> permissions = new ArrayList<Permission>();
public static boolean need;//需要动态申请权限
static {
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M) {
need = true;
initPermissions();
}
}
public static void addPermission(Permission permission){
if(need) {
permissions.add(permission);
}
}
/**
* 初始化权限
*/
private static void initPermissions() {
if(need) {
// TODO: 2017/7/28 在此声明所需 动态添加 权限
//单个权限
/*addPermission(Manifest.permission.READ_EXTERNAL_STORAGE);
addPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE);*/
// 多组权限
addPermissions(
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.BLUETOOTH_ADMIN,
Manifest.permission.ACCESS_WIFI_STATE,
Manifest.permission.CHANGE_WIFI_STATE,
Manifest.permission.BLUETOOTH
);
}
}
private static int index = 0;
/**
* 请求所有权限
* @param activity
*/
public static void requestPermissionAll(Activity activity){
if(need) {
if(index>=permissions.size())
return;
Permission permission = permissions.get(index);
boolean succeed = RequestPermissionUtil.requestPermission(activity, permission.permission, permission.requestCode);
permission.hasPermission = succeed;
index++;
if(succeed){
requestPermissionAll(activity);
}
}
}
/**
* 改变权限的状态
* @param permission 权限名
* @param success 是否请求成功
*/
public static void changePermissionState(Activity activity, String permission, boolean success){
if(need) {
findPermission(permission).hasPermission = success;
}
requestPermissionAll(activity);
}
public static Permission findPermission(String permission){
if(need) {
for (Permission p : permissions) {
if (p.permission.equals(permission)) {
return p;
}
}
}
return addPermission(permission);
}
public static Permission addPermission(String permission){
if(need) {
Permission p = new Permission(permissions.size(), permission, false);
permissions.add(p);
return p;
}
return null;
}
public static void addPermissions(String ... permissions){
for (String permission : permissions) {
if(need) {
Permission p = new Permission(Permissions.permissions.size(), permission, false);
Permissions.permissions.add(p);
}
}
}
/**
* 检查用户是否授权
* @param permission
* @return
*/
public static boolean checkPermission(String permission){
if(need) {
return findPermission(permission).hasPermission;
}
return true;
}
public static void requestPermission(Activity activity,Permission permission){
if(need) {
RequestPermissionUtil.requestPermission(activity, permission.permission, permission.requestCode);
}
}
}
package com.example.deviceinfo.util;
import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageManager;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
/**
* 描述: TODO
*/
public class RequestPermissionUtil {
/**
* @param permission Manifest.permission.***
* @return
*/
public static boolean requestPermission(Activity activity,String permission,int requestCode){
//检查权限: 检查用户是不是已经授权
int checkSelfPermission = ContextCompat.checkSelfPermission(activity.getApplication(), permission);
//拒绝 : 检查到用户之前拒绝授权
if(checkSelfPermission == PackageManager.PERMISSION_DENIED){
//申请权限
ActivityCompat.requestPermissions(activity,new String[]{permission},requestCode);
}else if(checkSelfPermission == PackageManager.PERMISSION_GRANTED){
//已经授权
return true;
}else {
ActivityCompat.requestPermissions(activity,new String[]{permission},requestCode);
}
return false;
}
}
使用方法
- 将三个工具类复制到项目中
- 需要在 Activity 中重新下方法, 作用是判断权限是否请求成功 :
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if(grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Permissions.changePermissionState(this,permissions[0],true);
}
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
3.在Activity onCreate中(或别的地方) 调用 requestPermissionAll 方法将触发申请权限 :
Permissions.requestPermissionAll(this);
4.在工具类 Permissions 中 , 在 initPermissions() 方法中加入所需动态申请的所有权限:
/**
* 初始化权限
*/
private static void initPermissions() {
if(need) {
// TODO: 2017/7/28 在此声明所需 动态添加 权限
addPermission(Manifest.permission.READ_EXTERNAL_STORAGE);// 添加单个权限
addPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE);
addPermissions(//添加多个权限
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.READ_PHONE_STATE
);
}
}