web-dev-qa-db-ja.com

SYSTEM_ALERT_WINDOW-Android 6.0およびtargetSdkVersion 23でこの権限を自動的に取得する方法

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を経由せずにこの許可をアプリに付与する方法は誰でも知っていますか?

ありがとう

68
oriharel

これは、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パーミッションの自動付与を許可します。

97

ええ、マシュマロが来たら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を許可する方法をまだ探していることを発見しましたユーザーが許可を一度許可している場合は永久に、その後、彼がアプリケーションを開くたびに尋ねないでください

  1. デバイスにAPI 23+があるかどうかを確認します

  2. 23+ APIの場合、ユーザーに許可があるかどうかを確認します

  3. 一度許可があれば、彼を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;
53
Jayman Jani

アプリがAPI 22以下をターゲットにしている場合、ユーザーがクリックしてインストールする(アラートを表示する)ときに、デバイスがAndroid 6.0であっても、Play StoreはSYSTEM_ALERT_WINDOW権限などを付与します。 23以上。実行時に許可が許可されるように要求されます。

2
Dennix