https://github.com/AriaLyy/Aria/issues/367
This commit is contained in:
@@ -0,0 +1,143 @@
|
||||
package com.arialyy.frame.permission;
|
||||
|
||||
import android.annotation.TargetApi;
|
||||
import android.app.Activity;
|
||||
import android.os.Build;
|
||||
import android.provider.Settings;
|
||||
import android.support.v4.app.Fragment;
|
||||
import android.util.SparseArray;
|
||||
|
||||
import com.arialyy.frame.util.show.L;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Created by lyy on 2016/4/11.
|
||||
* 权限管理工具类
|
||||
*/
|
||||
@TargetApi(Build.VERSION_CODES.M) public class PermissionManager implements OnPermissionCallback {
|
||||
private static final String TAG = "PermissionManager";
|
||||
private PermissionUtil mPu;
|
||||
private SparseArray<OnPermissionCallback> mCallbacks = new SparseArray<>();
|
||||
private static volatile PermissionManager INSTANCE = null;
|
||||
private static final Object LOCK = new Object();
|
||||
|
||||
public static PermissionManager getInstance() {
|
||||
if (INSTANCE == null) {
|
||||
synchronized (LOCK) {
|
||||
INSTANCE = new PermissionManager();
|
||||
}
|
||||
}
|
||||
return INSTANCE;
|
||||
}
|
||||
|
||||
private PermissionManager() {
|
||||
mPu = PermissionUtil.getInstance();
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查权限
|
||||
*
|
||||
* @param permission 需要检查的权限
|
||||
* @return true:已经授权
|
||||
*/
|
||||
public boolean checkPermission(Activity activity, String permission) {
|
||||
return mPu.checkPermission(activity, permission);
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查权限
|
||||
*
|
||||
* @param permission 需要检查的权限
|
||||
* @return true:已经授权
|
||||
*/
|
||||
public boolean checkPermission(Fragment fragment, String permission) {
|
||||
Activity activity = fragment.getActivity();
|
||||
return checkPermission(activity, permission);
|
||||
}
|
||||
|
||||
/**
|
||||
* 申请悬浮框权限
|
||||
*
|
||||
* @param obj obj 只能是Activity、Fragment 的子类及其衍生类
|
||||
*/
|
||||
public void requestAlertWindowPermission(Object obj, OnPermissionCallback callback) {
|
||||
int hashCode = Arrays.hashCode(new String[] { Settings.ACTION_MANAGE_OVERLAY_PERMISSION });
|
||||
registerCallback(callback, hashCode);
|
||||
mPu.requestAlertWindowPermission(obj);
|
||||
}
|
||||
|
||||
/**
|
||||
* 申请修改系统设置权限
|
||||
*
|
||||
* @param obj obj 只能是Activity、Fragment 的子类及其衍生类
|
||||
*/
|
||||
public void requestWriteSettingPermission(Object obj, OnPermissionCallback callback) {
|
||||
int hashCode = Arrays.hashCode(new String[] { Settings.ACTION_MANAGE_WRITE_SETTINGS });
|
||||
registerCallback(callback, hashCode);
|
||||
mPu.requestWriteSetting(obj);
|
||||
}
|
||||
|
||||
/**
|
||||
* 申请权限
|
||||
*
|
||||
* @param obj Activity || Fragment
|
||||
* @param permission 权限
|
||||
*/
|
||||
public void requestPermission(Object obj, OnPermissionCallback callback, String... permission) {
|
||||
requestPermission(obj, "", callback, registerCallback(obj, callback, permission));
|
||||
}
|
||||
|
||||
/**
|
||||
* 申请权限
|
||||
*
|
||||
* @param obj Activity || Fragment
|
||||
* @param hint 如果框对话框包含“不再询问”选择框的时候的提示用语。
|
||||
* @param permission 权限
|
||||
*/
|
||||
private void requestPermission(Object obj, String hint, OnPermissionCallback callback,
|
||||
String... permission) {
|
||||
mPu.requestPermission(obj, hint, 0, registerCallback(obj, callback, permission));
|
||||
}
|
||||
|
||||
private void registerCallback(OnPermissionCallback callback, int hashCode) {
|
||||
OnPermissionCallback c = mCallbacks.get(hashCode);
|
||||
if (c == null) {
|
||||
mCallbacks.append(hashCode, callback);
|
||||
}
|
||||
}
|
||||
|
||||
private String[] registerCallback(Object obj, OnPermissionCallback callback,
|
||||
String... permission) {
|
||||
List<String> list = mPu.checkPermission(obj, permission);
|
||||
if (list == null || list.size() == 0) {
|
||||
return null;
|
||||
}
|
||||
String[] denyPermission = mPu.list2Array(list);
|
||||
int hashCode = Arrays.hashCode(denyPermission);
|
||||
OnPermissionCallback c = mCallbacks.get(hashCode);
|
||||
if (c == null) {
|
||||
mCallbacks.append(hashCode, callback);
|
||||
}
|
||||
return denyPermission;
|
||||
}
|
||||
|
||||
@Override public void onSuccess(String... permissions) {
|
||||
int hashCode = Arrays.hashCode(permissions);
|
||||
OnPermissionCallback c = mCallbacks.get(hashCode);
|
||||
if (c != null) {
|
||||
c.onSuccess(permissions);
|
||||
mCallbacks.remove(hashCode);
|
||||
}
|
||||
}
|
||||
|
||||
@Override public void onFail(String... permissions) {
|
||||
int hashCode = Arrays.hashCode(permissions);
|
||||
OnPermissionCallback c = mCallbacks.get(hashCode);
|
||||
if (c != null) {
|
||||
c.onFail(permissions);
|
||||
mCallbacks.remove(hashCode);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user