Android KitKat securityException beim Versuch, von MediaStore zu lesen

Java.lang.SecurityException: Permission Denial: Eröffnungsanbieter com.android.providers.media.MediaDocumentsProvider von ProcessRecord {430b1748 29271: com.xxx/u0a88} (pid = 29271, uid = 10088) benötigt android.permission.MANAGE_DOCUMENTS oder Android. Permission.MANAGE_DOCUMENTS

Ich habe die MANAGE_DOCUMENTS und READ_EXTERNAL_STORAGE hinzugefügt, aber ich READ_EXTERNAL_STORAGE immer noch diesen Fehler. Der beleidigende Code:

  • Button eines Fragments in ViewPager Trigger onClickListener auf falsche Referenz
  • LRUCache Eintrag neu anordnen bei der Verwendung get
  • Java.lang.RuntimeException: Methode nach Freigabe ()
  • Wie man Fehler im benutzerdefinierten AsyncTaskLoader behandelt?
  • Wie man das Video mit der Kamera-Vorschau auf TextureView aufnimmt
  • Android-Gerät adb immer unautorisiert auf Linux / Mac
  •   public static String getImagePath(HailoDriverApplication app, Uri uri) { Cursor cursor = null; if (uri == null) { return null; } try { cursor = app.getContentResolver().query(uri, new String[] { MediaStore.Images.Media.DATA }, null, null, null); int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); if (cursor.moveToFirst()) { return cursor.getString(column_index); } } finally { if (cursor != null) { cursor.close(); } } return null; } 

    Wie angeforderter Snippet von Manifest:

     <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="com.xxx" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="16" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_COURSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.READ_LOGS" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.MANAGE_DOCUMENTS" /> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" /> <uses-permission android:name="android.permission.UPDATE_DEVICE_STATS" tools:ignore="ProtectedPermissions" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <uses-permission android:name="android.intent.action.BATTERY_CHANGED" /> <uses-permission android:name="android.permission.INSTALL_PACKAGES" tools:ignore="ProtectedPermissions" /> <uses-permission android:name="android.permission.GET_ACCOUNTS" /> <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> 

  • Wie implementiere ich einen FileObserver von einem Android Service
  • Ist ArrayAdapter Thread sicher in Android? Wenn nicht, was kann ich tun, um es Thread sicher zu machen?
  • AlarmManager feuert Alarme in der Vergangenheit, unmittelbar bevor BroadcastReceiver es umplanen kann
  • Fehler in styles_base.xml Datei - Android App - Keine Ressource gefunden, die den Vornamen 'android: Widget.Material.ActionButton'
  • PDF-Bibliothek zum Rendern der PDF-Dateien in Android
  • Gradle kann keine Google Play-Abhängigkeit finden
  • 6 Solutions collect form web for “Android KitKat securityException beim Versuch, von MediaStore zu lesen”

    Hatte das gleiche Problem für die letzten paar Tage. Versuchte ein paar Lösungen, aber aus irgendeinem Grund bekam ich die Erlaubnis Verleugnung auf Uri Content Provider für einige Bilder, auch wenn ich die android.permission.MANAGE_DOCUMENTS Berechtigung zu meinem Manifest hinzugefügt hatte.

    Hier ist ein Workaround, vorerst:

     i = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(i, CHOOSE_IMAGE); 

    Dies führt dazu, dass die ältere Bildgalerie anstelle der neuen Kitkat-Dokumentenansicht geöffnet wird.

    Jetzt kannst du die Uri bekommen, indem du in deinem onActivityResult folgendes anrufst:

     Uri selectedImageURI = data.getData(); 

    Hoffe das hilft.

    In der Absicht, die verwendet wird, um den Benutzer aufzufordern, eine Datei hinzuzufügen, verwenden Sie Intent.ACTION_OPEN_DOCUMENT (auf KitKat API 19 oder höher) anstelle von Intent.ACTION_GET_CONTENT oder Intent.ACTION_PICK. Dann, wenn du das Uri verwenden möchtest, nimm die vorherigen persistenten Berechtigungen, die von Intent.ACTION_OPEN_DOCUMENT gesetzt wurden, wie im @ feri-Link beschrieben ( https://developer.android.com/guide/topics/providers/document-provider.html #permissions ):

     final int takeFlags = data.getFlags() & (Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); // Check for the freshest data. getContentResolver().takePersistableUriPermission(originalUri, takeFlags); 

    Sie können mehr über die Unterschiede zwischen Intent.ACTION_GET_CONTENT, Intent.ACTION_PICK und Intent.ACTION_OPEN_DOCUMENT hier lesen: http://developer.android.com/reference/android/content/Intent.html#ACTION_OPEN_DOCUMENT

    OK, ich habe eine Arbeitsprobe gefunden, die das Problem hinter sich lässt:

      intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); intent.addCategory(Intent.CATEGORY_OPENABLE); intent.setType("image/*"); startActivityForResult(intent, myClassConstant.SELECT_PICTURE); 

    Hier ist was ich gelernt habe … das ist eine Änderung in KitKat, und dieser Code funktioniert nur auf API 19 und höher. Es wird nicht für ältere Versionen funktionieren, also musst du auch Methoden für Pre-KitKat haben. Sobald Sie die Datei mit dem Category_Openable-Argument erhalten, können Sie in meinem Fall ein Bild verwenden, indem Sie es als URI referenzieren. In meinem Fall speichere ich den URIString (Dateipfad) und ich bin in der Lage zu tun, was ich will mit ihm nach dem Öffnen auftritt.

    Das Problem, das ich jetzt herausfinden möchte, ist, wie lange die Dateiberechtigungen bestehen bleiben. Es scheint, dass es seit gestern abgelaufen ist, da mein Code nach dem UriString sucht, dann versucht man die Datei zu öffnen. Wenn ich den obigen Code benutze, um das Bild auszuwählen, funktioniert es – es speichert den Namen und ich konnte das Programm beenden, geh zurück und es hat noch gearbeitet … aber mein erster Lauf des Programms an diesem Morgen (nach Ich berühre es nicht in 12+ Stunden), es hat so gehandelt wie es die Datei nicht finden konnte (und ich bin sicher, wenn ich durch den Debugger schaue, würde ich sehen, dass der unkritische Fehler wieder erscheint.

    Also jetzt die Frage ist: Wie bleiben wir die Berechtigungen, sobald ich weiß, was die Datei (Name) ist?

    Ich nehme an, dass die Uri Sie Referenzen ein Bild von einem Provider zeigen möchten, der das neue Storage Access Framework implementiert, das mit Android 4.4 KitKat eingeführt wurde. Dies kann sowohl Galerie als auch Google-Drive sein. Der einzige Weg, um auf diese Dokumente zuzugreifen, scheint die Systemdatei zu verwenden. Wenn der Benutzer Dateien zum Öffnen auswählt, gewährt das System der App die Berechtigung, die das Dialogfeld "Datei öffnen" gestartet hat. Die Berechtigungen sind gültig, solange das Gerät nicht neu gestartet wird. Andere Bilder können nicht zugegriffen werden und führen zur Sicherheitsausnahme.

    Wenn die Uri bestanden wird, dann müssen auch die Rechte, die für den Zugang zum Uri gewährt werden, bestehen bleiben. Weitere Details finden Sie hier: https://developer.android.com/guide/topics/providers/document-provider.html#permissions

    Die MANAGE_DOCUMENTS kann nur vom System gehalten werden:

    Die Berechtigung MANAGE_DOCUMENTS. Standardmäßig steht jedem Anbieter ein Anbieter zur Verfügung. Das Hinzufügen dieser Berechtigung beschränkt Ihren Provider auf das System. Diese Einschränkung ist wichtig für die Sicherheit.

    (Aus dem Storage Access Framework )

    Wenn Sie diese Berechtigung in Ihrem DocumentProvider , beschränken Sie den Zugriff auf Ihren Provider nur auf das System. Das bedeutet, dass nur der System UI picker auf Ihre Dateien zugreifen kann. Also, damit eine App eine Datei von deinem Provider ACTION_OPEN_DOCUMENT , muss sie eine Intent mit ACTION_OPEN_DOCUMENT , die in der Tat den System UI picker starten wird. Der Benutzer wählt eine Datei von dort aus und dann wird der URI zurückgegeben Sie.

    Die Lösung scheint mit http://developer.android.com/guide/topics/providers/document-provider.html#client zu verwenden, um auf Bilder aus der Galerie zuzugreifen

    Ich bin mir nicht sicher, warum der andere Ansatz nicht funktioniert. Aber es ist ein kurzfristiges Update für jetzt.

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.