Android各品牌手機(jī)跳轉(zhuǎn)權(quán)限管理界面

背景

最近Android在用戶權(quán)限隱私方面候衍,有了更加明確的監(jiān)管要求蛇尚。為了配合應(yīng)用市場(chǎng)需求摆碉,我們需要做一些隱私權(quán)限管理的處理塘匣。比如dialog提示用戶需要的權(quán)限以及權(quán)限的用處,協(xié)議明確告知用戶隱私的使用巷帝,設(shè)置里列出各個(gè)權(quán)限的狀態(tài)以及修改的入口忌卤。在這里就有了今天的筆記,APP里引導(dǎo)用戶跳轉(zhuǎn)各個(gè)品牌手機(jī)的系統(tǒng)權(quán)限管理界面楞泼。

各品牌的Build.MANUFACTURER
  1. 小米——Xiaomi
  2. 華為——Huawei
  3. oppo——OPPO
  4. 魅族——Meizu
  5. 三星——samsung
  6. 索尼——Sony
  7. LG——LG
  8. 樂(lè)視——Letv
  9. 360——QIKU”或“360”
  10. vivo——vivo
  11. 酷派——YuLong
  12. 聯(lián)想——LENOVO
  13. 中興——ZTE
  14. 谷歌——Google

注:如果不確定大小寫(xiě)埠巨,可以Build.MANUFACTURER.toLowerCase()
判斷系統(tǒng)制造商,做不同的處理跳轉(zhuǎn)權(quán)限管理界面:

fun jumpPermissionPage(context: Context) {
        val manufacturer = DeviceUtils.getManufacturer().toLowerCase()
        when (manufacturer) {
            "xiaomi" -> {
                goXiaoMiManager(context)
            }
            "huawei" -> {
                goHuaWeiManager(context)
            }
            "oppo" -> {
                goOppoManager(context)
            }
            "meizu" -> {
                goMeizuManager(context)
            }
            "samsung" -> {
                goSamsungManager(context)
            }
            "sony" -> {
                goSonyManager(context)
            }
            "lg" -> {
                goLGManager(context)
            }
            "letv" -> {
                goLetvManager(context)
            }
            "qiku", "360" -> {
                go360Manager(context)
            }
//            "vivo" -> {}//vivo
//            "yulong" -> {}//酷派
//            "lenovo" -> {}//聯(lián)想
//            "zte" -> {}//中興
//            "google" -> {}//谷歌
            else -> {
                goAppDetailSetting(context)
            }
        }
    }

下面有2個(gè)通用的方法现拒,引導(dǎo)跳轉(zhuǎn)到系統(tǒng)設(shè)置界面辣垒,和跳轉(zhuǎn)到應(yīng)用信息界面。最后沒(méi)有處理的這幾個(gè)系統(tǒng)印蔬,和在打開(kāi)失敗的情況下勋桶,我的項(xiàng)目中選擇默認(rèn)打開(kāi)應(yīng)用信息界面。

系統(tǒng)設(shè)置界面
private fun goIntentSetting(context: Context) {
        val intent = Intent(Settings.ACTION_SETTINGS)
        context.startActivity(intent)
    }
應(yīng)用信息界面
private fun goAppDetailSetting(context: Context) {
        val localIntent = Intent()
        localIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
        if (Build.VERSION.SDK_INT >= 9) {
            localIntent.action = "android.settings.APPLICATION_DETAILS_SETTINGS"
            localIntent.data = Uri.fromParts("package", BuildConfig.APPLICATION_ID, null)
        } else if (Build.VERSION.SDK_INT <= 8) {
            localIntent.action = Intent.ACTION_VIEW
            localIntent.setClassName("com.android.settings", "com.android.settings.InstalledAppDetails")
            localIntent.putExtra("com.android.settings.ApplicationPkgName", BuildConfig.APPLICATION_ID)
        }
        try {
        context.startActivity(localIntent)
        } catch (e: Exception) {
//            e.printStackTrace()
            AppUtils.topActivity?.showTip(context.resources.getString(R.string.permission_setting_error))
        }
    }
