web-dev-qa-db-fra.com

Comment ouvrir par programme l'écran de permission pour une application spécifique sur Android Marshmallow?

J'ai une question concernant la nouvelle version d'Android Marshmallow:

Est-il possible d'afficher l'écran d'autorisation pour une application spécifique via une intention ou quelque chose de similaire?

Android M Permission Screen

Il est possible d'afficher les paramètres de l'application avec le code suivant. Existe-t-il une solution analogique permettant d'ouvrir directement l'écran d'autorisation?

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

J'ai déjà fait quelques recherches à ce sujet mais je n'ai pas pu trouver de solution adéquate - j'apprécierais toute aide!

287
Frederik Schweiger

Selon la vidéo officielle des autorisations de Marshmallow (au niveau 4m 43s ), vous devez ouvrir la page Paramètres de l'application (à partir de là, cliquez sur la page Autorisations en un clic).

Pour ouvrir la page des paramètres, vous feriez

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

Ce n'est pas possible. J'ai essayé de le faire aussi. Je pourrais trouver le nom du paquet et l'activité qui sera démarrée. Mais à la fin, vous obtiendrez une exception de sécurité en raison d'une autorisation manquante que vous ne pourrez pas déclarer.

METTRE À JOUR:

En ce qui concerne l'autre réponse, je vous recommande également d'ouvrir l'écran des paramètres de l'application. Je le fais avec le code suivant:

    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);
}

Comme je ne veux pas avoir cela dans ma pile d'historique, je le supprime en utilisant des indicateurs d'intention.

171
Thomas R.
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);

Description

Settings.ACTION_APPLICATION_DETAILS_SETTINGS
Ouvre la page de configuration des détails pour App. À partir de là, l'utilisateur doit attribuer manuellement l'autorisation souhaitée.

Intent.FLAG_ACTIVITY_NEW_TASK
Facultatif . Si défini, ouvre alors l'écran Paramètres (Activité) en tant que nouvelle activité. Sinon, il sera ouvert dans l'activité en cours.

Uri.fromParts("package", getPackageName(), null)
Prépare ou crée l'URI, alors que getPackageName () - renvoie le nom de votre package d'application.

intent.setData(uri)
N'oubliez pas de définir ceci . Sinon, vous obtiendrez Android.content.ActivityNotFoundException. Parce que vous avez défini votre intention sur Settings.ACTION_APPLICATION_DETAILS_SETTINGS et qu'Android attend qu'un nom soit recherché.

59
singhpradeep

Au lieu de cela, vous pouvez ouvrir les paramètres généraux de certaines applications avec une seule ligne

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

Il n'est pas possible d'ouvrir de manière pragmatique l'écran d'autorisation. Au lieu de cela, nous pouvons ouvrir l'écran des paramètres de l'application.

Code

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

Exemple de sortie

enter image description here

9
Vignes

Si vous voulez écrire moins de code dans Kotlin, vous pouvez faire ceci:

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

Basé sur Martin Konecny answer

3
Ultimo_m

Si nous parlons de FLYME OS (Meizu) ONLY il existe sa propre application de sécurité avec autorisations.

Pour l'ouvrir, utilisez l'intention suivante:

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

La cause BuildConfig est la version de votre application BuildConfig .

3
Daniel

Peut-être que cela vous aidera

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

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

ce n'est pas possible pour obtenir la permission de façon pragmatique ... mais je vous suggère mal de mettre cette ligne de code dans try {} catch {}, ce qui rendra malheureusement votre application obsolète ... et dans catch body make une boîte de dialogue qui permettra à l'utilisateur d'accéder à un petit tutoriel pour activer l'autorisation de dessiner par rapport aux autres applications ... puis cliquez sur le bouton Oui pour mettre ce code ...

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

cette intention est de ouvrir directement la liste des tirages par-dessus d’autres applications pour gérer les autorisations, puis à partir d’ici c’est un clic vers le tirage par rapport aux autres applications Autorisations ... Je sais que ce n’est pas la réponse que vous avez cherchez ... mais je le fais dans mes applications ...

1
Ashish