Android之APP跳转到权限设置界面适配华为、小米、vivo等

public class PermissionUtil {
    private final String TAG = "PermissionUtil";
    private Activity mContext;
    private BaseUIFragment mFragment;
    //自己的项目包名
    private String packageName = "";
    private static PermissionUtil Instance;

    public static PermissionUtil getInstance(Activity context) {
        if (Instance == null) {
            Instance = new PermissionUtil(context);
        }
        return Instance;
    }

    public static PermissionUtil getInstance(BaseUIFragment mFragment) {
        if (Instance == null) {
            Instance = new PermissionUtil(mFragment);
        }
        return Instance;
    }

    public PermissionUtil(Activity context) {
        this.mContext = context;
        this.packageName = mContext.getPackageName();
    }

    public PermissionUtil(BaseUIFragment mFragment) {
        this.mFragment = mFragment;
        this.packageName = mContext.getPackageName();
    }

    public void GoToSetting() {
        goIntentSetting();
    }

private void goIntentSetting() {
        try {
            Intent intent = new Intent();
            intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
            intent.addCategory(Intent.CATEGORY_DEFAULT);
            intent.setData(Uri.parse("package:" + mContext.getPackageName()));
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
            intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
            if (mContext != null) {
                mContext.startActivityForResult(intent, Constant.PERMISSION_SETTING_FOR_RESULT);
            } else if (mFragment != null) {
                mFragment.startActivityForResult(intent, Constant.PERMISSION_SETTING_FOR_RESULT);
            }
        } catch (Exception e) {
            e.printStackTrace();
            String name = Build.MANUFACTURER;
            LogUtil.e(TAG, "jumpPermissionPage --- name : " + name);
            switch (name) {
                case "HUAWEI":
                    goHuaWeiMainager();
                    break;
                case "vivo":
                    goVivoMainager();
                    break;
                case "OPPO":
                    goOppoMainager();
                    break;
                case "Coolpad":
                    goCoolpadMainager();
                    break;
                case "Meizu":
                    goMeizuMainager();
                    break;
                case "Xiaomi":
                    goXiaoMiMainager();
                    break;
                case "Sony":
                    goSonyMainager();
                    break;
                case "LG":
                    goLGMainager();
                    break;
                default:
                    systemConfig();
                    break;
            }
        }

    }

    private void goLGMainager() {
        try {
            Intent intent = new Intent(packageName);
            ComponentName comp = new ComponentName("com.android.settings", "com.android.settings.Settings$AccessLockSummaryActivity");
            intent.setComponent(comp);
            if (mContext != null) {
                mContext.startActivityForResult(intent, Constant.PERMISSION_SETTING_FOR_RESULT);
            } else if (mFragment != null) {
                mFragment.startActivityForResult(intent, Constant.PERMISSION_SETTING_FOR_RESULT);
            }
        } catch (Exception e) {
            e.printStackTrace();
            systemConfig();
        }

    }

    private void goSonyMainager() {
        try {
            Intent intent = new Intent(packageName);
            ComponentName comp = new ComponentName("com.sonymobile.cta", "com.sonymobile.cta.SomcCTAMainActivity");
            intent.setComponent(comp);
            if (mContext != null) {
                mContext.startActivityForResult(intent, Constant.PERMISSION_SETTING_FOR_RESULT);
            } else if (mFragment != null) {
                mFragment.startActivityForResult(intent, Constant.PERMISSION_SETTING_FOR_RESULT);
            }
        } catch (Exception e) {
            e.printStackTrace();
            systemConfig();
        }

    }

    private void goHuaWeiMainager() {
        try {
            Intent intent = new Intent(packageName);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            ComponentName comp = new ComponentName("com.huawei.systemmanager", "com.huawei.permissionmanager.ui.MainActivity");
            intent.setComponent(comp);
            if (mContext != null) {
                mContext.startActivityForResult(intent, Constant.PERMISSION_SETTING_FOR_RESULT);
            } else if (mFragment != null) {
                mFragment.startActivityForResult(intent, Constant.PERMISSION_SETTING_FOR_RESULT);
            }
        } catch (Exception e) {
            e.printStackTrace();
            systemConfig();
        }

    }

