2015-10-09 29 views
52

Ich habe hinzugefügt uses-permission einschließlich WRITE_EXTERNAL_STORAGE, , READ_EXTERNAL_STORAGE zu AndroidManifest.xml.Android 6.0 öffnen fehlgeschlagen: EACCES (Berechtigung verweigert)

Als ich versuchte, meine Anwendung in Nexus5 (Android 6.0) laufen zu lassen, ist es, wie unten eine Ausnahme ausgelöst hat:

java.io.IOException: open failed: EACCES (Permission denied)

Und ich versuchte, ein weiteres Android-Handy (Android 5.1), war alles OK.Here des der 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; 
} 

Hat Android 6.0 Unterschiede bezüglich der Berechtigung?

+1

Ich denke, Sie sollten neue Berechtigungen Funktionen auf Android 6.0 hinzugefügt und ändern Sie Ihren Code entsprechend .. !! – AndiGeeky

+0

Ich habe die Seite [Manifest.permission] (http://developer.android.com/reference/android/Manifest.permission.html) gelesen, und nichts besonderes gefunden. – HelloSilence

+0

@ samuel40: Ich denke, du weißt nichts über neues Modell. Dies ist alt, also bitte überprüfen Sie dies -> http://android-developers.blogspot.in/2015/08/building-better-apps-with-runtime.html – AndiGeeky

Antwort

48

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

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

So haben Sie Runtime Permission zu überprüfen:

Was Runtime Berechtigungen sind?

Mit Android 6.0 Marshmallow hat Google ein neues Berechtigungsmodell eingeführt, mit dem Benutzer besser verstehen können, warum eine Anwendung bestimmte Berechtigungen anfordert. Anstatt dass der Benutzer während der Installation blind alle Berechtigungen akzeptiert, wird der Benutzer nun aufgefordert, Berechtigungen zu akzeptieren, wenn sie während der Anwendungsnutzung erforderlich werden.

Wann das neue Modell zu implementieren?

Es ist keine vollständige Unterstützung erforderlich, bis Sie die Version 23 in Ihrer Anwendung als Ziel verwenden. Wenn Sie die Version 22 oder eine niedrigere Version verwenden, fordert Ihre Anwendung bei der Installation alle Berechtigungen an, genau wie auf jedem Gerät, auf dem ein Betriebssystem unter Marshmallow ausgeführt wird.

Diese Informationen werden von hier genommen:

Bitte überprüfen Sie bei diesem Link implementieren:

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

+0

@ samuel40: Wenn dies für Sie funktioniert, bitte überprüfen Sie dies -> http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work – AndiGeeky

+0

Vielen Dank, Ich werde es überprüfen. – HelloSilence

+0

Ich verstehe, warum sie es getan haben, aber ... es ist ein bisschen ein Schmerz, wenn Sie über ein Dutzend Berechtigungen haben und müssen wo Sie jedes verwenden und diesen Code hinzufügen ... – Michael

47

In Android 6 (Eibisch), auch wenn der Benutzer alle Berechtigungen akzeptiert Bei der Installation können sie später entscheiden, einige dieser Berechtigungen von Ihnen zu entfernen.

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

Wie zu implementieren?(Best Practices)

  1. zuerst fest, ob das Gerät des Benutzers ein Eibisch Gerät ist oder nicht:

    private boolean shouldAskPermission(){ 
    
    return(Build.VERSION.SDK_INT>Build.VERSION_CODES.LOLLIPOP_MR1); 
    
    } 
    
  2. Wenn shouldAskPermission() Rückkehr true, bitten um die Erlaubnis, die Sie brauchen:

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

Die Methode requestPermissions(String[] permissions, int requestCode); ist eine öffentliche Methode, die in der Android-Aktivitätsklasse gefunden wird.

  1. Sie die Ergebnisse Ihrer Anfrage im Verfahren erhalten onRequestPermissionResult wie unten dargestellt:

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

, müssen Sie behandeln sie angemessen.

Empfohlene Berechtigungen Fluss:

enter image description here

Mehr Info:

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

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

Wenn Sie das neue Berechtigungsmodell (Laufzeitanforderung) nicht implementiert haben, kann die Aufhebung von Berechtigungen zu unerwünschten Benutzererfahrungen und in einigen Fällen zu Anwendungsabstürzen führen.

Die folgende Tabelle listet alle aktuellen gefährliche Berechtigungen und ihre jeweiligen Gruppen:

enter image description here

Wenn der Benutzer eine Berechtigung in einer Gruppe/Kategorie nimmt sie die gesamte Gruppe übernehmen!

Quelle:http://www.captechconsulting.com

Mit Dexter Library:

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

+1

Große Antwort, danke! Eine Sache: Die Dauerzeichenfolge sollte "android.permission.WRITE_EXTERNAL_STORAGE" anstelle von "android.permission.WRITE_EXTERNAL_STORAGE" (ohne Leerzeichen) sein. –

12

Sie können auch ActivityCompat.requestPermissions rückwärtskompatibel verwenden.

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

Von API-23 Sie die Berechtigung in Aktivität erklären müssen, auch wenn Sie bereits in Manifest erklärt hat.

// Storage Permissions variables 
private static final int REQUEST_EXTERNAL_STORAGE = 1; 
private static String[] PERMISSIONS_STORAGE = { 
     Manifest.permission.READ_EXTERNAL_STORAGE, 
     Manifest.permission.WRITE_EXTERNAL_STORAGE 
}; 

//persmission method. 
public static void verifyStoragePermissions(Activity activity) { 
    // Check if we have read or write permission 
    int writePermission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE); 
    int readPermission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.READ_EXTERNAL_STORAGE); 

    if (writePermission != PackageManager.PERMISSION_GRANTED || readPermission != PackageManager.PERMISSION_GRANTED) { 
     // We don't have permission so prompt the user 
     ActivityCompat.requestPermissions(
       activity, 
       PERMISSIONS_STORAGE, 
       REQUEST_EXTERNAL_STORAGE 
     ); 
    } 
} 

einfach verifyStoragePermissions(this); in onCreate verwenden nennen. Das sollte es hoffentlich tun.

+0

Ich habe diese Prüfung und die Berechtigungen wurden erteilt, aber ich bin nicht in der Lage zu File.createTempFile (Präfix, Sufix, Verzeichnis); –

2

Wenn Sie faul sind, degradieren nur targetSdkVersion bis 22 (vor Lutscher)

+0

Ja, das funktionierte für mich mit Android 6 oder höher. Atleast lokal kann mit Version 2 in Repo arbeiten Sie können immer noch drücken Version 23 – testsingh

2

Das ist für mich gearbeitet.

Gehen Sie zu Einstellungen -> Anwendungen -> YourApp -> Berechtigungen für Lagerung, Kontakten usw.

+0

hat nichts hilfreich gefunden –

-4

ich die gleichen Probleme erfüllt.

Vielleicht ist es durch Ihren Telefon Sicherheitsmechanismus verursacht. Sie können zu "Einstellungen" gehen, um Schreib-/Leseberechtigungen zu autorisieren.

-3

Für mich, mein Telefon als USB als MTP verbunden war das Problem, auch nachdem alles, was hier gesagt wird. Auf "Charging Only" umgeschaltet hat für mich funktioniert.

Verwandte Themen