美文网首页安卓Android 开发相关文章收集Android开发收藏夹
Android各大手机品牌手机跳转到权限管理界面

Android各大手机品牌手机跳转到权限管理界面

作者: b77535296c81 | 来源:发表于2016-10-15 16:09 被阅读11248次

    概述

    最近项目中遇到这样个需求场景:<br > 当我们的用户使用App时不小心拒绝了某项必要权限,而导致无法正常使用。这时候希望重新去打开该权限,那么问题来了,Android厂家定制的room五花八门,很多时候却发现找不到权限管理的入口。为了解决这一问题,如果我们应用中直接提供权限管理入口给用户,是不是会很方便的解决用户这一困扰呢?经过一番研究,整理出了大部分国产手机直接打开权限管理界面的方法:

    华为

    Intent intent = new Intent();
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.putExtra("packageName", BuildConfig.APPLICATION_ID);
    ComponentName comp = new ComponentName("com.huawei.systemmanager", "com.huawei.permissionmanager.ui.MainActivity");
    intent.setComponent(comp);
    startActivity(intent);
    

    魅族

    Intent intent = new Intent("com.meizu.safe.security.SHOW_APPSEC");
    intent.addCategory(Intent.CATEGORY_DEFAULT);
    intent.putExtra("packageName", BuildConfig.APPLICATION_ID);
    startActivity(intent);
    

    小米

    Intent intent = new Intent("miui.intent.action.APP_PERM_EDITOR");
    ComponentName componentName = new ComponentName("com.miui.securitycenter", "com.miui.permcenter.permissions.AppPermissionsEditorActivity");
    intent.setComponent(componentName);
    intent.putExtra("extra_pkgname", BuildConfig.APPLICATION_ID);
    startActivity(intent);
    

    索尼

    Intent intent = new Intent();
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.putExtra("packageName", BuildConfig.APPLICATION_ID);
                        ComponentName comp = new ComponentName("com.sonymobile.cta", "com.sonymobile.cta.SomcCTAMainActivity");
    intent.setComponent(comp);
    startActivity(intent);
    

    OPPO

    Intent intent = new Intent();
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.putExtra("packageName", BuildConfig.APPLICATION_ID);
                        ComponentName comp = new ComponentName("com.color.safecenter", "com.color.safecenter.permission.PermissionManagerActivity");
    intent.setComponent(comp);
    startActivity(intent);
    

    LG

    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);
    startActivity(intent);
    

    乐视

    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);
    

    360手机(只能打开到自带安全软件)

    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);
    startActivity(intent);
    

    由于资源和能力有限,只研究这些,其他厂家的适配,可以引导用户到系统设置页面,或者应用信息(有些厂家会直接在应用信息提供权限管理入口);提一下,对于三星手机,尝试过很多方法,但都没能成功,自己项目中是直接引导用户到应用信息页面。下面是两个通用的方法,一个是引导至系统设置页面,另一个引导至应用信息页面:

    应用信息界面

    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", getPackageName(), 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", getPackageName());
     }
     startActivity(localIntent);
    

    系统设置界面

    Intent intent =  new Intent(Settings.ACTION_SETTINGS);
    startActivity(intent);
    

    补充

    1、手机的Build.MANUFACTURER,仅供参照,不排除个别厂家有作更改,有没列到或者修正的欢迎小伙伴们留言,后续更新,谢谢
    华为——Huawei
    魅族——Meizu
    小米——Xiaomi
    索尼——Sony
    oppo——OPPO
    LG——LG
    vivo——vivo
    三星——samsung
    乐视——Letv
    中兴——ZTE
    酷派——YuLong
    联想——LENOVO
    
    2、6.0权限检查示例代码
     if (Build.VERSION.SDK_INT >= 23) {
                if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
                    // 没有权限
                    if(ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CALL_PHONE)){
                        //如果没勾选“不再询问”,向用户发起权限请求
                        ActivityCompat.requestPermissions((Activity) mContext, new String[]{Manifest.permission.CALL_PHONE}, 0);
                    }else{
                        //之前点击了“不再询问”,无法再次弹出权限申请框。
                        //可以给Toast提示,或者Dialog反馈给用户,引导去开启相应权限
    
                        // 去应用信息
                        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", mContext.getPackageName(), 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", mContext.getPackageName());
                        }
                    }
                } else {
                    // 有权限,接着你要干的活
                }
            } else {
                // 6.0之前的系统,因为无法获取权限的状态,直接执行需要权限的操作
            }
    
    3、小伙伴补充的,小米系统适配代码 感谢@name__repeated童鞋
            String rom = getMiuiVersion();
            Intent intent = null;
            if (ROM_MIUI_V5.equals(rom)) {
    
                Uri packageURI = Uri.parse("package:" + context.getApplicationInfo().packageName);
                intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, packageURI);
    
    
            } else if (ROM_MIUI_V6.equals(rom) || ROM_MIUI_V7.equals(rom)) {
                intent = new Intent("miui.intent.action.APP_PERM_EDITOR");
                intent.setClassName("com.miui.securitycenter", "com.miui.permcenter.permissions.AppPermissionsEditorActivity");
                intent.putExtra("extra_pkgname", context.getPackageName());
            } else {
    
    
            }
    
    2017/9/1补充MIUI8,感谢@fighting_goat童鞋
        String rom = getMiuiVersion();
        Intent intent = null;
        if (ROM_MIUI_V5.equals(rom)) {
    
            Uri packageURI = Uri.parse("package:" + context.getApplicationInfo().packageName);
            intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, packageURI);
    
    
        } else if (ROM_MIUI_V6.equals(rom) || ROM_MIUI_V7.equals(rom)) {
            intent = new Intent("miui.intent.action.APP_PERM_EDITOR");
            intent.setClassName("com.miui.securitycenter", "com.miui.permcenter.permissions.AppPermissionsEditorActivity");
            intent.putExtra("extra_pkgname", context.getPackageName());
        } else if(ROM_MIUI_V8.equals(rom)){
            intent = new Intent("miui.intent.action.APP_PERM_EDITOR");
            intent.setClassName("com.miui.securitycenter", "com.miui.permcenter.permissions.PermissionsEditorActivity");
            intent.putExtra("extra_pkgname", context.getPackageName());
        }else{
        }
    

    相关文章

      网友评论

      • 6734bd8f0a1b:小米怕是个傻子,改来改去的
      • Android轮子哥:推荐一个,一句代码搞定权限请求,从未如此简单 https://www.jianshu.com/p/c69ff8a445ed
      • 93c39496f4f6:其实判断型号,然后匹配包名+类名就可以跳转了,
        可以使用adb shell dumpsys activity top获取包名+类名,但是,假如厂商把类名改了怎么办,比如miui7/8,有没有什么更简单的方法获取
      • 都是些什么人啊:华为的貌似不行了,我找的另外的一个:
        val intent = Intent()
        intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
        val comp = ComponentName("com.huawei.systemmanager", "com.huawei.permissionmanager.ui.MainActivity")
        intent.component = comp
        context.startActivity(intent)
      • 飞线oOO:不知道是怎么适配出来的?有方法或者教程吗?现在有些内容还是会有点过时,需要能自己去配置新的跳转。楼主授人以鱼不如授人以渔呀!
      • 我是无穷:没有vivo的设置跳转吗?
      • pal_xie:@_陈小平 关于最后补充的oppo跳转, 其实是跳转到通知权限页面, 我发错了, 麻烦删掉, 以免给被人造成困扰, sorry
      • HONGQUAN:感谢分享~
      • a_simple_coder:魅族跳不过去,没有报异常,现象是一闪而过,请问知道是什么原因么?
        手机型号是魅蓝 note2
        Android 5.1
      • 念念不忘_2016:oppo R9 用这两个方法都不行为啥?有遇到的同志吗?
        念念不忘_2016:@pal_xie 这个是我的参数,我对比了感觉没问题啊
        Intent intent = new Intent();
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.putExtra("pkg_name", activity.getPackageName());
        intent.putExtra("app_name", activity.getString(R.string.app_name));
        intent.putExtra("class_name", "com.example.ActivityWork");
        ComponentName comp = new ComponentName("com.coloros.notificationmanager", "com.coloros.notificationmanager.AppDetailPreferenceActivity");
        intent.setComponent(comp);
        activity.startActivity(intent);
        pal_xie:不行就用我新添加的试试
        pal_xie: 我的测试ok啊, 你看看putExtra()里面填写的信息对不对
      • aeee4e772699:魅族的 没打开管家就 就打不开管家界面,oppo的找不到路径, 其他的暂时没机子测
      • 人海中一只羊:MIUI8上的权限管理界面名字改了com.miui.securitycenter/com.miui.permcenter.permissions.PermissionsEditorActivity
        93c39496f4f6:打开安全中心,权限管理,adb shell dumpsys activity top查包名+类名,确实改名字了
        a7ae621de2c0:根本没有改好吗,我这的MIUI8,用这个AppPermissionsEditorActivity才是正确的。
        b77535296c81:感谢分享
      • Kueenie_dadb:楼主,问下,为什么有的权限设置需要添加new_task,有的不需要呢?
        人海中一只羊:这个应该是跟你跳转时使用的context有关 如果是activity的context应该就不用 new_task标志位.
      • sens_bingo:好文章,希望能继续收集:smile:
      • Bury丶冬天:MIUI8上面的方法根本不能用,跳转不过去,请问有没有什么更好的解决方法
        93c39496f4f6:miui8需要做一些改动
        Intent intent = new Intent("miui.intent.action.APP_PERM_EDITOR");
        ComponentName componentName = new ComponentName("com.miui.securitycenter", "com.miui.permcenter.permissions.PermissionsEditorActivity");
        intent.setComponent(componentName);
        intent.putExtra("extra_pkgname", activity.getPackageName());
        activity.startActivity(intent);
        8以下把类名最后加上App
      • CROAD:挺不错的,我们公司没测试机。 权限动态设置里面,我是使用第三方的框架,对安卓6.0以上效果。安卓6.0以下的权限,直接操作,用户在手动更改了权限,将会出错。如何适配安卓6.0以下的权限呢?
        SupLuo:可以关注一下我写的关于权限处理的库,即将支持6.0以下的权限。https://github.com/SupLuo/HaloPermission
        人海中一只羊:Android6.0以下的权限 如果你在配置清单里声明了,安装过后就会被授予,当然这是原生的情况。现在第三方的rom有很多加入了权限开关,甚至在6.0之前的系统上也适配了动态权限机制(FLYME就有)。所以我认为还是需要跳转到应用管理界面,提示用户手动打开权限.
      • 83a7dc22bf22:Hello,问下能不能跳到各大厂商的App通知设置界面呢??
      • Alee_:Oppo的代码已失效
        念念不忘_2016:你解决了?我的也不行
      • 83c3cbb5a86a:楼主,如果系统都是Android以上的,不同机型跳转到应用权限设置页面的方法也是不一样的吗?
        b77535296c81:@liulianyushanzh 6.0之后,大部分手机都可以从应用信息里面进入权限管理,之前的话,不同厂商定制的rom,权限管理入口会不一样
      • 870082341af5:mark😄😄😄
      • 梦_之_旅:这个是实时更新的吗 适应最新的界面或者兼容老的系统吗
      • Vander丶:小米的 貌似 有点问题..好像找不到这个类.
        大大大大大大的大大:@Vander丶 也是找不到这个activity
        Vander丶:找不到这个界面 是我的MIUI太高了么.
      • 时间稀释青春:如何调试的。我现在能看到cmp act 这种信息 但是如何确定intent传过去的key值
      • fry_ss:Caused by: android.content.ActivityNotFoundException: Unable to find explicit activity class {com.color.safecenter/com.color.safecenter.permission.PermissionManagerActivity} 现在通过这种设置class name的报Activity没找到,是不是这类的有限制了。。
        93c39496f4f6:很明显这个类没有,你可以adb shell dumpsys activity top看看类名
        fry_ss:纠正一下是 com.coloros.safecenter
      • 606fd5f5448c:谢谢分享
      • GoBg:怎么判断权限拒绝呢? 6.0以上和6.0以下一样吗? 跪求
        SupLuo:@_陈小平 可以关注一下我写的关于权限处理的库,https://github.com/SupLuo/HaloPermission
        b77535296c81:6.0以上权限检查的伪代码:

        if (Build.VERSION.SDK_INT >= 23) {
        if (ActivityCompat.checkSelfPermission(mContext, permission) != PackageManager.PERMISSION_GRANTED) {
        // 没有权限
        if(ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CALL_PHONE)){

        ActivityCompat.requestPermissions((Activity) mContext, new String[]{Manifest.permission.CALL_PHONE}, 0);
        }else{
        //之前点击了“不再询问”,无法再次弹出权限申请框。
        //可以给Toast提示,或者Dialog反馈给用户,引导去开启相应权限

        ......

        // 去应用信息
        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", mContext.getPackageName(), 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", mContext.getPackageName());
        }
        }


        } else {
        // 有权限,接着你要干的活
        ......

        }
        } else {
        // 6.0之前的系统,因为无法获取权限的状态,直接执行需要权限的操作

        }
      • 小呀么小黄鸡:应该做一个Util的
        灬墨墨:感谢,棒棒的
        Vander丶:@小呀么小黄鸡 棒棒哒
        小呀么小黄鸡:https://github.com/hkq325800/JumpPermissionManagement
      • djskra:小米的 之前写的
        String rom = getMiuiVersion();
        Intent intent = null;
        if (ROM_MIUI_V5.equals(rom)) {

        Uri packageURI = Uri.parse("package:" + context.getApplicationInfo().packageName);
        intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, packageURI);


        } else if (ROM_MIUI_V6.equals(rom) || ROM_MIUI_V7.equals(rom)) {
        intent = new Intent("miui.intent.action.APP_PERM_EDITOR");
        intent.setClassName("com.miui.securitycenter", "com.miui.permcenter.permissions.AppPermissionsEditorActivity");
        intent.putExtra("extra_pkgname", context.getPackageName());
        } else {


        }
      • Javen205:好奇的是你是怎么测试的,有这么多测试机?
        Javen205:@_陈小平 :+1::+1:
        b77535296c81:公司测试机多
      • JokAr_:求列出手机的Build.MANUFACTURER:pray:
        都是些什么人啊:@_陈小平我的华为手机读出来是HUAWEI,不知道为啥不一样- -对比的时候还是统一转换为全大写或全小写保险点
        JokAr_:@_陈小平 非常感谢
        b77535296c81:华为——Huawei
        魅族——Meizu
        小米——Xiaomi
        索尼——Sony
        oppo——OPPO
        LG——LG
        vivo——vivo
        三星——samsung
        乐视——Letv
        中兴——ZTE
        酷派——YuLong
        联想——LENOVO
      • JokAr_:请问有三星手机的么?

      本文标题:Android各大手机品牌手机跳转到权限管理界面

      本文链接:https://www.haomeiwen.com/subject/dcxoyttx.html