1. 程式人生 > >Android 8.0以上懸浮窗許可權正確開啟方式

Android 8.0以上懸浮窗許可權正確開啟方式

Android 8.0以上懸浮窗許可權正確開啟方式

開發中在android 8.0上遇到了一個判斷懸浮窗許可權是否開啟的問題,當在一個介面彈出dialog提示使用者開啟懸浮窗許可權,使用者點選之後,跳轉到設定介面開啟懸浮窗許可權,然後返回該頁面,Settings.canDrawOverlays(context) 進行許可權開啟的判斷,結果返回的是false;程式接收到的是許可權沒有開啟,但是到設定裡面檢視確實是開啟了的。而且當你對介面有重新整理操作之後(去到其他介面、退出重新進入、點選按鈕等等),檢測到許可權也是開啟的。但是當你從介面跳轉到設定並開啟許可權,然後返回介面直接呼叫Settings.canDrawOverlays(context)方法判斷顯示的是未開啟。
搞得我很頭暈,網上找了一堆資料,都沒有效果,最後無意間註釋了一行程式碼,

 // intent.setData(Uri.parse("package:" + getPackageName()));

結果一切都恢復正常了,我艹了,8.0以上的手機就是坑呀!再次記錄一下,希望對遇到我這樣問題的人有幫助;

完整的程式碼如下:

    private void requestSettingCanDrawOverlays() {
        Toast.makeText(SplashActivity.this, "請開啟顯示懸浮窗開關!", Toast.LENGTH_LONG).show();
        int sdkInt = Build.VERSION.SDK_INT;
        if (sdkInt >= Build.VERSION_CODES.O) {//8.0以上
            Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
            startActivityForResult(intent, REQUEST_DIALOG_PERMISSION);
        } else if (sdkInt >= Build.VERSION_CODES.M) {//6.0-8.0
            Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
            intent.setData(Uri.parse("package:" + getPackageName()));
            startActivityForResult(intent, REQUEST_DIALOG_PERMISSION);
        } else {//4.4-6.0一下
            //無需處理了
        }
    }