在android高版本上有些权限是需要动态去申请的,现有模板共享之。
PermissionInterface.java:
public interface PermissionInterface {
/**
* 可设置请求权限请求码
*/
int getPermissionsRequestCode();
/**
* 设置需要请求的权限
*/
String[] getPermissions();
/**
* 请求权限成功回调
*/
void requestPermissionsSuccess();
/**
* 请求权限失败回调
*/
void requestPermissionsFail();
}
PermissionUtil.java:
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;
}
}
PermissionHelper.java:
public class PermissionHelper {
private Activity mActivity;
private PermissionInterface mPermissionInterface;
public PermissionHelper(Activity activity, 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 {
Log.d("wujiang","requestPermissions");
mPermissionInterface.requestPermissionsSuccess();
}
}
/**
* 在Activity中的onRequestPermissionsResult中调用
*
* @param requestCode
* @param permissions
* @param grantResults
* @return true 代表对该requestCode感兴趣,并已经处理掉了。false 对该requestCode不感兴趣,不处理。
*/
public boolean requestPermissionsResult(int requestCode, String[] permissions, 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;
}
}
让主activity implements PermissionInterface并实现其方法:
public static final int REQUEST_CODE = 10;
@Override
public int getPermissionsRequestCode() {
return REQUEST_CODE;
}
@Override
public String[] getPermissions() {
//设置该界面所需的全部权限
return new String[]{
Manifest.permission.RECORD_AUDIO,
Manifest.permission.MODIFY_AUDIO_SETTINGS
};
}
@Override
public void requestPermissionsSuccess() {
//权限申请成功,做你想做的事情吧
}
@Override
public void requestPermissionsFail() {
//权限请求不被用户允许。可以提示并退出或者提示权限的用途并重新发起权限申请。
Log.d("wujiang","requestPermissionsFail");
Toast.makeText(this, "Your have no permission ", Toast.LENGTH_LONG).show();
}
在主activity的oncreate里调用:
//初始化并发起权限申请 mPermissionHelper = new PermissionHelper(this, this); mPermissionHelper.requestPermissions();
在主activity里实现如下方法:
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if(mPermissionHelper.requestPermissionsResult(requestCode, permissions, grantResults)){
//权限请求结果,并已经处理了该回调
return;
}
}
THE END
602