    private static 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 goXiaoMiMainager() {
        String rom = getMiuiVersion();
        LogUtil.e(TAG, "goMiaoMiMainager --- rom : " + rom);
        Intent intent = new Intent();
        if ("V6".equals(rom) || "V7".equals(rom)) {
            intent.setAction("miui.intent.action.APP_PERM_EDITOR");
            intent.setClassName("com.miui.securitycenter", "com.miui.permcenter.permissions.AppPermissionsEditorActivity");
            intent.putExtra("extra_pkgname", packageName);
            if (mContext != null) {
                mContext.startActivityForResult(intent, Constant.PERMISSION_SETTING_FOR_RESULT);
            } else if (mFragment != null) {
                mFragment.startActivityForResult(intent, Constant.PERMISSION_SETTING_FOR_RESULT);
            }
        } else if ("V8".equals(rom) || "V9".equals(rom)) {
            intent.setAction("miui.intent.action.APP_PERM_EDITOR");
            intent.setClassName("com.miui.securitycenter", "com.miui.permcenter.permissions.PermissionsEditorActivity");
            intent.putExtra("extra_pkgname", packageName);
            if (mContext != null) {
                mContext.startActivityForResult(intent, Constant.PERMISSION_SETTING_FOR_RESULT);
            } else if (mFragment != null) {
                mFragment.startActivityForResult(intent, Constant.PERMISSION_SETTING_FOR_RESULT);
            }
        } else {
            systemConfig();
        }
    }

    private void goMeizuMainager() {
        try {
            Intent intent = new Intent("com.meizu.safe.security.SHOW_APPSEC");
            intent.addCategory(Intent.CATEGORY_DEFAULT);
            intent.putExtra("packageName", packageName);
            if (mContext != null) {
                mContext.startActivityForResult(intent, Constant.PERMISSION_SETTING_FOR_RESULT);
            } else if (mFragment != null) {
                mFragment.startActivityForResult(intent, Constant.PERMISSION_SETTING_FOR_RESULT);
            }
        } catch (ActivityNotFoundException localActivityNotFoundException) {
            localActivityNotFoundException.printStackTrace();
            systemConfig();
        }

    }

  

    /**
     * 系统设置界面
     */
    private void systemConfig() {
        Intent intent = new Intent(Settings.ACTION_SETTINGS);
        if (mContext != null) {
            mContext.startActivityForResult(intent, Constant.PERMISSION_SETTING_FOR_RESULT);
        } else if (mFragment != null) {
            mFragment.startActivityForResult(intent, Constant.PERMISSION_SETTING_FOR_RESULT);
        }
    }

    private void goOppoMainager() {
        doStartApplicationWithPackageName("com.coloros.safecenter");
    }

    /**
     * doStartApplicationWithPackageName("com.yulong.android.security:remote")
     * <p>
     * 和Intent open = getPackageManager().getLaunchIntentForPackage("com.yulong.android.security:remote");
     * <p>
     * startActivity(open);
     * <p>
     * 本质上没有什么区别,通过Intent open...打开比调用doStartApplicationWithPackageName方法更快,也是android本身提供的方法
     */

    private void goCoolpadMainager() {
        doStartApplicationWithPackageName("com.yulong.android.security:remote");
    }

    private void goVivoMainager() {
        doStartApplicationWithPackageName("com.bairenkeji.icaller");
    }

    /**
     * 此方法在手机各个机型设置中已经失效
     *
     * @return
     */

    private Intent getAppDetailSettingIntent() {
        Intent localIntent = new Intent();
        localIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        localIntent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
        localIntent.setData(Uri.fromParts("package", mContext.getPackageName(), null));
        return localIntent;
    }

