Android 6.0 öffnen fehlgeschlagen: EACCES (Berechtigung verweigert)

Ich habe uses-permission einschließlich WRITE_EXTERNAL_STORAGEMOUNT_UNMOUNT_FILESYSTEMSREAD_EXTERNAL_STORAGE zu AndroidManifest.xml hinzugefügt.

Als ich versuchte, meine Anwendung auf dem Nexus5 (Android 6.0) auszuführen, kam es zu einer Ausnahme wie unten:

java.io.IOException: open failed: EACCES (Berechtigung verweigert)

Und ich habe versucht, ein anderes Android-Handy (Android 5.1), alles war OK.Here's den Code:

private File createImageFile() throws IOException {
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    String imageFileName = "JPEG_" + timeStamp + "_";
    File storageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
    File image = File.createTempFile(imageFileName, ".jpg", storageDir);
    currentPhotoPath = image.getAbsolutePath();
    return image;
}

Gibt es bei Android 6.0 einen Unterschied bei den Berechtigungen?

Lösung

Android hat ein neues Berechtigungsmodell für Android 6.0 (Marshmallow) hinzugefügt.

http://www.captechconsulting.com/blogs/runtime-permissions-best-practices-and-how-to-gracefully-handle-permission-removal

Sie müssen also Runtime Permission überprüfen:

Was sind Laufzeitberechtigungen?

Mit Android 6.0 Marshmallow hat Google ein neues Berechtigungsmodell eingeführt, das es dem Benutzer ermöglicht, besser zu verstehen, warum eine Anwendung bestimmte Berechtigungen anfordert. Anstatt dass der Nutzer bei der Installation blind alle Berechtigungen akzeptiert, wird er nun aufgefordert, Berechtigungen zu akzeptieren, wenn sie während der Nutzung der Anwendung notwendig werden.

Wann soll das neue Modell implementiert werden?

Das neue Modell muss erst dann vollständig unterstützt werden, wenn Sie sich für die Version 23 in Ihrer Anwendung entscheiden. Wenn Sie die Version 22 oder niedriger anstreben, wird Ihre Anwendung bei der Installation alle Berechtigungen anfordern, so wie sie es auf jedem Gerät mit einem Betriebssystem unter Marshmallow tun würde.

Diese Informationen stammen von hier:

Bitte prüfen Sie unter diesem Link, wie Sie die Anwendung implementieren können:

http://www.captechconsulting.com/blogs/runtime-permissions-best-practices-and-how-to-gracefully-handle-permission-removal

Kommentare (4)

In Android 6 (Marshmallow) kann der Benutzer, auch wenn er bei der Installation alle Berechtigungen akzeptiert hat, später beschließen, Ihnen einige dieser Berechtigungen zu entziehen.

Schnelle Lösung, aber nicht empfohlen: vielleicht, wenn Sie Ihre targetSdkVersion in der gradle zu 22 ändern, wird das Problem gelöst werden.

Wie zu implementieren?(Best Practices)

  1. Stellen Sie zunächst fest, ob das Gerät des Benutzers ein Marshmallow-Gerät ist oder nicht:

    private boolean shouldAskPermission(){
    
    return(Build.VERSION.SDK_INT>Build.VERSION_CODES.LOLLIPOP_MR1);
    
    }
  2. Wenn shouldAskPermission() den Wert true zurückgibt, fragen Sie nach der benötigten Erlaubnis:

    String[] perms = {"android.permission.WRITE_EXTERNAL_STORAGE"};
    
    int permsRequestCode = 200;
    
    requestPermissions(perms, permsRequestCode);

Die Methode "requestPermissions(String[] permissions, int requestCode)" ist eine öffentliche Methode innerhalb der Klasse Android Activity.

  1. Sie erhalten die Ergebnisse Ihrer Anfrage in der Methode onRequestPermissionResult wie unten gezeigt:

    @Override
    public void onRequestPermissionsResult(int permsRequestCode, String[] permissions, int[] grantResults){
    
    switch(permsRequestCode){
    
        case 200:
    
            boolean writeAccepted = grantResults[0]==PackageManager.PERMISSION_GRANTED;
    
            brechen;
    
    }
    
    }

Nachdem Sie die Ergebnisse erhalten haben, müssen Sie sie entsprechend verarbeiten.

Vorgeschlagener Ablauf für Berechtigungen:

Weitere Informationen:

Ein Benutzer mit einem Marshmallow-Gerät hat nun die Möglichkeit, gefährliche Berechtigungen über die Anwendungseinstellungen zu widerrufen

Android definiert einige Berechtigungen als "gefährlich" und einige als "normal". Beide sind im Manifest Ihrer Anwendung erforderlich, aber nur gefährliche Berechtigungen erfordern eine Laufzeitanforderung.

Wenn Sie sich entschieden haben, das neue Berechtigungsmodell (Laufzeitanforderung) nicht zu implementieren, kann der Entzug von Berechtigungen zu unerwünschten Benutzererfahrungen und in einigen Fällen zu Anwendungsabstürzen führen.

In der folgenden Tabelle sind alle aktuellen gefährlichen Berechtigungen und ihre jeweiligen Gruppen aufgeführt:

Wenn der Benutzer eine Berechtigung in einer Gruppe/Kategorie akzeptiert, akzeptiert er die gesamte Gruppe!

Quelle:http://www.captechconsulting.com

Benutzung der Dexter-Bibliothek:

Sie können Dexter verwenden. Android-Bibliothek, die den Prozess der Abfrage von Berechtigungen zur Laufzeit vereinfacht.

Kommentare (1)

Sie können auch ActivityCompat.requestPermissions verwenden, um rückwärtskompatibel zu sein.

Beispiel:

private static final int REQUEST_CODE = 0x11;

String[] permissions = {"android.permission.WRITE_EXTERNAL_STORAGE"};
ActivityCompat.requestPermissions(this, permissions, REQUEST_CODE); // without sdk version check

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);

    if (requestCode == REQUEST_CODE) {
        if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // save file
        } else {
            Toast.makeText(getApplicationContext(), "PERMISSION_DENIED", Toast.LENGTH_SHORT).show();
        }
    }
}
Kommentare (0)