3

Ich frage die Images Tabelle ab, um alle Bilder im Verzeichnis MediaStore.Images.Media.EXTERNAL_CONTENT_URI zu erhalten.Erhalte URI von ContentResolver.query()

Siehe die folgende Abfrage:

String[] what = new String[]{ MediaStore.Images.ImageColumns.DATE_TAKEN, 
      MediaStore.Images.ImageColumns._ID, 
      MediaStore.Images.ImageColumns.MIME_TYPE, 
      MediaStore.Images.ImageColumns.DATA }; 

String where = MediaStore.Images.Media.MIME_TYPE + "='image/jpeg'" + 
      " OR " + MediaStore.Images.Media.MIME_TYPE + "='image/png’"; 

Cursor cursor = getContext().getContentResolver() 
        .query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 
          what, 
          where, 
          null, 
          MediaStore.Images.ImageColumns.DATE_TAKEN + " DESC”); 

Nun würde Ich mag ein Uri haben, um jeweils das Ergebnis zeigt. Das ist, was ich jetzt tue:

int dataIndex = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA); 
String path = cursor.getString(dataIndex); 
final Uri uri = Uri.fromFile(new File(path)); 

Z. B., nehme ich den Weg von der DATA Spalte, eine Datei erstellen und Uri.fromFile verwenden. Ich habe zwei Fragen.

  1. Funktioniert das garantiert? Ist die obige Abfrage garantiert, dass Pfade in der Datenspalte zurückgegeben werden? Es funktioniert für alle Bilder in meinem Telefon: path ist immer ein Pfad, wie /storage/0/whatever.jpg, und uri.toString() ist das gleiche, aber mit dem Dateischema. Dennoch können Bilder sehr gut durch content: // uris definiert werden, aber ich sehe nicht, wie (und ob) diese in der Bildtabelle dargestellt werden.

  2. Wenn nicht, was sollte ich in der DATA Spalte erwarten, und wie man einen Uri davon erhält?

Antwort

6

Ist die Abfrage über garantierte Pfade in der Datenspalte zurück?

Es sollte etwas zurückgeben. Dieses "Etwas" ist möglicherweise nicht verwendbar. Beispielsweise befindet sich das Bild möglicherweise auf Wechselspeicher, und Sie können nicht direkt darauf zugreifen.

Wie bekomme ich einen Uri davon?

Sie nicht. Sie konstruieren einen Uri vom _ID:

Uri imageUri= 
    ContentUris 
    .withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 
     cursor.getInt(cursor.getColumnIndex(MediaStore.Images.ImageColumns._ID))); 
+0

Interessant, danke. Nur eine Sache über den "möglicherweise nicht verwendbaren Teil". Wie ich es verstehe, meinen Sie, dass ich auf diesen keine neue Datei (Pfad) aufrufen kann. Aber wenn ich einen Uri baue, wie du gesagt hast, werden sie durch ContentResolver.open() zugänglich sein? – natario

+0

Rewording, ist der Uri mit ContentUri s sicher (d. H. Funktioniert auch in Rand Fällen wie Bilder in Wechseldatenträger) oder sollte ich irgendwo einen Scheck hinzufügen? – natario

+0

@mvai: Solange Sie 'READ_EXTERNAL_STORAGE' haben, sollten Sie in Ordnung sein. Allerdings wird das Testen empfohlen. :-) Ich habe mehr mit Videos gearbeitet als mit Standbildern, und es scheint mir gut zu gehen. Das schlechteste Ergebnis ist genau das, was Sie mit dem 'File'-Ansatz haben: kein Zugriff. – CommonsWare