¿Cómo abrir programáticamente la pantalla de permiso para una aplicación específica en Android Marshmallow?

Tengo una pregunta sobre la nueva versión de Android Marshmallow:

¿Se puede mostrar la pantalla de permiso para una aplicación específica a través de un bash o algo similar?

Pantalla de permiso de Android M

Es posible visualizar la configuración de la aplicación con el siguiente código: ¿hay alguna solución analógica para abrir directamente la pantalla de permiso?

startActivity(new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.fromParts("package", getPackageName(), null))); 

Ya hice algunas investigaciones sobre esto, pero no pude encontrar una solución adecuada. ¡Agradecería toda ayuda!

De acuerdo con el video oficial de permisos de Marshmallow (en la marca de los 4m 43s ), debe abrir la página Configuración de la aplicación en su lugar (a partir de ahí, hay un clic en la página de Permisos).

Para abrir la página de configuración, harías

 Intent intent = new Intent(); intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); Uri uri = Uri.fromParts("package", getPackageName(), null); intent.setData(uri); startActivity(intent); 

Esto no es posible. Traté de hacerlo también. Pude averiguar el nombre del paquete y la actividad que se iniciará. Pero al final obtendrá una excepción de seguridad debido a un permiso faltante que no puede declarar.

ACTUALIZAR:

En cuanto a la otra respuesta, también recomiendo abrir la pantalla de configuración de la aplicación. Lo hago con el siguiente código:

  public static void startInstalledAppDetailsActivity(final Activity context) { if (context == null) { return; } final Intent i = new Intent(); i.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); i.addCategory(Intent.CATEGORY_DEFAULT); i.setData(Uri.parse("package:" + context.getPackageName())); i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); i.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); i.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); context.startActivity(i); } 

Como no quiero tener esto en mi stack de historia, lo elimino usando banderas de intención.

 Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); Uri uri = Uri.fromParts("package", getPackageName(), null); intent.setData(uri); startActivity(intent); 

Descripción

Settings.ACTION_APPLICATION_DETAILS_SETTINGS
Abre la página de configuración de detalles para la aplicación. Desde aquí, el usuario debe asignar manualmente el permiso deseado.

Intent.FLAG_ACTIVITY_NEW_TASK
Opcional . Si se establece, se abre la Pantalla de Configuración (Actividad) como nueva actividad. De lo contrario, se abrirá en la actividad en ejecución actualmente.

Uri.fromParts("package", getPackageName(), null)
Prepara o crea URI, mientras que getPackageName () – devuelve el nombre de su paquete de aplicación.

intent.setData(uri)
No te olvides de configurar esto . De lo contrario, obtendrá android.content.ActivityNotFoundException . Debido a que ha establecido su intención como Settings.ACTION_APPLICATION_DETAILS_SETTINGS y android espera algún nombre para buscar.

En cambio, puedes abrir la configuración general de una aplicación en particular con una línea

  startActivity(new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("package:" + BuildConfig.APPLICATION_ID))); 

Si estamos hablando de FLYME OS (Meizu) SOLAMENTE hay su propia aplicación de seguridad con permisos.

Para abrirlo, usa la siguiente intención:

 public static void openFlymeSecurityApp(Activity context) { Intent intent = new Intent("com.meizu.safe.security.SHOW_APPSEC"); intent.addCategory(Intent.CATEGORY_DEFAULT); intent.putExtra("packageName", BuildConfig.APPLICATION_ID); try { context.startActivity(intent); } catch (Exception e) { e.printStackTrace(); } } 

Of-cause BuildConfig es BuildConfig de su aplicación.

No es posible abrir pragmáticamente la pantalla de permisos. En cambio, podemos abrir la pantalla de configuración de la aplicación.

Código

 Intent i = new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("package:" + BuildConfig.APPLICATION_ID)); startActivity(i); 

Muestra de salida

enter image description here

Xamarin Forms Android:

 //--------------------------------------------------------- public void OpenSettings() //--------------------------------------------------------- { var intent = new Intent(Android.Provider.Settings.ActionApplicationDetailsSettings, Android.Net.Uri.Parse("package:" + Forms.Context.PackageName)); Forms.Context.StartActivity(intent); } 

Si quiere escribir menos código en Kotlin , puede hacer esto:

 fun Context.openAppSystemSettings() { startActivity(Intent().apply { action = Settings.ACTION_APPLICATION_DETAILS_SETTINGS data = Uri.fromParts("package", packageName, null) }) } 

Basado en la respuesta de Martin Konecny

no es posible obtener el permiso pragmáticamente … pero le sugiero que ponga esa línea de código en try {} catch {}, lo que hace que su aplicación desafortunadamente se detenga … y en catch body haga un cuadro de diálogo que navegará por el usuario a un pequeño tutorial para habilitar el sorteo sobre el permiso de otras aplicaciones … luego, sobre el botón sí, haga clic en poner este código …

  Intent callSettingIntent= new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION); startActivity(callSettingIntent); 

este bash es abrir directamente la lista de sorteo sobre otras aplicaciones para administrar los permisos y luego desde aquí está a un clic del sorteo sobre otras aplicaciones Permisos … sé que esta no es la respuesta que estás buscando … pero Estoy haciendo esto en mis aplicaciones …

Puede ser que esto te ayude

 private void openSettings() { Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); Uri uri = Uri.fromParts("package", getPackageName(), null); intent.setData(uri); startActivityForResult(intent, 101); } 

Es posible con el método requestPermissions

Aunque no puede ver directamente la página de configuración, puede cambiar los permisos de acceso.
Un buen ejemplo:
https://www.learn2crack.com/2015/10/android-marshmallow-permissions.html

De esta forma puedes verificar y llamar

 if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && checkSelfPermission(android.Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { requestPermissions(new String[]{android.Manifest.permission.READ_EXTERNAL_STORAGE}, 0); }