Androidポップアップカスタムサスペンションウィンドウ「permission denied for window type」エラー処理

2210 ワード

Androidシステムでは、アプリケーションが懸濁ウィンドウをポップアップする必要がある場合は、「android.permission.SYSTEM_ALERT_WINDOW」という特殊な権限を申請する必要があります.
Android Oの前に
Android O以前のシステムでこの権限を申請した後、対応するwindowに設定します
WindowManager.LayoutParams params = new WindowManager.LayoutParams();
params.type = WindowManager.LayoutParams.TYPE_PHONE;

懸濁ウィンドウが表示されます.
Android O以降
しかし、Android Oのシステムでは、Googleが「android.permission.SYSTEM_ALERT_WINDOW」の権限を申請するアプリケーションには、懸濁ウィンドウに以下のtypeを設定する必要があると規定しています.
WindowManager.LayoutParams params = new WindowManager.LayoutParams();
params.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;

「TYPE_APPLICATION_OVERLaY」がポイントです.このTYPEを設定しないとアプリケーションはCrashして次のように誤報する(後の2002で設定のtypeがTYPE_PHONEであることを示す):Android Runtime:android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@c8d1f1a -- permission denied for window type 2002
補足
ちなみにandroidを申請します.permission.SYSTEM_ALERT_WINDOW権限
requestPermissionsメソッドは使用できません.
次の方法を使用できます.
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
intent.setData(Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, GET_DIALOG_PERMISSION);//GET_DIALOG_PERMISSION             

その後、onActivity Result(int requestCode,int resultCode,Intent data)コールバック関数で処理し、その後の操作(ポップアップウィンドウを再度呼び出すと表示されます).
例:
 try {
            showAskDialog();//        
        }
        catch (Exception e)
        {
            Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
            intent.setData(Uri.parse("package:" + getPackageName()));
            startActivityForResult(intent, GET_DIALOG_PERMISSION);//GET_DIALOG_PERMISSION             
        }


 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(requestCode == GET_DIALOG_PERMISSION)//GET_DIALOG_PERMISSION             
        {
            showAskDialog();//        
        }
}

弾窓論理完全実現
「Android開発芸術探索」などの本の関連章のソースコードを参考にし、本稿の方法を参考に対応バージョンの要求に適合し、権限の問題を回避すればよい.