取得最上層繪製權限
在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" />
留言