2016-03-30 8 views
0

Ich erstelle derzeit meine eigene Galerie App. Ich verwende ein benutzerdefiniertes Objekt, das alle erforderlichen Informationen für eine Galerie enthält, einschließlich der URLs der Bilder aus der lokalen Android-Galerie.Wie kann ich Bilder aus der Galerie von URIs in der db ohne Erlaubnis verweigert laden

Ich speichere dieses Galerieobjekt in einer SQL lite db.

Ich habe eine Aktivität um diese Galerie Objekte zu sehen. In dieser Aktivität lade ich die Galerie, die ich anzeigen möchte - das funktioniert.

Aber wenn ich versuche, die Bilder zu laden:

GalleryDTO galleryDTO=vrGalleryApp.getGalleryService().loadGalleryById(displayedGalleryId); 

    if(galleryDTO.getPhotos()!=null&&!galleryDTO.getPhotos().isEmpty()){ 
     for(int i=0;i<galleryDTO.getPhotos().size();i++){ 
      Uri imageUrl = galleryDTO.getPhotos().get(i); 
      try { 
       Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), imageUrl); 

Dann wird die folgende Ausnahme ausgelöst:

java.lang.SecurityException: Permission Denial: opening provider com.google.android.apps.photos.contentprovider.MediaContentProvider from ProcessRecord{3585e48d 8727:at....vrgallery.vrgallery/u0a137} (pid=8727, uid=10137) that is not exported from uid 10071 

selbst erklärte ich die erforderlichen Rechte im Manifest:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

Diese Ausnahme tritt nicht für Galerien auf, die gerade vor dem Anzeigen gespeichert wurden. Aber wenn ich meine App schließe (z. B. mit dem Task-Manager) und sie wieder öffne, wird die Ausnahme auch für diese neuen Galerien ausgelöst.

Woran liege ich falsch?

Antwort

1

Ich speichere dieses Galerieobjekt in einer SQL lite db.

Das wird in vielen Fällen nicht funktionieren.

Denken Sie an eine Uri als einer Benutzer authentifizierten URL in einer Web-App ähnlich. Die URL kann nützlich sein jetzt, aber sobald die Sitzung des Benutzers abgelaufen ist, wird die URL nutzlos. Das gleiche gilt auch hier: Standardmäßig ist eine Uri möglicherweise nur nützlich, bis Ihr Prozess beendet wird.

Dann wird die folgende Ausnahme ausgelöst:

Das liegt daran, dass Ihre Rechte an diesem Uri abgelaufen ist, wahrscheinlich, weil Ihr Prozess beendet wurde.

auch zu beachten, dass die Uri aus anderen Gründen ungültig werden können, wie zum Beispiel:

  • Der Benutzer gelöscht den Inhalt

  • Der Benutzer den Inhalt bewegt und die Uri würde jetzt anders sein

  • Die App, die Ihnen die Uri gab, speichert nur einen lokalen Cache des Inhalts, und schließlich wird dieser Inhalt aus diesem Cache entfernt. Erfordern es heruntergeladen wieder

Was ich bin falsch zu sein?

Sie gehen davon aus, dass ein Uri für immer lebt.

Sie können try takePersistableUriPermission(). Dies erfordert eine minSdkVersion von 19 (Android 4.4 +), möglicherweise nicht auf viele Uri Werte (weil der Anbieter bietet keine persistenten Berechtigungen), und es wird nicht alle Probleme lösen (z. B. Benutzer löschte den Inhalt).

Oder Sie können Ihre eigene lokale Kopie des Inhalts erstellen, sobald Sie eine Uri erhalten, anstatt sich auf Uri Werte von anderen Anwendungen zu verlassen.

+0

Vielen Dank für Ihre Antwort, ich fürchtete, dass es so etwas ist – fsch

Verwandte Themen