package com.example.user.myapplication;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.provider.Settings;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import java.util.ArrayList;
import java.util.List;
/**
* 使用步骤四步
* 方式一:
* 1,实现LPermissionsCallback;
* 2,在需要的地方创建LPermissions 对象;
* 3,重写activity的onRequestLPermissionsResult方法,直接将参数传递给LPermissions.onRequestLPermissionsResult
* 4,实现gotPermissionsAndDo()方法
* 方式二:
* 内部类实现方式,代码臃肿,但灵活度高
*/
public class LPermissions {
public static final int LPermissions_REQUEST_CODE = 1111;
String[] permissions = new String[]{};//Manifest.permission.CALL_PHONE, Manifest.permission.WRITE_EXTERNAL_STORAGE};
List<String> mPermissionList = new ArrayList<String>();//未授予权限列表
AppCompatActivity activity = null;
LPermissionsCallback lPermissionsCallback = null;
public LPermissions(AppCompatActivity activity, String[] permisssions, LPermissionsCallback lPermissionsCallback){
this.permissions = permisssions;
this.activity = activity;
this.lPermissionsCallback = lPermissionsCallback;
checkPermissions();
requestPermissions();
}
private void checkPermissions() {
if(Build.VERSION.SDK_INT < 23)
return;
/** * 判断哪些权限未授予 */
mPermissionList.clear();
for (int i = 0; i < permissions.length; i++) {
if (ContextCompat.checkSelfPermission(activity, permissions[i]) != PackageManager.PERMISSION_GRANTED) {
mPermissionList.add(permissions[i]);
}
}
}
private void requestPermissions(){
if(Build.VERSION.SDK_INT < 23)
return;
/** * 判断是否为空 */
if (mPermissionList.isEmpty()) {
//未授予的权限为空,表示都授予了
lPermissionsCallback.gotPermissionsAndDo();
} else {
//请求权限方法
String[] permissions = mPermissionList.toArray(new String[mPermissionList.size()]);//将List转为数组
ActivityCompat.requestPermissions(activity, permissions, LPermissions_REQUEST_CODE);
}
}
public void onRequestLPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode) {
case LPermissions_REQUEST_CODE:
for (int i = 0; i < grantResults.length; i++) {
if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
//判断是否勾选禁止后不再询问
boolean showRequestPermission = ActivityCompat.shouldShowRequestPermissionRationale(activity, permissions[i]);
if (showRequestPermission) {//
// ActivityCompat.requestPermissions(this, new String[]{permissions[i]}, 1);//重新申请权限
//
}else {
showPermissionDialog();
} return;
}
}
lPermissionsCallback.gotPermissionsAndDo();
break;
default:
break;
}
}
/**
* 不再提示权限 时的展示对话框
* */
AlertDialog mPermissionDialog;
private void showPermissionDialog() {
if (mPermissionDialog == null) {
mPermissionDialog = new AlertDialog.Builder(activity)
.setMessage("已禁用权限,请手动授予")
.setPositiveButton("设置" , new DialogInterface.OnClickListener() {//设置
@Override public void onClick(DialogInterface dialog, int which) {
cancelPermissionDialog();
Uri packageURI = Uri.parse("package:" + activity.getPackageName());
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, packageURI);
activity.startActivity(intent);
}
}).setNegativeButton("取消", new DialogInterface.OnClickListener() {//"取消"
@Override public void onClick(DialogInterface dialog, int which) {
cancelPermissionDialog();
}
}).create();
}
mPermissionDialog.show();
}
private void cancelPermissionDialog() {
mPermissionDialog.cancel();
}
interface LPermissionsCallback{
void gotPermissionsAndDo();
}
}
上面只是一个思路,后经过思考之后,写了一个完整库,并通过中间activity的方式,实现了与activity 的解耦,地址:https://github.com/sadpup/MiniPermission
欢迎拍砖!