¿Cómo abrir mediante programación la pantalla de permisos para una aplicación específica en Android Marshmallow?

330

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

¿Es posible mostrar la pantalla de permisos para una aplicación específica a través de un intento o algo similar?

Pantalla de permiso de Android M

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

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

Ya investigué un poco sobre esto, pero no pude encontrar una solución adecuada, ¡agradecería toda ayuda!

Frederik Schweiger
fuente
Pruebe esto, puede ser trabajo stackoverflow.com/a/41221852/5488468
Bipin Bharti

Respuestas:

443

De acuerdo con el video oficial de permisos de Marshmallow (en la marca de 4m 43s ), debe abrir la página de Configuración de la aplicación (desde allí es un clic a la página de Permisos).

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

Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
startActivity(intent);
Martin Konecny
fuente
12
Está redirigiendo a detalles generales de la pantalla de la aplicación. Cómo puede ir específicamente a la pantalla de Permisos de aplicaciones. No quiero que queda un clic también,
Milind Mevada
55
@MilindMevada: no puedes hacer eso en este momento.
Martin Konecny
¿podría enviar datos de la actividad de configuración a su actividad mediante intentos, en "tiempo real"? el problema al que me enfrento es manejar estos datos en su actividad una vez que se enviaron desde la configuración.
ThunderWiring
Esto funciona al depurar la aplicación, pero se bloquea sin razón real después de firmar el APK. Nada obvio en el logcat tampoco.
JCutting8
181

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

ACTUALIZAR:

Con respecto a la otra respuesta, también recomiendo abrir la pantalla de configuración de la aplicación. Hago esto 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 pila de historial, lo elimino usando indicadores de intención.

Thomas R.
fuente
Experimenté lo mismo y pensé que podría haber una solución alternativa / otra solución para esto ...: - /
Frederik Schweiger
No, desafortunadamente no es posible por diseño. Para obtener más información, consulte esta discusión en Google+: goo.gl/Wqjjff
Frederik Schweiger
1
@Mulgard Whatsapp debe estar usando targetSdk = "23". Esto permite que la aplicación solicite al usuario que habilite el permiso. Si su SDK de destino <23, es útil poder mostrar al usuario la pantalla de permisos de la aplicación, sin embargo, parece que solo podemos mostrar la pantalla de configuración general de la aplicación.
vman
44
El Intent.FLAG_ACTIVITY_NO_HISTORY a veces puede causar una situación problemática en las tabletas cuando se muestra una ventana emergente dentro de la pantalla de configuración, cerrará la pantalla de configuración. Simplemente quitando esa bandera resolverá este problema.
Wirling
2
Puede mostrar un Toast al mismo tiempo que le indica al usuario que ingrese a "Permiso" (es una buena idea localizar este mensaje incluso si el resto de su aplicación no está disponible en el idioma del usuario)
vgergo
81
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 Abre la página de configuración Detalles para la aplicación. Desde aquí, el usuario debe asignar manualmente el permiso deseado.

Settings.ACTION_APPLICATION_DETAILS_SETTINGS
  

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 actualmente en ejecución.

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.

singhpradeep
fuente
Esto es literalmente la respuesta más votada. ¿Por qué duplicar esto y no extender la respuesta original?
Thomas Keller
1
Gracias por la explicación en profundidad.
David Refoua
34

En cambio, puede 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)));
dgngulcan
fuente
Es posible que desee usar getActivity (). GetPackageName () para obtener el nombre del paquete dependiendo de cómo esté configurada su compilación.
Cory Roy
15

No es posible abrir mediante programación 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);

Salida de muestra

ingrese la descripción de la imagen aquí

Vignes
fuente
1
Él está pidiendo una página de permiso
Maveň ツ
10

Si desea escribir menos código 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

Ultimo_m
fuente
buen uso de las extensiones de Kotin
David Jarvis
8

Estilo Kotlin

    startActivity(Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).apply {
        data = Uri.fromParts("package", packageName, null)
    })
Sai
fuente
5

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);
}
Sandeep Kumar
fuente
3

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

Para abrirlo use 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();
    }
}

De las causas BuildConfig es de su aplicación BuildConfig .

Daniel
fuente
3

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);
}
Nick Kovalsky
fuente
0

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

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

esta intención es abrir directamente la lista de sorteo sobre otras aplicaciones para administrar los permisos y luego desde aquí es un clic para dibujar sobre otras aplicaciones Permisos ... Sé que esta no es la respuesta que estás buscando ... pero Estoy haciendo esto en mis aplicaciones ...

Ashish
fuente