1. 程式人生 > >Android如何在app中通過一個按鈕直接跳轉到的系統的許可權設定頁面

Android如何在app中通過一個按鈕直接跳轉到的系統的許可權設定頁面

續上一篇《Android的許可權設定及自啟動設定》,在開發中我通過一個按鈕來進行跳轉到系統的許可權頁面,一開始的程式碼就是上一篇中的原模原樣的程式碼,如下所示:

    /**
     * 跳轉到許可權設定介面
     */
    private void getAppDetailSettingIntent(Context context){
        Intent intent = new Intent();
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        if(Build.VERSION.SDK_INT >= 9){
            intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
            intent.setData(Uri.fromParts("package", getPackageName(), null));
        } else if(Build.VERSION.SDK_INT <= 8){
            intent.setAction(Intent.ACTION_VIEW);
            intent.setClassName("com.android.settings","com.android.settings.InstalledAppDetails");
            intent.putExtra("com.android.settings.ApplicationPkgName", getPackageName());
        }
        startActivity(intent);
    }

然而,把公司裡的安卓都借來測了一遍後只想感嘆:理想很豐滿,現實很骨感!

首先呢,公司裡的手機只有小米(好多隻)、vivo(兩隻)、三星(一隻)、oppo(一隻)。

測試結果:
小米,沒有問題,跳轉到頁面後直接選擇許可權管理就可以設定了;
vivo,跳轉到的許可權頁面只給看,不能設定;
三星,這一隻沒問題;
oppo,和vivo一樣,跳轉到的許可權頁面只給看,不能設定。

這實在是好坑,oppo和vivo都有單獨的一款系統軟體管家,只有在那個app裡才能進行許可權設定,所以這種情況下,不應該跳轉到系統的設定頁面,而是開啟軟體管家。那麼想要去開啟一個app就必須要知道這個app的包名。所有,只能通過adb來獲取它們各自管家的包名。例如,開啟vivo的 i管家,在Terminal中通過執行這個指令 adb shell dumpsys activity top來捕捉軟體的主Activity。

adb結果:
vivo的軟體管家包名:com.iqoo.secure
oppo的軟體管家包名:com.oppo.safe

所以,我那段程式碼也需要加點判斷,程式碼如下:

    /**
     * 跳轉到許可權設定介面
     */
    private void getAppDetailSettingIntent(Context context){

        // vivo 點選設定圖示>加速白名單>我的app
        //      點選軟體管理>軟體管理許可權>軟體>我的app>信任該軟體
        Intent appIntent = context.getPackageManager().getLaunchIntentForPackage("com.iqoo.secure");
        if(appIntent != null){
            context.startActivity(appIntent);
            floatingView = new SettingFloatingView(this, "SETTING", getApplication(), 0);
            floatingView.createFloatingView();
            return;
        }

        // oppo 點選設定圖示>應用許可權管理>按應用程式管理>我的app>我信任該應用
        //      點選許可權隱私>自啟動管理>我的app
        appIntent = context.getPackageManager().getLaunchIntentForPackage("com.oppo.safe");
        if(appIntent != null){
            context.startActivity(appIntent);
            floatingView = new SettingFloatingView(this, "SETTING", getApplication(), 1);
            floatingView.createFloatingView();
            return;
        }

        Intent intent = new Intent();
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        if(Build.VERSION.SDK_INT >= 9){
            intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
            intent.setData(Uri.fromParts("package", getPackageName(), null));
        } else if(Build.VERSION.SDK_INT <= 8){
            intent.setAction(Intent.ACTION_VIEW);
            intent.setClassName("com.android.settings","com.android.settings.InstalledAppDetails");
            intent.putExtra("com.android.settings.ApplicationPkgName", getPackageName());
        }
        startActivity(intent);
    }

還有酷派、魅族、HTC等等公司裡沒有機型,還不知道結果是怎麼樣的,如果有現成手機的,可以測一下分享一下,謝謝 •_^