取得最上層繪製權限


在SDK 23之前,最上層繪製是不需要取得權限的。
在SDK 23之後,最上層繪製需要於啟動系統設定頁處理。

canDrawOverlays用以確認是否可以最上層繪製。

這裡我曾在SONY手機Android 8.0上遇到一個坑。
APP取得權限後馬上使用canDrawOverlays,實際上是已經擁有權限,但是不論如何都無法獲得正確數值,必須關閉APP再重啟才可以確認已擁有權限,這點在網路上也有人分析是系統問題,必須升級系統才會正常。


static public Intent getDrawOverlayPermissionIntent(Context context) {
    Intent intent = null;    if (Build.VERSION.SDK_INT >= 23) {
        intent = new Intent(
                Settings.ACTION_MANAGE_OVERLAY_PERMISSION,                Uri.parse("package:" + context.getPackageName()));        // Workaround: put extras for the key event not handled in Overlay Setting page.        intent.putExtra("extra_prefs_show_button_bar", true); // show the status bar        intent.putExtra("extra_prefs_show_skip", false); // skip button is gone        intent.putExtra("extra_prefs_set_next_text", ""); // next button is gone        intent.putExtra("extra_prefs_set_back_text", "Cancel");    }
    return intent;}

static public boolean canDrawOverlays(Context context) {
    if (Build.VERSION.SDK_INT < 23) return true;    if (Build.VERSION.SDK_INT >= 23 && Settings.canDrawOverlays(context)) return true;    if (android.os.Build.VERSION.SDK_INT >= 24) {
        AppOpsManager manager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);        if (manager != null) {
            try {
                int result = manager.checkOp(
                        AppOpsManager.OPSTR_SYSTEM_ALERT_WINDOW,                        Binder.getCallingUid(),                        context.getPackageName());
                return result == AppOpsManager.MODE_ALLOWED;            } catch (Exception ignore) {
            }
        }
    }
    return false;}

AndroidMenifast.xml加入

android:name="android.permission.SYSTEM_ALERT_WINDOW" />

留言