Facebook、Evernote、Pocket-23(targetSdkVersion=23
)をターゲットにしている場合でも、すべてのアプリはAndroid 6.0でこの許可を自動的に取得します。
新しいマシュマロ許可モデルに関する多くのドキュメントがありました。それらの1つは、SYSTEM_ALERT_WINDOW
が「危険を超える」アクセス許可クラスに「昇格」されているため、アプリにそれらを許可するには特別なユーザーの介入が必要です。アプリにtargetSdkVersion
22以下がある場合、アプリはこの許可を自動的に取得します(マニフェストで要求されている場合)。
ただし、ユーザーをDraw over other apps
権限の特別な設定ページに送る必要なく、この権限を取得するアプリに気付きました。私はFacebook、Evernote、Pocketを見た-そしておそらくもっとある。
ユーザーがSettings -> Apps -> Draw over other apps
を経由せずにこの許可をアプリに付与する方法は誰でも知っていますか?
ありがとう
これは、Marshmallow6.0.1で導入された新しい動作です。
SYSTEM_ALERT_WINDOW
パーミッションを要求し、Playストア(バージョン6.0.5以上が必要です)をインストールするすべてのアプリは、パーミッションを自動的に付与します。 。
代わりにアプリがサイドロードされる場合、許可は自動的に付与されません。 Evernote APKを apkmirror.com からダウンロードしてインストールしてみてください。ご覧のとおり、Settings -> Apps -> Draw over other apps
で許可を手動で付与する必要があります。
これらはコミットです [1][2] PlayストアがSYSTEM_ALERT_WINDOW
パーミッションの自動付与を許可します。
ええ、マシュマロが来たらAndroidがセキュリティレベルを強化しますが、
SYSTEM_ALERT_WINDOW
フローティングアクションなどを表示できます。onCreate()
メソッドのコードに従うことでユーザーに許可を与えることができますsetContentViewの後にこのコードを配置します
// Check if Android M or higher
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
// Show alert dialog to the user saying a separate permission is needed
// Launch the settings activity if the user prefers
Intent myIntent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
startActivity(myIntent);
}
アクションACTION_MANAGE_OVERLAY_PERMISSION
は、「他のアプリの上に描画」許可画面を直接起動します。
編集:私の上記のコードは100%正しいです
しかし、私はちょうど多くの人がACTION_MANAGE_OVERLAY_PERMISSION
を許可する方法をまだ探していることを発見しましたユーザーが許可を一度許可している場合は永久に、その後、彼がアプリケーションを開くたびに尋ねないでください
デバイスにAPI 23+があるかどうかを確認します
23+ APIの場合、ユーザーに許可があるかどうかを確認します
一度許可があれば、彼をSettings.ACTION_MANAGE_OVERLAY_PERMISSION
に追いやる必要はありません。
onCreate()
メソッドの以下の行に配置します。これをsetContentView
の後に配置します
checkPermission();
以下のコードをonActivityResult
に入れます
@TargetApi(Build.VERSION_CODES.M)
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE) {
if (!Settings.canDrawOverlays(this)) {
// You don't have permission
checkPermission();
} else {
// Do as per your logic
}
}
}
最後に、checkPermissionメソッドのコード
public void checkPermission() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (!Settings.canDrawOverlays(this)) {
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE);
}
}
}
そして、クラスでこのパブリック変数を宣言することを忘れないでください
public static int ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE = 5469;
アプリがAPI 22以下をターゲットにしている場合、ユーザーがクリックしてインストールする(アラートを表示する)ときに、デバイスがAndroid 6.0であっても、Play StoreはSYSTEM_ALERT_WINDOW権限などを付与します。 23以上。実行時に許可が許可されるように要求されます。