Facebook, Evernote, Pocket: todas las aplicaciones obtienen este permiso en Android 6.0 automáticamente, aunque su objetivo sea 23 ( targetSdkVersion=23
).
Ha habido mucha documentación sobre el nuevo modelo de permisos de Marshmallow. Uno de ellos ha SYSTEM_ALERT_WINDOW
sido "promovido" a la clase de permiso "por encima de peligroso", por lo que requiere una intervención especial del usuario para que las aplicaciones reciban esos permisos. Si la aplicación tiene targetSdkVersion
22 o menos, la aplicación obtiene este permiso automáticamente (si se solicita en el manifiesto).
Sin embargo, he notado que algunas aplicaciones obtienen este permiso, sin necesidad de enviar al usuario a la página especial de Draw over other apps
permisos de configuración . Vi Facebook, Evernote, Pocket, y tal vez haya más.
¿Alguien sabe cómo se puede otorgar este permiso a una aplicación sin que el usuario pase Settings -> Apps -> Draw over other apps
?
Gracias
Respuestas:
Es un nuevo comportamiento introducido en Marshmallow 6.0.1 .
Cada aplicación que solicite el
SYSTEM_ALERT_WINDOW
permiso y que se instale a través de Play Store (se requiere la versión 6.0.5 o superior), habrá otorgado el permiso automáticamente.Si, en cambio, la aplicación se descarga, el permiso no se otorga automáticamente. Puedes intentar descargar e instalar el APK de Evernote desde apkmirror.com . Como puede ver, debe otorgar manualmente el permiso en
Settings -> Apps -> Draw over other apps
.Estas son las confirmaciones [1] [2] que permiten a Play Store otorgar automáticamente el
SYSTEM_ALERT_WINDOW
permiso.fuente
above dangerous
de hecho, si descarga la aplicación, no se otorga el permiso. Solo Play Store tiene un comportamiento diferente y otorga automáticamente el permiso, tal vez pensaron que las aplicaciones en Play Store no son maliciosas y se puede confiar en ellas. O tal vez recibieron muchas quejas sobre este cambio y decidieron encontrar una solución.Yeh Después de Marshmallow, Android hace que el nivel de seguridad se adhiera más, pero para
puede mostrar la acción flotante y cualquier
onCreate()
cosa.Puede Forzar al usuario a que le dé permiso Siguiendo los códigos en su método. 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
lanza directamente la pantalla de permisos 'Dibujar sobre otras aplicaciones'.Editar: Mi código anterior funciona 100% correcto
Pero acabo de descubrir que muchos chicos todavía están buscando cómo pueden permitir
ACTION_MANAGE_OVERLAY_PERMISSION
permanentemente Me gusta Si el usuario ha permitido Permiso una vez, entonces no lo pregunte cada vez que abra la aplicación, así que escuche la solución para usted-Compruebe si el dispositivo tiene API 23+
si tiene 23+ API, compruebe si el usuario tiene permiso o no
si tuvo permiso una vez, no lo lleve
Settings.ACTION_MANAGE_OVERLAY_PERMISSION
y si aún no lo tiene, solicite la verificación de permiso de tiempo de ejecuciónPonga debajo de la línea en su
onCreate()
método. Pon esto despuéssetContentView
checkPermission();
Ahora ponga el código debajo
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 del 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 olvides declarar esta variable pública en tu clase.
public static int ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE = 5469;
fuente
Ahora ( 2019 ) que Google ofrece una API alternativa
SYSTEM_ALERT_WINDOW
en forma de Bubbles en Android Q, Google ha decidido finalmente desaprobarloSYSTEM_ALERT_WINDOW
en una futura versión de Android.Y los dispositivos Android Go ya no otorgarán este permiso, es decir
Settings.canDrawOverlays() == false
fuente
Para aquellos que quieran obtener este permiso automáticamente cuando la aplicación se descargue de Play Store, además del SYSTEM_ALERT_WINDOW en el Manifiesto, deben ir a este enlace y solicitarlo a Google.
Debe proporcionar información adicional por qué necesita este permiso y Google lo revisará y le otorgará el permiso automáticamente.
Tenga en cuenta que antes de solicitar esto, debe:
Tener el permiso SYSTEM_ALERT_WINDOW en el manifiesto
Solicitar al usuario que otorgue el permiso SYSTEM_ALERT_WINDOW dentro de su aplicación, cuando aún no lo haya otorgado
Si me pierdo algo, no dude en actualizar la respuesta.
fuente
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.
fuente