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

Facebook, Evernote, Pocket – alle Apps erhalten diese Berechtigung automatisch für Android 6.0, obwohl sie auf Targeting 23 ( targetSdkVersion=23 ) ausgerichtet sind.

Es gab eine Menge Dokumentation bezüglich des neuen Marshmallow-Berechtigungsmodells. Einer von ihnen ist SYSTEM_ALERT_WINDOW wurde zu “über gefährliche” Berechtigungsklasse “befördert” und erfordert daher eine spezielle Benutzereingriff, damit Apps mit diesen gewährt werden. Wenn die App targetSdkVersion 22 oder niedriger hat, erhält die App diese Berechtigung automatisch (falls im Manifest angefordert).

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

Jeder weiß, wie eine App diese Berechtigung erhalten kann, ohne dass der Benutzer Settings -> Apps -> Draw over other apps ?

Vielen Dank

   

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

Jede App, die die SYSTEM_ALERT_WINDOW 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 side geladen wird, wird die Berechtigung nicht automatisch gewährt. Sie können versuchen, die Evernote APK von apkmirror.com herunterzuladen und zu installieren. Wie Sie sehen können, müssen Sie die Berechtigung manuell unter Settings -> Apps -> Draw over other apps .

Dies sind die Commits [1] [2] , die es dem Play Store ermöglichen, die Berechtigung SYSTEM_ALERT_WINDOW automatisch zu erteilen.

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

 SYSTEM_ALERT_WINDOW 

Sie können die Floating-Aktion und alles onCreate() Sie onCreate() können, um dem Benutzer die Berechtigung zu erteilen. onCreate() Sie den Codes in Ihrer onCreate() -Methode. Setzen Sie diesen Code hinter 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); } 

Die Aktion ACTION_MANAGE_OVERLAY_PERMISSION startet direkt den ACTION_MANAGE_OVERLAY_PERMISSION “Über andere Apps ziehen”.


Bearbeiten: Mein oben Code funktioniert 100% korrekt

Aber ich habe gerade festgestellt, dass viele Leute immer noch suchen, wie ACTION_MANAGE_OVERLAY_PERMISSION dauerhaft zugelassen werden kann. Wenn der Benutzer Erlaubnis erlaubt hat, dann frage ihn nicht jedes Mal, wenn er die Anwendung öffnet , um die Lösung für dich zu hören-

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

  2. wenn 23+ API dann überprüfen, ob Benutzer Erlaubnis hat oder nicht

  3. Wenn er einmal erlaubt war, fahren Sie ihn nicht zu Settings.ACTION_MANAGE_OVERLAY_PERMISSION und wenn noch keine Genehmigung vorliegt, fragen Sie nach der Berechtigungsprüfung für die Laufzeit

Setzen Sie Ihre onCreate() -Methode unter die Zeile. Setzen Sie dies nach setContentView

 checkPermission(); 

onActivityResult nun den folgenden Code in 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 } } } 

Jetzt 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 vergiss nicht, diese öffentliche Variable in deiner class zu deklarieren

 public static int ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE = 5469; 

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 anzeigt), selbst wenn sein Gerät Android 6.0 ist. Andernfalls wird API 23 oder höher verwendet Die Berechtigung wird zur Laufzeit gewährt.