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

330

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?

Écran d'autorisation Android M

Il est possible d'afficher les paramètres de l'application avec le code suivant - existe-t-il une solution analogique pour 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 des recherches à ce sujet mais je n'ai pas pu trouver de solution appropriée - j'apprécierais chaque aide!

Frederik Schweiger
la source
Essayez ceci, cela peut être un travail stackoverflow.com/a/41221852/5488468
Bipin Bharti

Réponses:

443

Selon la vidéo officielle des autorisations Marshmallow (à la marque 4m 43s ), vous devez ouvrir la page Paramètres de l'application à la place (à partir de là, il suffit d'un clic pour accéder à la page Autorisations).

Pour ouvrir la page des paramètres, vous feriez

Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
startActivity(intent);
Martin Konecny
la source
12
Il redirige vers les détails généraux de l'écran d'application. Comment accéder à l'écran des autorisations d'application spécifiquement. Je ne veux pas que ça reste un clic aussi,
Milind Mevada
5
@MilindMevada - vous ne pouvez pas faire cela pour le moment.
Martin Konecny
pourriez-vous envoyer des données de l'activité des paramètres à votre activité en utilisant des intentions, en "temps réel"? le problème auquel je suis confronté est de gérer ces données dans votre activité une fois qu'elles ont été envoyées à partir des paramètres.
ThunderWiring
Cela fonctionne lors du débogage de l'application, mais se bloque sans raison réelle après la signature de l'APK. Rien d'évident non plus dans le logcat.
JCutting8
181

Ce n'est pas possible.J'ai essayé de le faire aussi. J'ai pu comprendre le nom du package et l'activité qui va démarrer. Mais à la fin, vous obtiendrez une exception de sécurité en raison d'une autorisation manquante que vous ne pouvez pas déclarer.

METTRE À JOUR:

En ce qui concerne l'autre réponse, je 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 l'avoir dans ma pile d'historique, je le supprime en utilisant des indicateurs d'intention.

Thomas R.
la source
J'ai vécu la même chose et j'ai pensé qu'il pourrait y avoir une solution de contournement / une autre solution pour cela ...: - /
Frederik Schweiger
Non, malheureusement, ce n'est pas possible par conception. Pour plus d'informations, consultez cette discussion sur Google+: goo.gl/Wqjjff
Frederik Schweiger
1
@Mulgard Whatsapp doit utiliser targetSdk = "23". Cela permet à l'application d'inviter l'utilisateur à activer l'autorisation. Si votre SDK cible <23, pouvoir montrer à l'utilisateur l'écran des autorisations de l'application est utile, il semble cependant que nous ne pouvons afficher que l'écran des paramètres généraux de l'application.
vman
4
L'intention.FLAG_ACTIVITY_NO_HISTORY peut parfois provoquer une situation problématique sur les tablettes lorsqu'une fenêtre contextuelle s'affiche dans l'écran des paramètres, elle fermera l'écran des paramètres. La simple suppression de ce drapeau résoudra ce problème.
Wirling
2
Vous pouvez montrer un Toast en même temps en demandant à l'utilisateur d'entrer dans "Permission" (bonne idée de localiser ce message même si le reste de votre application n'est pas disponible dans la langue de l'utilisateur)
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);

Description Ouvre la page de configuration Détails pour l'application. À partir de là, l'utilisateur doit attribuer manuellement l'autorisation souhaitée.

Settings.ACTION_APPLICATION_DETAILS_SETTINGS
  

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

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

intent.setData(uri)
   N'oubliez pas de régler cela . Sinon, vous obtiendrez android.content.ActivityNotFoundException . Parce que vous avez défini votre intention Settings.ACTION_APPLICATION_DETAILS_SETTINGS et Android attend un nom à rechercher.

singhpradeep
la source
C'est littéralement la réponse la plus votée. Pourquoi dupliquer cela et ne pas étendre la réponse d'origine?!
Thomas Keller
1
Merci pour l'explication approfondie.
David Refoua
34

Au lieu de cela, vous pouvez ouvrir les paramètres généraux d'une application particulière avec une seule ligne

 startActivity(new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("package:" + BuildConfig.APPLICATION_ID)));
dgngulcan
la source
Vous pouvez utiliser getActivity (). GetPackageName () pour obtenir le nom du package en fonction de la configuration de votre build.
Cory Roy
15

Il n'est pas possible d'ouvrir par programme 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

entrez la description de l'image ici

Vignes
la source
1
Il demande la page d'autorisation
Maveň ツ
10

Si vous souhaitez écrire moins de code, Kotlinvous pouvez le faire:

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

D'après la réponse de Martin Konecny

Ultimo_m
la source
belle utilisation des extensions Kotin
David Jarvis
8

Style Kotlin.

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

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

Si nous parlons de FLYME OS (Meizu) UNIQUEMENT il existe sa propre application de sécurité avec des 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();
    }
}

De causes buildconfig est votre application buildconfig .

Daniel
la source
3

Xamarin forme 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
la source
0

il n'est pas possible d'obtenir la permission de façon pragmatique ... mais je vous suggère de ne pas mettre cette ligne de code dans try {} catch {}, ce qui fera malheureusement arrêter votre application ... et dans catch body créer une boîte de dialogue qui naviguera dans le l'utilisateur à un petit tutoriel pour activer la permission de dessiner sur d'autres applications ... puis sur le bouton oui, cliquez sur mettre ce code ...

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

cette intention est d' ouvrir directement la liste de tirage sur d'autres applications pour gérer les autorisations, puis à partir d'ici, il suffit d'un clic pour dessiner sur d'autres applications Autorisations ... je sais que ce n'est pas la réponse que vous recherchez ... mais Je fais ça dans mes applications ...

Ashish
la source