このポップアップは、マニフェストによって宣言されたmanifest.PERMISSION.SYSTEM_ALERT_WINDOW権限が原因で発生します。
開発者が知っておく必要のある権限には、次の3つのカテゴリがあります。
通常の許可-マニフェストで宣言するだけで、何もしません
脆弱な許可-マニフェストで宣言し、最初に許可を求めます。これらは、システム設定を通じて変更できます。
上記の危険な権限:SYSTEM_ALERT_WINDOWおよびWRITE_SETTINGSはこのカテゴリに属します。これらは許可する必要がありますが、システム設定には表示されません。それを要求するには、標準的な方法(int checkSelfPermission(Stringpermission))を使用しませんが、Settings.canDrawOverlays()またはSettings.System.canWrite()を適切にチェックする必要があります。そうしないと、次のような例外が発生します。
ウィンドウを追加できませんandroid.view.ViewRootImpl$W@1de28ad-このウィンドウタイプの権限が拒否されました
1-以下に示すように、コードでこの許可を自分でリクエストします。
public class MainActivity extends AppCompatActivity {
public final static int REQUEST_CODE = 10000;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (checkDrawOverlayPermission()) {
Toast.makeText(this, "Permission granted", Toast.LENGTH_SHORT).show();
}
}
public boolean checkDrawOverlayPermission() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
return true;
}
if (!Settings.canDrawOverlays(this)) {
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, REQUEST_CODE);
return false;
} else {
return true;
}
}
@Override
@TargetApi(Build.VERSION_CODES.M)
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_CODE) {
if (Settings.canDrawOverlays(this)) {
Toast.makeText(this, "Permission granted", Toast.LENGTH_SHORT).show();
}
}
}