write_secure_settings wake_lock read_contacts permission name internet access_network_state android android-permissions android-6.0-marshmallow target-sdk system-alert-window

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.

  1. Compruebe si el dispositivo tiene API 23+

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

  3. 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;