webentwicklung-frage-antwort-db.com.de

Öffnen Sie die App-Berechtigungseinstellungen

In Bezug auf granulare Berechtigungen auf Android M.

Falls der Benutzer die Anforderung einer Erlaubnis zweimal ablehnt,

Oder dass der Benutzer das "Nie wieder fragen" markiert.

Wie kann ich die App-Berechtigungseinstellungen direkt öffnen/verknüpfen?

29
David

Nehmen wir an, dass Sie in AndroidManifest.xml Folgendes haben:

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

Dann können wir, wie in der folgenden Beispielaktivität, nach vorhandenen/erteilten Berechtigungen suchen und den Benutzer dann an die App-Einstellungen senden, wenn wir keine Berechtigung haben:

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

Ich habe es gerade auf Nexus 6/AndroidOS 6 (Marshmallow) ausprobiert.

23
Andrei Marcut

verwenden Sie diesen Code, um die Seite mit den App-Berechtigungseinstellungen zu starten

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