Solución:
Es un nuevo comportamiento introducido en Marshmallow. 6.0.1.
Cada aplicación que solicita el SYSTEM_ALERT_WINDOW
permiso y que se instala a través de Play Store (versión 6.0.5 o superior), habrá concedido el permiso automáticamente.
Si, en cambio, la aplicación se descarga, el permiso no se otorga automáticamente. Puede 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 la concesión automática de la SYSTEM_ALERT_WINDOW
permiso.
Sí, después de Marshmallow, Android hace que el nivel de seguridad se adhiera más, pero para
SYSTEM_ALERT_WINDOW
puede mostrar la acción flotante y cualquier cosa.Puede obligar al usuario a dar permiso para ello Siguiendo los códigos en su onCreate()
método Ponga 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 chicos todavía están buscando cómo permitir ACTION_MANAGE_OVERLAY_PERMISSION
Me gusta permanentemente Si el usuario ha permitido el permiso una vez, no lo pregunte cada vez que abra la aplicación así que escucha la solución para ti
-
Compruebe si el dispositivo tiene API 23+
-
si tiene 23+ API, compruebe si el usuario tiene permiso o no
-
si tuviera permiso una vez, no lo lleves a
Settings.ACTION_MANAGE_OVERLAY_PERMISSION
y si aún no tiene el permiso, solicite la verificación del permiso de tiempo de ejecución
Ponga debajo de la línea en su onCreate()
método. Pon esto después 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 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;
Ahora(2019) que Google ofrece una API alternativa a SYSTEM_ALERT_WINDOW
en forma de Burbujas en Android Q, Google ha decidido eventualmente desaprobar SYSTEM_ALERT_WINDOW
en una futura versión de Android.
Y dispositivos Android Go ya no concederá este permiso
es decir Settings.canDrawOverlays() == false