android 相容不同版本懸浮框許可權解決
阿新 • • 發佈:2018-12-09
1,4.4以下使用TYPE_SYSTEM_ALERT,需要許可權android.permission.SYSTEM_ALERT_WINDOW; 2,4.4到7.0,使用TYPE_TOAST,不需要額外許可權;(既然TYPE_TOAST不需要任何許可權,那4.4以下為什麼不使用呢?因為4.4以下,TYPE_TOAST型別的懸浮球收不到觸控事件) 3,7.1上,使用TYPE_TOAST無效,懸浮球並不會顯示,使用TYPE_SYSTEM_ALERT,動態申請android.permission.SYSTEM_ALERT_WINDOW許可權; 4,8.0對於以上兩種type都廢棄了,需要使用TYPE_APPLICATION_OVERLAY,並需要執行時許可權android.permission.SYSTEM_ALERT_WINDOW;
這個裡面對於 第二點執行時許可權 也需要 android.permission.SYSTEM_ALERT_WINDOW , 測試 小米**MI 5**android 6.0.1 需要這個許可權 只有判斷 Build.VERSION_CODES.M 這個為 android 6.0
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (!Settings.canDrawOverlays(getApplicationContext())) {
toast("開啟懸浮框許可權來電識別" );
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, OVRELAY);
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super .onActivityResult(requestCode, resultCode, data);
if (requestCode == OVRELAY) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (!Settings.canDrawOverlays(this)) {
toast("沒有授予懸浮框許可權");
}
}
}
}
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N_MR1) {
params.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
} else if (Build.VERSION.SDK_INT == Build.VERSION_CODES.N_MR1) {
params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
params.type = WindowManager.LayoutParams.TYPE_TOAST;
} else {
params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
}