SYSTEM_ALERT_WINDOW-Android6.0およびtargetSdkVersion23でこの権限を自動的に取得する方法


82

Facebook、Evernote、Pocket-すべてのアプリは、23(targetSdkVersion=23)をターゲットにしている場合でも、Android6.0でこの権限を自動的に取得します。

新しいマシュマロ許可モデルに関する多くの文書があります。それらの1つはSYSTEM_ALERT_WINDOW、「危険以上」の権限クラスに「昇格」されているため、アプリにそれらを付与するには、特別なユーザー介入が必要です。アプリのtargetSdkVersion権限が22以下の場合、アプリはこの権限を自動的に取得します(マニフェストで要求された場合)。

ただし、ユーザーをDraw over other apps権限の設定特別ページに移動する必要なしに、この権限を取得するアプリがあることに気付きました。Facebook、Evernote、Pocketを見ました-そしておそらくもっとたくさんあります。

ユーザーが通過せずにアプリにこの権限を付与する方法を知っている人はいますSettings -> Apps -> Draw over other appsか?

ありがとう



stackoverflow.com/questions/33139754/…この投稿は、外部への書き込みのダイアログ許可を示すのに役立ちました
Bharath 2017年

回答:


116

それはマシュマロで導入された新しい動作です6.0.1

SYSTEM_ALERT_WINDOW権限をリクエストし、Playストア(バージョン6.0.5以降が必要)を介してインストールされるすべてのアプリは、自動的に権限を付与します。

代わりにアプリがサイドロードされている場合、権限は自動的に付与されません。EvernoteAPKをapkmirror.comからダウンロードしてインストールしてみてください。ご覧のとおり、で権限を手動で付与する必要がありますSettings -> Apps -> Draw over other apps

これらはコミットです[1] PlayストアがSYSTEM_ALERT_WINDOW許可を自動的に付与できるように [2]です。


6
どうして「危険以上」の許可が突然「通常以下」になったのだろうか。つまり、ポップアップでこの権限を確認することすらできず、アプリは自動的に権限を取得できます。何かご意見は?
oriharel 2016年

許可が残っているabove dangerous、権限が付与されていないアプリをサイドロード場合、実際に。動作が異なり、自動的に権限を付与するのはPlayストアだけです。おそらく、Playストア上のアプリは悪意がなく、信頼できると考えていたのかもしれません。あるいは、この変更について多くの苦情を受け、回避策を見つけることにしたのかもしれません。
Mattia Maestrini 2016年

2
@oriharel大規模なFacebookMes​​sengerが、これをサポートするためにGoogleをこの方向に動かしたのではないかと思います。チャットヘッドが機能し続けることができるように、Facebookがユーザーに許可を与えることを強制しないというGoogleとの契約を結んだ可能性があります。
dennisdrew 2016

3
この権限を自動付与するこの動作について尋ねたところ(理由は別のものだと思いました:targetSdk)、Googleの応答は「これは、代替APIが含まれるまで人気のあるアプリが機能し続けることを可能にする意図された動作です。これらのアプリを移行するためのプラットフォーム。」。投稿は次のとおり です
開発者

1
@MattiaMaestriniこの同様の質問をご覧いただけますか?stackoverflow.com/questions/54378632/...
ラム

74

マシュマロが登場した後、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. デバイスにAPI23以降があるかどうかを確認します

  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;

1
@JaymanJaniこんにちは、これは私のために働いていますが、オフイベントのスイッチボタンが欲しいです
PriyankaChauhan 2017

onPermissionは私が何をすべきかを許可しましたか?アプリを開きたい
Santanu Sur 2018

良い解決策。ただし、checkPermission()メソッドですでにチェックしているため、onActivityResultメソッドでcanDrawOverlaysパーミッションを再度チェックする必要はありません。
VahidShir

非常にうまく機能しますが、ツールバーのメニュー項目をタップできなくなりました。それは可能ですか?
パブロ・R.

誰かが問題に直面した場合は、私に感謝を知らせてください
JaymanJani20年

13

GoogleがAndroidQのバブルの形で代替APIを提供するようになった今(2019)、Googleは将来のAndroidリリースで最終的に非推奨にすることを決定しました。SYSTEM_ALERT_WINDOWSYSTEM_ALERT_WINDOW

そして、Androidゴーデバイスは、もはやこのアクセス許可を付与しません すなわちSettings.canDrawOverlays() == false


どうやってこれを知っていますか?ドキュメントには、まだプレビュー中であると書かれています。developer.android.com/guide/topics/ui/bubbles
ノアDrach

本当の@NoaDrach、それが私が将来Googleが最終的にSAWを非推奨にする、つまりバブルAPIが安定しているときに言った理由です。youtu.be/td3Kd7fOROw?t=136
開発者の

おかげで、私は自分のアプリ(まだQをターゲットにしていない)をb / cに尋ねていましたが、Playストアからインストールすると、この権限を自動的に取得していましたが、現在は自動的に取得されません。私はこのことのB / Cを推測する- reddit.com/r/androiddev/comments/a69q0i/...
ノアDrach

@DicksonthedeveloperSYSTEM_ALERT_WINDOWの機能や画面オーバーレイの権限がないデバイスを特定する方法を教えてくださいこのstackoverflow.com/questions/63938787/の

Androidの11は、このAPIが含まれている
NothingtoSay

9

アプリがPlayストアからダウンロードされたときにこの権限を自動的に取得したい場合は、マニフェストのSYSTEM_ALERT_WINDOWの他に、このリンクにアクセスしてGoogleにリクエストする必要があります。

この許可が必要な理由をいくつか追加情報を提供する必要があります。Googleが確認し、自動的に許可を与えます。

これを要求する前に、次のことを行う必要があることに注意してください。

  • マニフェストでSYSTEM_ALERT_WINDOW権限を持っている

  • まだ付与されていない場合は、アプリ内でSYSTEM_ALERT_WINDOW権限を付与するようにユーザーに促します

私が何かを逃した場合は、答えを更新してください


これは今正解であるに違いありません。ありがとうございました。プログラムでユーザーにこの許可を求める方法にあなたの答えを追加してください。
エレンTüfekçi

2

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


更新されたPlayストアポリシー(2018年8月以降 )に従って、26未満のSDKをターゲットにしないでください。このリファレンスリンクを参照してください1)developer.android.com/distribute/best-practices/develop/…2medium.com/codespace69/…
JaymanJani20年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.