    private void doStartApplicationWithPackageName(String packagename) {
        // 通过包名获取此APP详细信息,包括Activities、services、versioncode、name等等
        PackageInfo packageinfo = null;
        try {
            packageinfo = mContext.getPackageManager().getPackageInfo(packagename, 0);
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        if (packageinfo == null) {
            return;
        }
        // 创建一个类别为CATEGORY_LAUNCHER的该包名的Intent
        Intent resolveIntent = new Intent(Intent.ACTION_MAIN, null);
        resolveIntent.addCategory(Intent.CATEGORY_LAUNCHER);
        resolveIntent.setPackage(packageinfo.packageName);
        // 通过getPackageManager()的queryIntentActivities方法遍历
        List<ResolveInfo> resolveinfoList = mContext.getPackageManager()
                .queryIntentActivities(resolveIntent, 0);
        LogUtil.e("PermissionPageManager", "resolveinfoList" + resolveinfoList.size());
        for (int i = 0; i < resolveinfoList.size(); i++) {
            LogUtil.e("PermissionPageManager", resolveinfoList.get(i).activityInfo.packageName + resolveinfoList.get(i).activityInfo.name);
        }

        ResolveInfo resolveinfo = resolveinfoList.iterator().next();
        if (resolveinfo != null) {
            // packageName参数2 = 参数 packname
            String packageName = resolveinfo.activityInfo.packageName;
            // 这个就是我们要找的该APP的LAUNCHER的Activity[组织形式:packageName参数2.mainActivityname]
            String className = resolveinfo.activityInfo.name;
            // LAUNCHER Intent
            Intent intent = new Intent(Intent.ACTION_MAIN);
            intent.addCategory(Intent.CATEGORY_LAUNCHER);
            // 设置ComponentName参数1:packageName参数2:MainActivity路径
            ComponentName cn = new ComponentName(packageName, className);
            intent.setComponent(cn);
            try {
                if (mContext != null) {
                    mContext.startActivityForResult(intent, Constant.PERMISSION_SETTING_FOR_RESULT);
                } else if (mFragment != null) {
                    mFragment.startActivityForResult(intent, Constant.PERMISSION_SETTING_FOR_RESULT);
                }
            } catch (Exception e) {
                systemConfig();
                e.printStackTrace();
            }
        }
    }
}

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
华为手机上,可以通过 BadgeProvider 提供的 API 来设置应用的角标数。具体实现方法如下: 1. 首先,需要在 AndroidManifest.xml 文件中注册一个广播接收器,用于接收设置应用角标数的请求。代码如下: ```xml <receiver android:name=".BadgeReceiver" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="android.intent.action.BADGE_COUNT_UPDATE" /> <action android:name="android.intent.action.PACKAGE_REPLACED" /> <data android:scheme="package" /> </intent-filter> </receiver> ``` 2. 在 BadgeReceiver 中处理接收到的设置应用角标数的请求。代码如下: ```java public class BadgeReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction() != null) { switch (intent.getAction()) { case "android.intent.action.BADGE_COUNT_UPDATE": // 获取应用的包名和角标数 String packageName = intent.getStringExtra("badge_package_name"); int badgeCount = intent.getIntExtra("badge_count", 0); // 设置应用的角标数 setBadgeCount(context, packageName, badgeCount); break; case "android.intent.action.PACKAGE_REPLACED": // 应用更新后需要重新设置角标数 setBadgeCount(context, context.getPackageName(), 0); break; } } } /** * 设置应用的角标数 */ private void setBadgeCount(Context context, String packageName, int badgeCount) { try { Bundle extras = new Bundle(); extras.putString("package", packageName); extras.putString("class", getLauncherClassName(context)); extras.putInt("badgenumber", badgeCount); context.getContentResolver().call(Uri.parse("content://com.huawei.android.launcher.settings/badge/"), "change_badge", null, extras); } catch (Exception e) { e.printStackTrace(); } } /** * 获取应用的启动 Activity 的类名 */ private String getLauncherClassName(Context context) { PackageManager pm = context.getPackageManager(); Intent intent = new Intent(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_LAUNCHER); intent.setPackage(context.getPackageName()); List<ResolveInfo> resolveInfos = pm.queryIntentActivities(intent, 0); if (resolveInfos != null && resolveInfos.size() > 0) { return resolveInfos.get(0).activityInfo.name; } return ""; } } ``` 3. 在应用中设置角标数时,可以通过 Intent 来发送广播请求。代码如下: ```java int badgeCount = 10; Intent intent = new Intent("android.intent.action.BADGE_COUNT_UPDATE"); intent.putExtra("badge_package_name", getPackageName()); intent.putExtra("badge_count", badgeCount); sendBroadcast(intent); ``` 需要注意的是,华为手机上的角标数设置功能只在 EMUI 4.1 及以上版本上支持。如果您的应用需要在其他手机上设置角标数,可以使用第三方库 ShortcutBadger。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值