SYSTEM_ALERT_WINDOW - So erhalten Sie diese Berechtigung automatisch für Android 6.0 und targetSdkVersion 23

80

Facebook, Evernote, Pocket - Alle Apps erhalten diese Berechtigung für Android 6.0 automatisch, obwohl sie auf 23 ( targetSdkVersion=23) abzielen .

Es wurde viel über das neue Marshmallow-Berechtigungsmodell dokumentiert. Einer von ihnen wurde SYSTEM_ALERT_WINDOWin die Berechtigungsklasse "über gefährlich" befördert, sodass ein spezieller Benutzereingriff erforderlich ist, damit Apps mit diesen gewährt werden können. Wenn die App targetSdkVersion22 oder weniger hat, erhält die App diese Berechtigung automatisch (falls im Manifest angefordert).

Ich habe jedoch einige Apps bemerkt, die diese Berechtigung erhalten, ohne dass der Benutzer auf die spezielle Einstellungsseite der Draw over other appsBerechtigung gesendet werden muss. Ich habe Facebook, Evernote, Pocket gesehen - und vielleicht gibt es noch mehr.

Weiß jemand, wie einer App diese Berechtigung erteilt werden kann, ohne dass der Benutzer dies durchläuft Settings -> Apps -> Draw over other apps?

Vielen Dank

Oriharel
quelle
stackoverflow.com/questions/33139754/… das hat mir geholfen
Bharath
stackoverflow.com/questions/33139754/… Dieser Beitrag hat mir geholfen, die Dialogberechtigung für das Schreiben an externe Benutzer anzuzeigen
Bharath

Antworten:

110

Es ist ein neues Verhalten, das in Marshmallow 6.0.1 eingeführt wurde .

Jede App, die die SYSTEM_ALERT_WINDOWBerechtigung anfordert und über den Play Store installiert wird (Version 6.0.5 oder höher ist erforderlich), hat die Berechtigung automatisch erteilt.

Wenn stattdessen die App seitlich geladen wird, wird die Berechtigung nicht automatisch erteilt. Sie können versuchen, die Evernote APK von apkmirror.com herunterzuladen und zu installieren . Wie Sie sehen, müssen Sie die Berechtigung in manuell erteilen Settings -> Apps -> Draw over other apps.

Dies sind die Commits [1] [2] , mit denen der Play Store die SYSTEM_ALERT_WINDOWErlaubnis automatisch erteilen kann .

Mattia Maestrini
quelle
6
Obwohl ich mich frage, warum eine "über gefährliche" Erlaubnis plötzlich "unter normal" ist. Ich meine, Sie können diese Berechtigung nicht einmal in einem Popup sehen, und Apps können sie automatisch abrufen. Irgendwelche Gedanken?
Oriharel
Die Berechtigung bleibt above dangerousin der Tat erhalten, wenn Sie die App von der Seite laden, wird die Berechtigung nicht erteilt. Es ist nur der Play Store, der sich anders verhält und automatisch die Erlaubnis erteilt. Vielleicht dachten sie, dass die Apps im Play Store nicht bösartig sind und ihnen vertraut werden kann. Oder sie haben viele Beschwerden über diese Änderung erhalten und beschlossen, eine Problemumgehung zu finden.
Mattia Maestrini
2
@oriharel Ich frage mich, ob der massive Umfang von Facebook Messenger Google in diese Richtung getrieben hat, um dies zu unterstützen. Könnte sein, dass Facebook mit Google einen Vertrag abgeschlossen hat, um den Nutzer nicht zu zwingen, die Erlaubnis zu erteilen, damit die Chatheads weiterarbeiten können.
Dennis zog
3
Als ich nach diesem Verhalten beim automatischen Erteilen dieser Berechtigung fragte (ich dachte, der Grund ist etwas anderes: das targetSdk), antwortete Google: "Dies ist ein beabsichtigtes Verhalten, damit beliebte Apps weiterarbeiten können, bis wir alternative APIs in der haben." Plattform für die Migration dieser Apps. " . Hier sind die Beiträge: code.google.com/p/android/issues/detail?id=227123 code.google.com/p/android/issues/detail?id=222195
Android-Entwickler
1
@MattiaMaestrini kannst du dir diese ähnliche Frage ansehen? stackoverflow.com/questions/54378632/…
RAM
72

Yeh Nach Marshmallow kommen Android machen Sicherheitsstufe mehr Stick, aber für

SYSTEM_ALERT_WINDOW

Sie können schwebende Aktionen und alles onCreate()anzeigen. Sie können den Benutzer zwingen, die Berechtigung dafür zu erteilen, indem Sie den Codes in Ihrer Methode folgen. Fügen Sie diesen Code nach setContentView ein

    // 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);
    }

Die Aktion ACTION_MANAGE_OVERLAY_PERMISSIONstartet direkt den Berechtigungsbildschirm "Über andere Apps zeichnen".


Bearbeiten: Mein obiger Code funktioniert 100% korrekt

