2016-08-16 7 views
0

Meine Anwendung verfügt über eine Einfügeaktivität, die eine Bildauswahl verfügt, und die Uri von diesem wird als eine Zeichenfolge gespeichert in einer Datenbank gespeichert werden.Android: setImageUri fehlgeschlagen

imageUri ist die Zeichenfolge, die später bei einem Tastendruck in eine Datenbank eingefügt wird.

Sobald alles in die Datenbank eingefügt ist, wird die Aktivität beendet, die in der onResume Methode alle Daten aus der Datenbank/Tabelle in einer Liste von Objekten abgerufen wird, die dann in einen benutzerdefinierten Array-Adapter zur Form gebracht werden Meine Listenansicht.

if(!uriString.equals("")) { 
    image.setImageURI(Uri.parse(uriString)); 
} 

So wird das Bild innerhalb des Array-Adapters festgelegt. Das Seltsame ist, dass das Bild direkt nach dem Einfügen sichtbar ist, aber sobald ich eine andere Aktivität öffne und das Bild leer ist. Ich erhalte die Fehler

resolveUri failed on bad bitmap uri: content://com.android.providers.media.documents/document/image%3A29938 

Ich weiß nicht, warum es nicht behoben werden kann, weil es gut ist, mit zu beginnen, aber dann funktioniert es nicht.

Antwort

0

Content-URIs müssen ordnungsgemäß analysiert werden, da sie nicht wie normale Dateipfade sind. Daher benötigen wir einen Resolver. Hier ist ein Beispiel wie man diesen Ansatz:

Änderungen an Ihrem Code

if(!uriString.equals("")) { 
    image.setImageURI(Uri.parse(getPathFromURI(<your app context>, Uri.parse("content://blah/blah/blah")))); 
} 

Methode Definition für den URI-Parser.

public String getPathFromURI(Context context, Uri contentUri) { 
    Cursor mediaCursor = null; 
    try { 
      String[] dataPath = { MediaStore.Images.Media.DATA }; 
      mediaCursor = context.getContentResolver().query(contentUri, dataPath, null, null, null); 
      int column_index = mediaCursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
      mediaCursor.moveToFirst(); 
      return mediaCursor.getString(column_index); 
    } finally { 
     if (mediaCursor != null) { 
      mediaCursor.close(); 
     } 
    } 
} 
public String getPathFromURI(Context context, Uri contentUri) { 
    Cursor mediaCursor = null; 
    try { 
      String[] dataPath = { MediaStore.Images.Media.DATA }; 
      mediaCursor = context.getContentResolver().query(contentUri, dataPath, null, null, null); 
      int column_index = mediaCursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
      mediaCursor.moveToFirst(); 
      return mediaCursor.getString(column_index); 
    } finally { 
     if (mediaCursor != null) { 
      mediaCursor.close(); 
     } 
    } 
} 
+0

Sorry ich verstehe nicht, wie ich das zweite Argument bereitstellen kann, ich habe nur den Wert der URI.toString(). Ich habe versucht, es zurück zu einem URI mit Uri.parse zu konvertieren, aber das ergibt einen Absturz –

+0

Aktualisiert den Abschnitt, Idee ist, übergeben Sie die Inhaltszeichenfolge im Uri-Format an die Methode. Ihr Problem hängt damit zusammen, dass der Uri vom Pfad "content: //" in die Bildansicht gelangt, die gelöst werden kann, nachdem ein echter Pfad vom Pfad "content: //" abgerufen wurde. – sumandas

Verwandte Themen