wake_lock - SYSTEM_ALERT_WINDOW-Cómo obtener este permiso automáticamente en Android 6.0 y targetSdkVersion 23
android permission write_secure_settings (4)
Facebook, Evernote, Pocket: todas las aplicaciones obtienen este permiso en Android 6.0 automáticamente, a pesar de que apuntan a 23 (
targetSdkVersion=23
).
Ha habido mucha documentación sobre el nuevo modelo de permiso Marshmallow.
Una de ellas es que
SYSTEM_ALERT_WINDOW
ha sido ''promovido'' a la clase de permiso ''por encima de peligroso'', lo que requiere una intervención especial del usuario para que las aplicaciones puedan ser otorgadas con ellos.
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 que algunas aplicaciones obtienen este permiso, sin necesidad de enviar al usuario a la página especial de configuración 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 este permiso a una aplicación sin que el usuario vaya a
Settings -> Apps -> Draw over other apps
?
Gracias
Ahora (
2019
) que Google ofrece una API alternativa a
SYSTEM_ALERT_WINDOW
en forma de
Bubbles
en Android Q, Google ha decidido desaprobar eventualmente
SYSTEM_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
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 descarga lateralmente, 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 que Play Store otorgue la concesión automática del permiso
SYSTEM_ALERT_WINDOW
.
Si la aplicación se dirige a la 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 la API 23 o superior, de modo que Se solicitará permiso para otorgar en tiempo de ejecución.
Yeh Después de que Marshmallow llegue, Android hace que el nivel de seguridad sea más rígido, pero para
SYSTEM_ALERT_WINDOW
puede mostrar acciones flotantes y cualquier cosa Puede
onCreate()
al usuario a dar permiso para ello siguiendo 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 permisos ''Dibujar sobre otras aplicaciones''.
Editar: Mi código anterior funciona 100% correcto
Pero acabo de descubrir que muchos tipos todavía están buscando cómo permitir
ACTION_MANAGE_OVERLAY_PERMISSION
permanentemente, como si el usuario tiene permiso Permitir una vez, 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 más de 23 API, verifique si el usuario tiene permiso o no
-
si tuvo permiso una vez, no lo conduzca a
Settings.ACTION_MANAGE_OVERLAY_PERMISSION
y si aún no lo tiene, solicite una verificación de 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 siguiente código 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 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;