小米
//小米系統(tǒng)有以下幾個(gè)版本需要適配
 private fun goXiaoMiManager(context: Context) {
        var rom: String? = getMiuiVersion()
        try {
            var intent: Intent = Intent()
            if ("V5" == rom) {
                val packageURI = Uri.parse("package:" + BuildConfig.APPLICATION_ID)
                intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, packageURI)
            } else if ("V6" == rom || "V7" == rom) {
                intent.action = "miui.intent.action.APP_PERM_EDITOR"
                intent.setClassName("com.miui.securitycenter", "com.miui.permcenter.permissions.AppPermissionsEditorActivity")
                intent.putExtra("extra_pkgname", BuildConfig.APPLICATION_ID)
            } else if ("V8" == rom || "V9" == rom) {
                intent.action = "miui.intent.action.APP_PERM_EDITOR"
                intent.setClassName("com.miui.securitycenter", "com.miui.permcenter.permissions.PermissionsEditorActivity")
                intent.putExtra("extra_pkgname", BuildConfig.APPLICATION_ID)
            } else {
                goAppDetailSetting(context)
            }
            context.startActivity(intent)
        } catch (e: Exception) {
            goAppDetailSetting(context)
        }
    }
華為
private fun goHuaWeiManager(context: Context) {
        try {
            var intent: Intent = Intent(BuildConfig.APPLICATION_ID)
            intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
            var comp: ComponentName = ComponentName("com.huawei.systemmanager", "com.huawei.permissionmanager.ui.MainActivity")
            intent.setComponent(comp)
            context.startActivity(intent)
        } catch (e: Exception) {
            goAppDetailSetting(context)
        }
    }
OPPO
private fun goOppoManager(context: Context) {
        try {
            val intent = Intent("android.settings.APPLICATION_DETAILS_SETTINGS")
            intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
            intent.putExtra("packageName", BuildConfig.APPLICATION_ID)
//            val comp = ComponentName("com.coloros.safecenter", "com.coloros.safecenter.permission.PermissionAppAllPermissionActivity")//R9SK 6.0.1  os-v3.0
            val comp = ComponentName("com.coloros.securitypermission", "com.coloros.securitypermission.permission.PermissionAppAllPermissionActivity")//R11t 7.1.1 os-v3.2
            intent.component = comp
            context.startActivity(intent)
        }catch (e: Exception) {
            goAppDetailSetting(context)
        }
    }
魅族
private fun goMeizuManager(context: Context) {
        try {
            var intent: Intent = Intent("com.meizu.safe.security.SHOW_APPSEC")
            intent.addCategory(Intent.CATEGORY_DEFAULT)
            intent.putExtra("packageName", BuildConfig.APPLICATION_ID)
            context.startActivity(intent)
        } catch (e: Exception) {
            goAppDetailSetting(context)
        }
    }
三星
private fun goSamsungManager(context: Context) {
        //如果使用同樣的跳轉(zhuǎn)包名類名跳轉(zhuǎn)方式侥猬,三星會(huì)報(bào)這個(gè)問(wèn)題
        //java.lang.SecurityException: requires android.permission.GRANT_RUNTIME_PERMISSIONS
        //目前選擇直接跳轉(zhuǎn)應(yīng)用信息界面
        goAppDetailSetting(context)
    }
索尼
private fun goSonyManager(context: Context) {
        try {
            var intent: Intent = Intent(BuildConfig.APPLICATION_ID)
            intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
            var comp: ComponentName = ComponentName("com.sonymobile.cta", "com.sonymobile.cta.SomcCTAMainActivity")
            intent.setComponent(comp)
            context.startActivity(intent)
        } catch (e: Exception) {
            goAppDetailSetting(context)
        }
    }
LG
private fun goLGManager(context: Context) {
        try {
            val intent = Intent("android.intent.action.MAIN")
            intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
            intent.putExtra("packageName", BuildConfig.APPLICATION_ID)
            val comp = ComponentName("com.android.settings", "com.android.settings.Settings\$AccessLockSummaryActivity")
            intent.component = comp
            context.startActivity(intent)
        }catch (e: Exception) {
            goAppDetailSetting(context)
        }
    }
