1.接口类,由Activity负责实现
/**
* ${description}
* Created by gyq on 2018/7/16.
*/
public interface PermissionInterface {
/**
* 可设置请求权限请求码
*/
int getPermissionsRequestCode();
/**
* 设置需要请求的权限
*/
String[] getPermissions();
/**
* 请求权限成功回调
*/
void requestPermissionsSuccess();
/**
* 请求权限失败回调
*/
void requestPermissionsFail();
}
2.帮助类
/**
* 权限申请帮助类,权限申请和对申请结果的处理
* Created by gyq on 2018/7/16.
*/
public class PermissionHelper {
private Activity mActivity;
private PermissionInterface mPermissionInterface;
public PermissionHelper(@NonNull Activity activity, @NonNull PermissionInterface permissionInterface) {
mActivity = activity;
mPermissionInterface = permissionInterface;
}
/**
* 开始请求权限。
* 方法内部已经对Android M 或以上版本进行了判断,外部使用不再需要重复判断。
* 如果设备还不是M或以上版本,则也会回调到requestPermissionsSuccess方法。
*/
public void requestPermissions(){
String[] deniedPermissions = PermissionUtil.getDeniedPermissions(mActivity, mPermissionInterface.getPermissions());
if(deniedPermissions != null && deniedPermissions.length > 0){
PermissionUtil.requestPermissions(mActivity, deniedPermissions, mPermissionInterface.getPermissionsRequestCode());
}else{
mPermissionInterface.requestPermissionsSuccess();
}
}
/**
* 在Activity中的onRequestPermissionsResult中调用
* @param requestCode
* @param permissions
* @param grantResults
* @return true 代表对该requestCode感兴趣,并已经处理掉了。false 对该requestCode不感兴趣,不处理。
*/
public boolean requestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults){
if(requestCode == mPermissionInterface.getPermissionsRequestCode()){
//是否全部权限已授权
boolean isAllGranted = true;
for(int result : grantResults){
if(result == PackageManager.PERMISSION_DENIED){
isAllGranted = false;
break;
}
}
if(isAllGranted){
//已全部授权
mPermissionInterface.requestPermissionsSuccess();
}else{
//权限有缺失
mPermissionInterface.requestPermissionsFail();
}
return true;
}
return false;
}
}
3.工具类
public class PermissionUtil {
/**
* 判断是否有某个权限
* @param context
* @param permission
* @return
*/
public static boolean hasPermission(Context context, String permission){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if(context.checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED){
return false;
}
}
return true;
}
/**
* 弹出对话框请求权限
* @param activity
* @param permissions
* @param requestCode
*/
public static void requestPermissions(Activity activity, String[] permissions, int requestCode){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
activity.requestPermissions(permissions, requestCode);
}
}
/**
* 返回缺失的权限
* @param context
* @param permissions
* @return 返回缺少的权限,null 意味着没有缺少权限
*/
public static String[] getDeniedPermissions(Context context, String[] permissions){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
ArrayList<String> deniedPermissionList = new ArrayList<>();
for(String permission : permissions){
if(context.checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED){
deniedPermissionList.add(permission);
}
}
int size = deniedPermissionList.size();
if(size > 0){
return deniedPermissionList.toArray(new String[deniedPermissionList.size()]);
}
}
return null;
}
}
4.使用案例
Activity 实现接口
接口方法的实现,权限回调处理
网友评论