整理成工具类:
/**
* The type Permissions util.
*
* 注意事项:
* 需要在第一次调用或者直接在HomeApplication中初始化 @see initPermissionsUtil(applicationId);
* mApplicationId = mApplicationId 需要确认是否引入正确的包
*/
public class PermissionsUtil {
private String mApplicationId = "";
private PermissionsUtil(){}
public static PermissionsUtil getInstance(){
return holder.mInstance;
}
private static class holder{
private static final PermissionsUtil mInstance = new PermissionsUtil();
}
public interface CallBack {
void cancelCallBack();
}
public void initPermissionsUtil(String applicationId){
mApplicationId = applicationId;
}
public void showPermissionsSettingDialog(final Activity activity, final String title, final CallBack callBack) {
AlertDialog mAlertDialog = new AlertDialog.Builder(activity)
.setMessage(title)
.setCancelable(false)
.setNegativeButton("取消", (dialog, which) -> {
dialog.dismiss();
callBack.cancelCallBack();
})
.setPositiveButton("前往", (dialog, which) -> {
dialog.dismiss();
jumpPermissionPage(activity);
}).show();
}
public boolean hasSomePermissionsDenied(@NonNull String[] permissions, @NonNull int[] grantResults){
for(int i = 0; i < grantResults.length; i++){
if(grantResults[i] == -1){
return true;
}
}
return false;
}
//*******************************************************************************************
//***************************************私有方法*********************************************
//*******************************************************************************************
private void jumpPermissionPage(Activity activity){
if (RomUtil.isMiui()) {
jumpToMiuiManager(activity);
} else if (RomUtil.isEmui()) {
jumpToEmuiManager(activity);
} else if (RomUtil.isOppo()) {
jumpToOppoManager(activity);
} else if (RomUtil.isFlyme()) {
jumpToFlymeManager(activity);
} else if (RomUtil.is360()) {
jumpTo360Manager(activity);
} else {
jumpToAppDetailSetting(activity);
}
}
private void jumpTo360Manager(Activity activity){
try {
Intent intent = new Intent("android.intent.action.MAIN");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra("packageName", mApplicationId);
ComponentName comp = new ComponentName("com.qihoo360.mobilesafe", "com.qihoo360.mobilesafe.ui.index.AppEnterActivity");
intent.setComponent(comp);
activity.startActivity(intent);
} catch (Exception e) {
jumpToAppDetailSetting(activity);
e.printStackTrace();
}
}
private void jumpToFlymeManager(Activity activity){
try {
Intent intent = new Intent("com.meizu.safe.security.SHOW_APPSEC");
intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.putExtra("packageName", mApplicationId);
activity.startActivity(intent);
} catch (Exception e) {
jumpToAppDetailSetting(activity);
e.printStackTrace();
}
}
private void jumpToOppoManager(Activity activity){
try {
Intent intent = new Intent();
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra("packageName", mApplicationId);
ComponentName comp = new ComponentName("com.color.safecenter", "com.color.safecenter.permission.PermissionManagerActivity");
intent.setComponent(comp);
activity.startActivity(intent);
}catch (Exception e) {
jumpToAppDetailSetting(activity);
e.printStackTrace();
}
}
private void jumpToMiuiManager(Activity activity) {
String rom = getMiuiVersion();
try {
Intent intent = new Intent();
if ("V5" == rom) {
Uri packageURI = Uri.parse("package:" + mApplicationId);
intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, packageURI);
} else if ("V6" == rom || "V7" == rom) {
intent.setAction("miui.intent.action.APP_PERM_EDITOR");
intent.setClassName("com.miui.securitycenter", "com.miui.permcenter.permissions.AppPermissionsEditorActivity");
intent.putExtra("extra_pkgname", mApplicationId);
} else if ("V8" == rom || "V9" == rom) {
intent.setAction("miui.intent.action.APP_PERM_EDITOR");
intent.setClassName("com.miui.securitycenter", "com.miui.permcenter.permissions.PermissionsEditorActivity");
intent.putExtra("extra_pkgname", mApplicationId);
} else {
jumpToAppDetailSetting(activity);
}
activity.startActivity(intent);
} catch (Exception e) {
jumpToAppDetailSetting(activity);
e.printStackTrace();
}
}
private String getMiuiVersion() {
String propName = "ro.miui.ui.version.name";
String line;
BufferedReader input = null;
try {
Process p = Runtime.getRuntime().exec("getprop " + propName);
input = new BufferedReader(new InputStreamReader(p.getInputStream()), 1024);
line = input.readLine();
input.close();
} catch (IOException ex) {
ex.printStackTrace();
return null;
} finally {
try {
input.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return line;
}
private void jumpToEmuiManager(Activity activity) {
try {
Intent intent = new Intent();
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra("packageName", mApplicationId);
ComponentName comp = new ComponentName("com.huawei.systemmanager", "com.huawei.permissionmanager.ui.MainActivity");
intent.setComponent(comp);
activity.startActivity(intent);
} catch (Exception e) {
jumpToAppDetailSetting(activity);
e.printStackTrace();
}
}
private void jumpToAppDetailSetting(Activity activity) {
Intent localIntent = new Intent();
localIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
if (Build.VERSION.SDK_INT >= 9) {
localIntent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
localIntent.setData(Uri.fromParts("package", mApplicationId, null));
} else if (Build.VERSION.SDK_INT <= 8) {
localIntent.setAction(Intent.ACTION_VIEW);
localIntent.setClassName("com.android.settings", "com.android.settings.InstalledAppDetails");
localIntent.putExtra("com.android.settings.ApplicationPkgName", mApplicationId);
}
try {
activity.startActivity(localIntent);
} catch (Exception e) {
e.printStackTrace();
}
}
}
注释:
一、ComponentName里的参数代表什么?
1.先打开当前应用的系统权限界面
2.然后通过ADB命令查看当前activity。可以使用:
adb shell dumpsys activity activities
或者
adb shell dumpsys activity top
第一个参数是权限界面的包名,第二个手机权限界面的类名,既然知道包名与类名自然可以打开该Activity。
例如:
二、如果还有疑问,action为何不一样呢?
Intent intent = new Intent("com.meizu.safe.security.SHOW_APPSEC");
执行命令,可以看出Intent的act是什么:
adb shell dumpsys activity activities