1. 程式人生 > >android 相容不同版本懸浮框許可權解決

android 相容不同版本懸浮框許可權解決

    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;
        }