Androidポップアップカスタムサスペンションウィンドウ「permission denied for window type」エラー処理
2210 ワード
Androidシステムでは、アプリケーションが懸濁ウィンドウをポップアップする必要がある場合は、「android.permission.SYSTEM_ALERT_WINDOW」という特殊な権限を申請する必要があります.
Android Oの前に
Android O以前のシステムでこの権限を申請した後、対応するwindowに設定します
懸濁ウィンドウが表示されます.
Android O以降
しかし、Android Oのシステムでは、Googleが「android.permission.SYSTEM_ALERT_WINDOW」の権限を申請するアプリケーションには、懸濁ウィンドウに以下のtypeを設定する必要があると規定しています.
「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メソッドは使用できません.
次の方法を使用できます.
その後、onActivity Result(int requestCode,int resultCode,Intent data)コールバック関数で処理し、その後の操作(ポップアップウィンドウを再度呼び出すと表示されます).
例:
弾窓論理完全実現
「Android開発芸術探索」などの本の関連章のソースコードを参考にし、本稿の方法を参考に対応バージョンの要求に適合し、権限の問題を回避すればよい.
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開発芸術探索」などの本の関連章のソースコードを参考にし、本稿の方法を参考に対応バージョンの要求に適合し、権限の問題を回避すればよい.