樂(lè)視
private fun goLetvManager(context: Context) {
        try {
            val intent = Intent()
            intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
            intent.putExtra("packageName", BuildConfig.APPLICATION_ID)
            val comp = ComponentName("com.letv.android.letvsafe", "com.letv.android.letvsafe.PermissionAndApps")
            intent.component = comp
            context.startActivity(intent)
        }catch (e: Exception) {
            goAppDetailSetting(context)
        }
    }
360手機(jī)
//360只能打開(kāi)到自帶安全軟件
private fun go360Manager(context: Context) {
        try {
            val intent = Intent("android.intent.action.MAIN")
            intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
            intent.putExtra("packageName", BuildConfig.APPLICATION_ID)
            val comp = ComponentName("com.qihoo360.mobilesafe", "com.qihoo360.mobilesafe.ui.index.AppEnterActivity")
            intent.component = comp
            context.startActivity(intent)
        }catch (e: Exception) {
            goAppDetailSetting(context)
        }
    }

或許好奇的朋友例驹,你會(huì)問(wèn)這個(gè)ComponentName里的參數(shù)代表什么,怎么知道的呢退唠?
舉個(gè)OPPO手機(jī)的例子吧
先打開(kāi)當(dāng)前應(yīng)用的系統(tǒng)權(quán)限界面鹃锈,像下圖一樣:



然后通過(guò)ADB命令查看當(dāng)前activity∏圃ぃ可以使用:

adb shell dumpsys activity activities 
或者
adb shell dumpsys activity top

第一個(gè)參數(shù)是權(quán)限界面的包名屎债,第二個(gè)手機(jī)權(quán)限界面的類名,既然知道包名與類名自然可以打開(kāi)該Activity垢油。


ComponentName("com.coloros.safecenter",
"com.coloros.safecenter.permission.PermissionAppAllPermissionActivity")

如果還有疑問(wèn)盆驹,action為何不一樣呢?
拿魅族的來(lái)看吧:

var intent: Intent = Intent("com.meizu.safe.security.SHOW_APPSEC")

執(zhí)行命令:adb shell dumpsys activity activities
可以看出Intent的act是什么滩愁,如圖:

在有限的測(cè)試機(jī)里躯喇,適配測(cè)試結(jié)果ok。
如果有其他問(wèn)題硝枉,或者有補(bǔ)充的廉丽,可以評(píng)論或者私信我喲Q-Q

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市妻味,隨后出現(xiàn)的幾起案子正压,更是在濱河造成了極大的恐慌,老刑警劉巖弧可,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蔑匣,死亡現(xiàn)場(chǎng)離奇詭異劣欢,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)裁良,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)凿将,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人价脾,你說(shuō)我怎么就攤上這事牧抵。” “怎么了侨把?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵犀变,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我秋柄,道長(zhǎng)获枝,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任骇笔,我火速辦了婚禮省店,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘笨触。我一直安慰自己懦傍,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布芦劣。 她就那樣靜靜地躺著粗俱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪虚吟。 梳的紋絲不亂的頭發(fā)上寸认,一...
    開(kāi)封第一講書(shū)人閱讀 49,144評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音稍味,去河邊找鬼废麻。 笑死,一個(gè)胖子當(dāng)著我的面吹牛模庐,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播油宜,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼掂碱,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了慎冤?” 一聲冷哼從身側(cè)響起疼燥,我...
    開(kāi)封第一講書(shū)人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蚁堤,沒(méi)想到半個(gè)月后醉者,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年撬即,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了立磁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡剥槐,死狀恐怖唱歧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情粒竖,我是刑警寧澤颅崩,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站蕊苗,受9級(jí)特大地震影響沿后,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜朽砰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一尖滚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧锅移,春花似錦熔掺、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至备绽,卻和暖如春券坞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背肺素。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工恨锚, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人倍靡。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓猴伶,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親塌西。 傳聞我的和親對(duì)象是個(gè)殘疾皇子他挎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345