动态申请权限
2020-03-28 本文已影响0人
名字不想带英文
建议直接找框架,这个看看就行。说到底感觉封装后用起来还是不方便
public class PermissionHelper {
private final int GET_PERMISSION_REQUEST = 100; //权限申请自定义码
public static final int REQUEST_PERMISSION = 1234;
private boolean hasAlwaysDenied = false;//是否彻底拒绝过
private String[] Permissions;
private PermissionInterface permissionInterface;
public void setPermissionInterface(PermissionInterface permissionInterface) {
this.permissionInterface = permissionInterface;
}
private Activity activity;
public PermissionHelper(Activity activity) {
this.activity = activity;
}
public void setPermissions(String[] pers, PermissionInterface permissionInterface) {
Permissions = pers;
this.permissionInterface = permissionInterface;
checkPermission();
}
public void checkPermission() {
ActivityCompat.requestPermissions(activity, Permissions, GET_PERMISSION_REQUEST);
}
public void dealRequestCode(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == GET_PERMISSION_REQUEST) {
boolean isGranted = true;
hasAlwaysDenied = false;
for (int i = 0; i < grantResults.length; i++) {
if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
isGranted = false;
if (!hasAlwaysDenied) {
if (!ActivityCompat.shouldShowRequestPermissionRationale(activity, Permissions[i])) {//true表示被拒绝的权限可以调起窗口
hasAlwaysDenied = true;
break;
}
}
}
}
if (!isGranted) {
showTipDialg();
} else {
if (permissionInterface != null) {
permissionInterface.PermissionSuc();
}
//"权限申请成功";
}
}
}
private AlertDialog tipDialog;
private void showTipDialg() {
if (tipDialog == null) {
tipDialog = new AlertDialog.Builder(activity)
.setTitle("通知")
.setMessage("没有读写和手机设备权限无法使用微课堂,是否去设置?")
.setCancelable(false)
.setPositiveButton("去设置", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (hasAlwaysDenied) {//彻底拒绝,调到手机权限页面叫用户自己去开启权限
goPermissionSetting(activity);
} else {//重新再吊起一遍权限申请
checkPermission();
}
dialog.dismiss();
}
})
.setNegativeButton("拒绝", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
activity.finish();
}
}).create();
}
if (!tipDialog.isShowing()) {
tipDialog.show();
}
}
public interface PermissionInterface {
void PermissionSuc();
}
// TODO: 2020/9/22 各机型调起跳转权限页面
public void goPermissionSetting(Activity activity) {
String deviceType = Build.MANUFACTURER.toLowerCase();//获取设备类型小写(例:xiaomi)
if (deviceType.equals("xiaomi")) {
activity.startActivityForResult(xiaomiApi(activity), REQUEST_PERMISSION);
} else if (deviceType.equals("huawei")) {
activity.startActivityForResult(huaweiApi(activity), REQUEST_PERMISSION);
} else if (deviceType.equals("oppo")) {
activity.startActivityForResult(oppoApi(activity), REQUEST_PERMISSION);
} else if (deviceType.equals("meizu")) {
activity.startActivityForResult(meizuApi(activity), REQUEST_PERMISSION);
} else if (deviceType.equals("vivo")) {
activity.startActivityForResult(vivoApi(activity), REQUEST_PERMISSION);
} else if (deviceType.equals("samsung")) {
activity.startActivityForResult(defaultApi(activity), REQUEST_PERMISSION);
} else if (deviceType.equals("sony")) {
goSonyManager(activity);
} else if (deviceType.equals("lg")) {
goLGManager(activity);
} else if (deviceType.equals("letv")) {
goLetvManager(activity);
} else if (deviceType.equals("qiku") || deviceType.equals("360")) {
go360Manager(activity);
} else {
activity.startActivityForResult(defaultApi(activity), REQUEST_PERMISSION);
}
}
// 索尼
private void goSonyManager(Context context) {
try {
Intent intent = new Intent(BuildConfig.APPLICATION_ID);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
ComponentName comp = new ComponentName("com.sonymobile.cta", "com.sonymobile.cta.SomcCTAMainActivity");
intent.setComponent(comp);
context.startActivity(intent);
} catch (Exception e) {
goAppDetailSetting(context);
}
}
// LG
private void goLGManager(Context context) {
try {
Intent intent = new Intent("android.intent.action.MAIN");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra("packageName", BuildConfig.APPLICATION_ID);
ComponentName comp = new ComponentName("com.android.settings", "com.android.settings.Settings$AccessLockSummaryActivity");
intent.setComponent(comp);
context.startActivity(intent);
} catch (Exception e) {
goAppDetailSetting(context);
}
}
// 乐视
private void goLetvManager(Context context) {
try {
Intent intent = new Intent();
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra("packageName", BuildConfig.APPLICATION_ID);
ComponentName comp = new ComponentName("com.letv.android.letvsafe", "com.letv.android.letvsafe.PermissionAndApps");
intent.setComponent(comp);
context.startActivity(intent);
} catch (Exception e) {
goAppDetailSetting(context);
}
}
//360只能打开到自带安全软件
private void go360Manager(Context context) {
try {
Intent intent = new Intent("android.intent.action.MAIN");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra("packageName", BuildConfig.APPLICATION_ID);
ComponentName comp = new ComponentName("com.qihoo360.mobilesafe", "com.qihoo360.mobilesafe.ui.index.AppEnterActivity");
intent.setComponent(comp);
context.startActivity(intent);
} catch (Exception e) {
goAppDetailSetting(context);
}
}
private static String getSystemProperty(String key, String defaultValue) {
try {
Class<?> clz = Class.forName("android.os.SystemProperties");
Method get = clz.getMethod("get", String.class, String.class);
return (String) get.invoke(clz, key, defaultValue);
} catch (Exception e) {
}
return defaultValue;
}
private static Intent defaultApi(Context context) {
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(Uri.fromParts("package", context.getPackageName(), null));
return intent;
}
private static boolean hasActivity(Context context, Intent intent) {
PackageManager packageManager = context.getPackageManager();
return packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY).size() > 0;
}
private static String getSystemProperty(String propName) {
BufferedReader input = null;
try {
Process p = Runtime.getRuntime().exec("getprop " + propName);
input = new BufferedReader(new InputStreamReader(p.getInputStream()), 1024);
return input.readLine();
} catch (IOException ex) {
return "";
} finally {
if (input != null) {
try {
input.close();
} catch (IOException ignored) {
}
}
}
}
private static Intent huaweiApi(Context context) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
return defaultApi(context);
}
Intent intent = new Intent();
intent.setComponent(new ComponentName("com.huawei.systemmanager", "com.huawei.permissionmanager.ui.MainActivity"));
return intent;
}
private static final String MIUI_VERSION_NAME = "ro.miui.ui.version.name";
private static Intent xiaomiApi(Context context) {
String version = getSystemProperty(MIUI_VERSION_NAME);
if (TextUtils.isEmpty(version) || version.contains("7") || version.contains("8")) {
Intent intent = new Intent("miui.intent.action.APP_PERM_EDITOR");
intent.putExtra("extra_pkgname", context.getPackageName());
return intent;
}
return defaultApi(context);
}
private static Intent vivoApi(Context context) {
Intent intent = new Intent();
intent.putExtra("packagename", context.getPackageName());
intent.setComponent(new ComponentName("com.vivo.permissionmanager", "com.vivo.permissionmanager.activity.SoftPermissionDetailActivity"));
if (hasActivity(context, intent)) return intent;
intent.setComponent(new ComponentName("com.iqoo.secure", "com.iqoo.secure.safeguard.SoftPermissionDetailActivity"));
return intent;
}
private static Intent oppoApi(Context context) {
Intent intent = new Intent();
intent.putExtra("packageName", context.getPackageName());
intent.setComponent(new ComponentName("com.color.safecenter", "com.color.safecenter.permission.PermissionManagerActivity"));
return intent;
}
private static Intent meizuApi(Context context) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
return defaultApi(context);
}
Intent intent = new Intent("com.meizu.safe.security.SHOW_APPSEC");
intent.putExtra("packageName", context.getPackageName());
intent.setComponent(new ComponentName("com.meizu.safe", "com.meizu.safe.security.AppSecActivity"));
return intent;
}
private void goAppDetailSetting(Context context) {
Intent localIntent = new Intent();
localIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
localIntent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
localIntent.setData(Uri.fromParts("package", BuildConfig.APPLICATION_ID, null));
try {
context.startActivity(localIntent);
} catch (Exception e) {
Toast.makeText(context, e.getMessage() + "", Toast.LENGTH_SHORT).show();
e.printStackTrace();
}
}
}
使用例子
private String[] Permissions = {
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_PHONE_STATE
};
public void initPermission() {
permissionHelper = new PermissionHelper(ShootActivity.this);
permissionHelper.setPermissions(Permissions, new PermissionHelper.PermissionInterface() {
@Override
public void PermissionSuc() {
LogUtil.i("权限申请成功");
}
});
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
permissionHelper.dealRequestCode(requestCode, permissions, grantResults);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == PermissionHelper.REQUEST_PERMISSION) {
permissionHelper.checkPermission();
}
}