web-dev-qa-db-fra.com

Ouvrir les paramètres d'autorisation de l'application

Concernant les autorisations granulaires sur Android M.

Dans le cas où l'utilisateur refuse deux fois la demande d'autorisation,

Ou que l'utilisateur coche la case "Ne plus demander".

Comment puis-je ouvrir/créer un lien direct vers les paramètres d'autorisations de l'application?

29
David

Supposons dans AndroidManifest.xml que vous avez:

<uses-permission Android:name="Android.permission.WRITE_CALENDAR"/>
<uses-permission Android:name="Android.permission.WRITE_CONTACTS"/>
<!-- ETC. -->

Ensuite, comme dans l'exemple d'activité ci-dessous, nous pouvons vérifier les autorisations existantes/accordées, puis envoyer l'utilisateur aux paramètres de l'application s'il nous manque une autorisation:

package com.example.permissions.myapplication;

import Android.Manifest;
import Android.content.Intent;
import Android.content.pm.PackageManager;
import Android.net.Uri;
import Android.os.Build;
import Android.os.Bundle;
import Android.provider.Settings;
import Android.support.annotation.NonNull;
import Android.support.v7.app.AppCompatActivity;
import Android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    private static final int REQUEST_APP_SETTINGS = 168;

    private static final String[] requiredPermissions = new String[]{
            Manifest.permission.WRITE_CALENDAR,
            Manifest.permission.WRITE_CONTACTS
            /* ETC.. */
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        /* All version with SDK_INT < 22 grant permissions on install time. */
        if (Build.VERSION.SDK_INT > 22 && !hasPermissions(requiredPermissions)) {
            Toast.makeText(this, "Please grant all permissions", Toast.LENGTH_LONG).show();
            goToSettings();
        }
    }

    private void goToSettings() {
        Intent myAppSettings = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("package:" + getPackageName()));
        myAppSettings.addCategory(Intent.CATEGORY_DEFAULT);
        myAppSettings.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivityForResult(myAppSettings, REQUEST_APP_SETTINGS);
    }

    public boolean hasPermissions(@NonNull String... permissions) {
        for (String permission : permissions)
            if (PackageManager.PERMISSION_GRANTED != checkSelfPermission(permission))
                return false;
        return true;
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == REQUEST_APP_SETTINGS) {
            if (hasPermissions(requiredPermissions)) {
                Toast.makeText(this, "All permissions granted!", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(this, "Permissions not granted.", Toast.LENGTH_LONG).show();
            }
        }
        super.onActivityResult(requestCode, resultCode, data);
    }
}

Je viens de l'essayer sur Nexus 6/AndroidOS 6 (Marshmallow).

23
Andrei Marcut

utilisez ce code pour lancer la page des paramètres d'autorisation de votre application

Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
            Uri.parse("package:" + getPackageName()));
    intent.addCategory(Intent.CATEGORY_DEFAULT);
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);
6
Deena Nath