Aber ich habe gerade festgestellt, dass viele Leute immer noch auf der Suche sind, wie man ACTION_MANAGE_OVERLAY_PERMISSION dauerhaft zulassen kann, wie wenn der Benutzer die Berechtigung einmal erlaubt hat.

  1. Überprüfen Sie, ob das Gerät über API 23+ verfügt

  2. Wenn 23+ API, überprüfen Sie, ob der Benutzer eine Genehmigung hat oder nicht

  3. Wenn Sie einmal eine Erlaubnis hatten, fahren Sie nicht zu ihm Settings.ACTION_MANAGE_OVERLAY_PERMISSIONund wenn Sie noch keine Erlaubnis haben, fragen Sie nach einer Laufzeit-Erlaubnisprüfung

Tragen Sie in Ihre onCreate()Methode die folgende Zeile ein . Setzen Sie dies nachsetContentView

checkPermission();

Geben Sie nun den folgenden Code ein 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 
        }

    }

}

Nun endlich der checkPermission Methodencode

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);
        }
    }
}

Und vergessen Sie nicht, diese öffentliche Variable in Ihrer Klasse zu deklarieren

public static int ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE = 5469;
Jayman Jani
quelle
1
@ JaymanJani Hallo, das funktioniert für mich, aber ich möchte den Schalter einschalten
PriyankaChauhan
onPermission gewährt was soll ich tun? Ich möchte die App öffnen
Santanu Sur
Gute Lösung. Es ist jedoch nicht erforderlich, die canDrawOverlays-Berechtigung in der onActivityResult-Methode erneut zu überprüfen, da wir dies bereits in der checkPermission () -Methode überprüfen.
VahidShir
Es funktioniert sehr gut, aber jetzt kann ich nicht auf Menüpunkte in der Symbolleiste tippen. Ist es möglich das zu tun?
Pablo R.
Hey, wenn jemand Probleme hat, lass es mich wissen, danke
Jayman Jani
12

Jetzt ( 2019 ), da Google eine alternative API SYSTEM_ALERT_WINDOWin Form von Bubbles in Android Q anbietet , hat Google beschlossen, SYSTEM_ALERT_WINDOWin einer zukünftigen Android-Version möglicherweise nicht mehr zu funktionieren .

Und Android Go-Geräte gewähren diese Berechtigung nicht mehr, d. H.Settings.canDrawOverlays() == false

Dickson der Entwickler
quelle
woher weißt du das? Die Dokumentation sagt, dass es noch in der Vorschau ist. developer.android.com/guide/topics/ui/bubbles
Noa Drach
Richtig @NoaDrach, deshalb habe ich gesagt, dass Google in Zukunft SAW irgendwann ablehnen wird - dh wenn die Bubble-API stabil ist. youtu.be/td3Kd7fOROw?t=136
Dickson der Entwickler
danke, ich habe b / c nach meiner App gefragt (die noch nicht auf Q abzielt), die verwendet wurde, um diese Berechtigung automatisch zu erhalten, wenn sie aus dem Play Store installiert wurde, und jetzt erhalten wir sie nicht automatisch. Ich denke, es ist b / c davon - reddit.com/r/androiddev/comments/a69q0i/…
Noa Drach
@Dicksonthedeveloper Bitte lassen Sie mich herausfinden, welches Gerät nicht über die Funktion SYSTEM_ALERT_WINDOW oder die Bildschirmüberlagerungsberechtigung verfügt. Ich benötige eine Lösung für diesen Stackoverflow.com/questions/63938787/…
Shaikh Mohib
Android 11 enthält diese API
NothingtoSay
4

Für diejenigen, die diese Berechtigung automatisch erhalten möchten, wenn die App aus dem Play Store heruntergeladen wird, sollten Sie neben dem SYSTEM_ALERT_WINDOW im Manifest zu diesem Link gehen und dies bei Google anfordern.

Sie müssen einige zusätzliche Informationen angeben, warum Sie diese Berechtigung benötigen. Google überprüft diese und erteilt Ihnen die automatische Berechtigung.

Denken Sie daran, dass Sie, bevor Sie danach fragen, Folgendes tun müssen:

  • Haben Sie die Berechtigung SYSTEM_ALERT_WINDOW im Manifest

  • Fordern Sie den Benutzer auf, die Berechtigung SYSTEM_ALERT_WINDOW in Ihrer App zu erteilen, sofern dies noch nicht geschehen ist

Wenn ich etwas vermisse, können Sie die Antwort aktualisieren

Kzaf
quelle
Dies muss jetzt die richtige Antwort sein. Vielen Dank. Bitte fügen Sie einfach Ihre Antwort hinzu, wie wir den Benutzer programmgesteuert um diese Erlaubnis bitten können.
Eren Tüfekçi
2

Wenn die App auf API 22 oder niedriger abzielt, erteilt der Play Store die Berechtigung SYSTEM_ALERT_WINDOW und andere, wenn der Benutzer auf die Installation klickt (eine Warnung wird angezeigt), auch wenn sein Gerät Android 6.0 ist. Andernfalls, wenn die App auf API 23 oder höher abzielt Die Erlaubnis wird zur Erteilung zur Laufzeit angefordert.

Dennix
quelle
Gemäß der aktualisierten Play Store-Richtlinie (seit August 2018) sollten Sie kein SDK mit weniger als 26 als Ziel festlegen. Siehe diese Referenzlinks. 1) developer.android.com/distribute/best-practices/develop/… 2) medium.com/codespace69/…
Jayman Jani