SYSTEM_ALERT_WINDOW: cómo obtener este permiso automáticamente en Android 6.0 y targetSdkVersion 23

Facebook, Evernote, Pocket: todas las aplicaciones obtienen este permiso en Android 6.0 de forma automática, a pesar de que su objective es 23 ( targetSdkVersion=23 ).

Ha habido mucha documentación sobre el nuevo modelo de permiso Marshmallow. Uno de ellos es SYSTEM_ALERT_WINDOW ha sido ‘promovido’ a la clase de permiso ‘por encima del peligroso’ por lo que requiere una intervención especial del usuario para que las aplicaciones se les otorguen. Si la aplicación tiene targetSdkVersion 22 o inferior, la aplicación obtiene este permiso automáticamente (si se solicita en el manifiesto).

Sin embargo, he notado algunas aplicaciones que obtienen este permiso, sin necesidad de enviar al usuario a la configuración de la página especial de Draw over other apps permiso de Draw over other apps . Vi Facebook, Evernote, Pocket, y tal vez hay más.

¿Alguien sabe cómo se le puede otorgar a una aplicación este permiso sin que el usuario vaya a Settings -> Apps -> Draw over other apps ?

Gracias

Es un nuevo comportamiento introducido en Marshmallow 6.0.1 .

Todas las aplicaciones que soliciten el permiso SYSTEM_ALERT_WINDOW y que se instalen a través de Play Store (se requiere la versión 6.0.5 o superior), habrán otorgado el permiso automáticamente.

Si, en cambio, la aplicación se carga de forma lateral, el permiso no se concede automáticamente. Puede intentar descargar e instalar el APK de Evernote desde apkmirror.com . Como puede ver, necesita otorgar el permiso manualmente en Settings -> Apps -> Draw over other apps .

Estos son los commits [1] [2] que permiten a Play Store otorgar la concesión automática del permiso SYSTEM_ALERT_WINDOW .

Yeh después de que Marshmallow venga a Android haga que el nivel de seguridad sea más difícil, pero para

 SYSTEM_ALERT_WINDOW 

puede mostrar acción flotante y cualquier cosa. Puede onCreate() a los usuarios a otorgarle permiso. Siga los códigos en su método onCreate() Coloque este código después de 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); } 

La acción ACTION_MANAGE_OVERLAY_PERMISSION inicia directamente la pantalla de permiso ‘Dibujar sobre otras aplicaciones’.


Editar: Mi código anterior funciona al 100% Correcto

Pero descubrí que muchos chicos todavía están buscando que cómo puede permitir ACTION_MANAGE_OVERLAY_PERMISSION permanentemente, como si el usuario ha ACTION_MANAGE_OVERLAY_PERMISSION permiso una vez, entonces no lo preguntes cada vez que abre la aplicación, así que escucha la solución para ti.

  1. Verifica si el dispositivo tiene API 23+

  2. si tiene más de 23 API, verifique si el usuario tiene permiso o no

  3. si tuviera permiso una vez, no lo lleve a Settings.ACTION_MANAGE_OVERLAY_PERMISSION y, si aún no lo ha permitido, solicite verificación del permiso de tiempo de ejecución

Ponga debajo de la línea en su método onCreate() . Pon esto después de setContentView

 checkPermission(); 

Ahora ponga el código debajo en 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 } } } 

Ahora, finalmente, el código de método 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); } } } 

Y no te olvides de declarar esta variable pública en tu clase

 public static int ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE = 5469; 

Si la aplicación apunta a API 22 o inferior, Play Store otorgará el permiso SYSTEM_ALERT_WINDOW y otros cuando el usuario haga clic para instalar (mostrando una alerta) incluso si su dispositivo es Android 6.0. De lo contrario, si la aplicación apunta a API 23 o superior, de modo que se solicitará permiso para otorgar en tiempo de ejecución.