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

82

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_WINDOWsido "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 targetSdkVersion22 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 appspermisos 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

oriharel
fuente
stackoverflow.com/questions/33139754/… esta publicación me ayudó a mostrar el permiso de diálogo de escritura en externo
Bharath
1
Actualización 2020: stackoverflow.com/a/60005258/4720433
Kzaf

Respuestas:

116

Es un nuevo comportamiento introducido en Marshmallow 6.0.1 .

Cada aplicación que solicite el SYSTEM_ALERT_WINDOWpermiso 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_WINDOWpermiso.

Mattia Maestrini
fuente
6
Aunque me pregunto cómo es que un permiso 'por encima de peligroso' de repente ahora está 'por debajo de lo normal'. Quiero decir, ni siquiera puedes ver este permiso en una ventana emergente, y las aplicaciones pueden obtenerlo automáticamente. ¿Alguna idea?
oriharel
El permiso permanece, above dangerousde 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.
Mattia Maestrini
2
@oriharel Me pregunto si la escala masiva de Facebook Messenger empujó a Google en esta dirección para apoyar esto. Podría haber sido que Facebook llegó a un acuerdo con Google para no obligar al usuario a otorgar el permiso para que los chatheads pudieran seguir funcionando.
dennisdrew
3
Cuando pregunté sobre este comportamiento de concesión automática de este permiso (pensé que la razón era otra: el targetSdk), la respuesta de Google fue "Este es un comportamiento previsto para permitir que las aplicaciones populares sigan funcionando hasta que tengamos una API alternativa en el plataforma para que estas aplicaciones migren ". . Aquí están las publicaciones: code.google.com/p/android/issues/detail?id=227123 code.google.com/p/android/issues/detail?id=222195
desarrollador de Android
1
@MattiaMaestrini, ¿puedes echar un vistazo a esta pregunta similar? stackoverflow.com/questions/54378632/…
ram
74

Yeh 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 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_PERMISSIONlanza 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-

  1. Compruebe si el dispositivo tiene API 23+

  2. si tiene 23+ API, compruebe si el usuario tiene permiso o no

  3. si tuvo permiso una vez, no lo lleve Settings.ACTION_MANAGE_OVERLAY_PERMISSIONy si aún no lo tiene, solicite la verificación de permiso de tiempo de ejecución

Ponga 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;
Jayman Jani
fuente
1
@JaymanJani Hola, esto funciona para mí, pero quiero que el botón de encendido y apagado del evento
PriyankaChauhan
onPermission concedido ¿qué debo hacer? Quiero abrir la aplicación
Santanu Sur
Buena solución. Pero no es necesario verificar el permiso canDrawOverlays en el método onActivityResult nuevamente, ya que ya lo verificamos en el método checkPermission ().
VahidShir
Funciona, muy bien, pero ahora no puedo tocar los elementos del menú de la barra de herramientas. ¿Es posible hacer lo?
Pablo R.
Hola, si alguien tiene
algún
13

Ahora ( 2019 ) que Google ofrece una API alternativa SYSTEM_ALERT_WINDOWen forma de Bubbles en Android Q, Google ha decidido finalmente desaprobarlo SYSTEM_ALERT_WINDOWen una futura versión de Android.

Y los dispositivos Android Go ya no otorgarán este permiso, es decirSettings.canDrawOverlays() == false

Dickson el desarrollador
fuente
¿Cómo sabes esto? La documentación dice que todavía está en versión preliminar. developer.android.com/guide/topics/ui/bubbles
Noa Drach
Cierto @NoaDrach, por eso dije que en el futuro Google eventualmente desaprobará SAW, es decir, cuando Bubble API sea estable. youtu.be/td3Kd7fOROw?t=136
Dickson el desarrollador
gracias, estaba preguntando b / c mi aplicación (que todavía no está dirigida a Q), solía recibir este permiso automáticamente cuando se instalaba desde Play Store, y ahora no lo obtenemos automáticamente. Supongo que es debido a
Noa Drach
@Dicksonthedeveloper Por favor, déjeme cómo identificar qué dispositivo no tiene la función de SYSTEM_ALERT_WINDOW o el permiso de superposición de pantalla. Necesito una solución de este stackoverflow.com/questions/63938787/…
Shaikh Mohib
Android 11 contiene esta API
NothingtoSay
9

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.

Kzaf
fuente
Esta debe ser la respuesta correcta ahora. Gracias. Simplemente agregue su respuesta sobre cómo podemos solicitar al usuario este permiso mediante programación.
Eren Tüfekçi
2

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.

Dennix
fuente
De acuerdo con la política actualizada de Play Store (desde agosto de 2018), no debe apuntar a SDK Menos de 26, consulte los enlaces de esta referencia 1) developer.android.com/distribute/best-practices/develop/… 2) medium.com/codespace69/…
Jayman Jani