一、权限处理工具类:
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* CreateTime 2017/9/26 22:35
* Author LiuShiHua
* Description:权限校验——未获取到权限就去申请
*/
public class PermissionUtil {
private Activity activity;
private final PackageManager pm;
public static final int PERMISSION_REQUEST = 0x99;//权限申请码
public static final int SETTING_REQUEST = 0x100;//APP设置码
private static PermissionUtil util;
public interface OnPermissionCheckListener {
void onChecked(boolean isAllowed);//是否准许
void onError();//申请权限报错
}
public static PermissionUtil getInstance(Activity activity) {
if (util == null) {
util = new PermissionUtil(activity);
}
return util;
}
private PermissionUtil(Activity activity) {
this.activity = activity;
pm = activity.getPackageManager();
}
/**
* 判断当前应用有无权限,没有权限,则去申请
* <p>
* onRequestPermissionsResult中返回申请状况(activity中)
*
* @param permissionStr 类似Manifest.permission.WRITE_EXTERNAL_STORAGE
*/
public void checkAndRequestPermission(String permissionStr, OnPermissionCheckListener listener) {
if (permissionStr == null) return;
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {//6.0以上才需要获取权限
listener.onChecked(true);
return;
}
//判断有无权限
boolean isPermissionGranted = (ContextCompat.checkSelfPermission(activity, permissionStr) == PackageManager.PERMISSION_GRANTED);
if (listener != null) {
listener.onChecked(isPermissionGranted);
}
if (!isPermissionGranted) {//没有相关权限则去申请
try {
ActivityCompat.requestPermissions(activity, new String[]{permissionStr}, PERMISSION_REQUEST);
} catch (Exception e) {
if (listener != null) listener.onError();
e.printStackTrace();
}
}
}
/**
* 判断当前应用有无权限,没有权限,则去申请
* <p>
* onRequestPermissionsResult中返回申请状况(activity中)
*
* @param permissionStrs 类似Manifest.permission.WRITE_EXTERNAL_STORAGE
*/
public void checkAndRequestPermissions(String[] permissionStrs, OnPermissionCheckListener listener) {
if (permissionStrs == null) return;
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {//6.0以上才需要获取权限
listener.onChecked(true);
return;
}
List<String> perList = Arrays.asList(permissionStrs);
List<String> temp = new ArrayList<>();
for (int i = 0; i < perList.size(); i++) {
int state = ContextCompat.checkSelfPermission(activity, perList.get(i));
if (state != PackageManager.PERMISSION_GRANTED) {//判断有无权限
temp.add(perList.get(i));
}
}
if (temp.size() > 0) {//没有相关权限则去申请
if (listener != null) {
listener.onChecked(false);
}
try {
ActivityCompat.requestPermissions(activity, temp.toArray(new String[temp.size()]), PERMISSION_REQUEST);
} catch (Exception e) {
if (listener != null) listener.onError();
e.printStackTrace();
}
} else {
if (listener != null)
listener.onChecked(true);
}
}
/**
* 提示用户哪些是未授权的权限
* 只返回权限信息
*
* @param permissions
* @param grantResults 0是被允许,-1是被拒绝
*/
public String getNeedUserSetPerStr(String[] permissions, int[] grantResults) {
StringBuffer buffer = new StringBuffer();
for (int i = 0; i < grantResults.length; i++) {
if (grantResults[i] == PackageManager.PERMISSION_DENIED) {//被拒绝
buffer.append(getDENIEDPermissionNoticeStr(permissions[i]) + "、");
}
}
if (buffer.toString().length() == 0)
return null;
return buffer.toString().substring(0, (buffer.toString().length() - 1));
}
//设置应用的权限
public void setAppSettings(final Activity activity) {
if (activity != null)
new AlertDialog.Builder(activity).setTitle("温馨提示")
.setMessage("是否进入APP设置界面进行权限设置?")
.setNegativeButton("否", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
dialogInterface.dismiss();
}
})
.setPositiveButton("是", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
dialogInterface.dismiss();
goToSet(activity);
}
})
.setCancelable(true)
.show();
}
//进入APP设置界面
public void goToSet(Activity activity) {
String SETTINGS_ACTION = "android.settings.APPLICATION_DETAILS_SETTINGS";
Intent intent = new Intent()
.setAction(SETTINGS_ACTION)
.setData(Uri.fromParts("package", activity.getPackageName(), null));
activity.startActivityForResult(intent, SETTING_REQUEST);
}
//获取权限对应的中文提示
private String getDENIEDPermissionNoticeStr(String permission) {
switch (permission) {
case "android.permission.CAMERA":
return "相机";
case "android.permission.ACCESS_FINE_LOCATION":
return "GPS";
case "android.permission.READ_EXTERNAL_STORAGE":
return "读写手机存储";
case "android.permission.WRITE_EXTERNAL_STORAGE":
return "读写手机存储";
case "android.permission.READ_PHONE_STATE":
return "获取手机信息";
case "android.permission.ACCESS_COARSE_LOCATION":
return "获取位置";
case "android.permission.RECORD_AUDIO":
return "录音";
case "android.permission.READ_CONTACTS":
return "读取联系人列表";
case "android.permission.WRITE_CONTACTS":
return "写入联系人";
case "android.permission.ACCESS_WIFI_STATE":
return "读取WIFI信息";
case "android.permission.CHANGE_WIFI_STATE":
return "该表WIFI状态";
case "android.permission.SEND_SMS":
return "发送短信";
case "android.permission.READ_SMS":
return "读取短信";
case "android.permission.RECEIVE_SMS":
return "接收短信";
}
return "";
}
/**
* 常见权限
* 按需要求添加到getDENIEDPermissionNoticeStr()
*
android.permission-group.CALENDAR
android.permission.READ_CALENDAR //读取用户的日程信息
android.permission.WRITE_CALENDAR //写入用户的日程信息
android.permission-group.CAMERA
android.permission.CAMERA //相机
android.permission-group.CONTACTS
android.permission.READ_CONTACTS //读取联系人列表
android.permission.WRITE_CONTACTS //写入联系人
android.permission.GET_ACCOUNTS //访问GMail账户列表
android.permission-group.LOCATION
android.permission.ACCESS_FINE_LOCATION //GPS定位
android.permission.ACCESS_COARSE_LOCATION //通过WiFi或移动基站的方式获取用户错略的经纬度信息
android.permission.ACCESS_WIFI_STATE //WiFi接入的状态以及WLAN热点的信息
android.permission.CHANGE_WIFI_STATE //改变WiFi状态
android.permission.BLUETOOTH_ADMIN //发现和配对新的蓝牙设备
android.permission-group.MICROPHONE
android.permission.RECORD_AUDIO //录音
android.permission-group.PHONE
android.permission.READ_PHONE_STATE //获取手机信息
android.permission.CALL_PHONE //拨号
android.permission.READ_CALL_LOG //获取拨号记录
android.permission.WRITE_CALL_LOG //写入拨号记录
com.android.voicemail.permission.ADD_VOICEMAIL
android.permission.USE_SIP //允许程序使用SIP视频服务
android.permission.PROCESS_OUTGOING_CALLS //允许程序监视,修改或放弃播出电话
android.permission-group.SENSORS
android.permission.BODY_SENSORS
android.permission-group.SMS //短信
android.permission.SEND_SMS //发送短信
android.permission.RECEIVE_SMS //接收短信
android.permission.READ_SMS //读取短信
android.permission.RECEIVE_WAP_PUSH //接收WAP PUSH信息
android.permission.RECEIVE_MMS //接收彩信
android.permission.READ_CELL_BROADCASTS
android.permission-group.STORAGE //读写手机存储卡
android.permission.READ_EXTERNAL_STORAGE
android.permission.WRITE_EXTERNAL_STORAGE
android.permission.CLEAR_APP_CACHE //清除应用缓存
android.permission.CLEAR_APP_USER_DATA //清除应用的用户数据
android.permission.DELETE_PACKAGES //允许程序删除应用
android.permission.READ_FRAME_BUFFER //读取帧缓存用于屏幕截图
*
*/
}
二、调用方法(获取PermissionUtil对象后)
private MapLocationUtil permissionUtil = PermissionUtil.getInstance(this);
private boolean isPermissionOk = false;
//单个权限申请
permissionUtil.checkAndRequestPermission(Manifest.permission.CAMERA, new PermissionUtil.OnPermissionCheckListener() {
@Override
public void onChecked(boolean isAllowed) {
}
@Override
public void onError() {
}
});
//多个权限申请
private void checkPermissions() {//定位权限申请
PermissionUtil.getInstance(this).checkAndRequestPermissions(new String[]{
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE}, new PermissionUtil.OnPermissionCheckListener() {
@Override
public void onChecked(boolean isAllowed) {
isPermissionOk = isAllowed;
}
@Override
public void onError() {
}
});
}
三、在Activity中重写onRequestPermissionsResult方法
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (isExit) return;//判断是否已经退出activity
if (!isPermissionOk && grantResults.length == 0) {
Toast.makeText(this, "请手动授权", Toast.LENGTH_SHORT).show();
PermissionUtil.getInstance(this).setAppSettings(this);
return;
}
String s = PermissionUtil.getInstance(this).getNeedUserSetPerStr(permissions, grantResults);
if (s == null) {//所有权限被允许
isPermissionOk = true;
} else {
//权限被拒绝,提示
Toast.makeText(this, "权限被拒绝:" + s + ",请手动授权", Toast.LENGTH_SHORT).show();
PermissionUtil.getInstance(this).setAppSettings(this);
}
}
备注:
PermissionUtil中的判断种类不一定全面,不全面的可以自行添加