superposicion - ¿Cómo abrir mediante programación la pantalla de permisos para una aplicación específica en Android Marshmallow?
superposición de pantalla j7 (11)
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?
Es posible mostrar la configuración de la aplicación con el siguiente código: ¿existe 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!
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í, hay un clic en la página de Permisos).
Para abrir la página de configuración, haría
Intent intent = new Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
startActivity(intent);
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)));
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);
Salida de muestra
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);
}
Si desea 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
Si hablamos 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();
}
}
BuildConfig es la BuildConfig de su aplicación.
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 manera puede 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);
}
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);
}
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 un 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á buscando ... pero Estoy haciendo esto en mis aplicaciones ...
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.
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 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 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.