2015-10-14 5 views
9

Ich verwende eine MediaScannerConnection, um die scanFile-Methode aufzurufen, um Bilder zur Gerätegalerie hinzuzufügen. Aber in Android 6 Ich erhalte diese Ausnahmen, wenn ich es ausführen:MediaScannerConnection schlägt auf Android 6 fehl, weil die Berechtigung verweigert wurde.

E/DatabaseUtils: java.lang.SecurityException: Permission Denial: Lesung com.android.providers.media.MediaProvider uri Inhalt: // Medien/extern/fs_id von pid = 22984, uid = 10078 erfordert android.permission.READ_EXTERNAL_STORAGE oder grantUriPermission()

und

E/iu.UploadsManager: java.lang.SecurityExceptio n: Permission Denial: Lese com.android.providers.media.MediaProvider uri Gehalt: // media/extern/fs_id von pid = 22984, uid = 10078 erfordert android.permission.READ_EXTERNAL_STORAGE oder grantUriPermission()

Irgendwelche Hilfe?

+0

ich das gleiche Problem konfrontiert bin. Ich versuche Videos auf Youtube hochzuladen, aber ich habe denselben Fehler erhalten. Hast du die Lösung gefunden? – TOP

+0

Nein. Ich habe festgestellt, dass bei einem Foto mit WhatsApp in einem Chat der gleiche Fehler in LogCat angezeigt wird. Also vielleicht ist dies ein Problem mit Android 6 wegen der neuen Laufzeitberechtigungen .... –

+0

Ich habe versucht, Flag Intent.FLAG_GRANT_READ_URI_PERMISSION hinzuzufügen, aber es scheint nicht zu funktionieren. – TOP

Antwort

0

Dies ist ein Ergebnis der neuen Möglichkeiten, mit Berechtigungen umzugehen. Ihre App muss jetzt nach einer Laufzeitberechtigung fragen und bereit sein, abgelehnt zu werden.

in Ihrem onCreate (oder wo auch immer) Sie überprüfen und möglicherweise um Erlaubnis fragen:

  if (ContextCompat.checkSelfPermission(this, 
      Manifest.permission.READ_EXTERNAL_STORAGE) 
      != PackageManager.PERMISSION_GRANTED) { 

     // Should we show an explanation? 
     if (ActivityCompat.shouldShowRequestPermissionRationale(this, 
       Manifest.permission.READ_EXTERNAL_STORAGE)) { 

      // Show an expanation to the user *asynchronously* -- don't block 
      // this thread waiting for the user's response! After the user 
      // sees the explanation, try again to request the permission. 

     } else { 

      // No explanation needed, we can request the permission. 

      ActivityCompat.requestPermissions(this, 
        new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 
        MY_PERMISSIONS_REQUEST_READ_MEDIA); 

      // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an 
      // app-defined int constant. The callback method gets the 
      // result of the request. 
     } 
    } 

Dann bereit sein, die Berechtigungen so zu akzeptieren:

@Override 
public void onRequestPermissionsResult(int requestCode, 
             String permissions[], int[] grantResults) { 
    switch (requestCode) { 
     case MY_PERMISSIONS_REQUEST_READ_MEDIA: { 
      // If request is cancelled, the result arrays are empty. 
      if (grantResults.length > 0 
        && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
      } else { 
       // permission denied, boo! Disable the 
       // functionality that depends on this permission. 
      } 
      return; 
     } 
    } 
} 
+0

Nop. Wie Sie sehen, wird die Ausnahme nicht von meiner App ausgelöst, sondern von DatabaseUtils und UploadsManager. Und die Laufzeitberechtigungen haben (noch) keinen Einfluss auf meine App, weil ich nicht auf API 23 abziele. –

+0

Die Antwort ist immer noch relevant für die aufgelisteten Probleme und ist für andere nützlich, die auf ein ähnliches Problem stoßen. Ich habe Upvoted, um den Downvote zu entfernen. Gibt es eine Möglichkeit, die Berechtigungen einmal für alle Ereignisse in einer App festzulegen? anstatt herausfinden zu müssen, wo die App nach Vorbestellungen fragen muss? – Theo