2016-04-07 4 views
0

Ich habe die Codes funktionieren für das Laden von Bildern aus der Galerie, aber ich verstehe wirklich nicht, wie es funktioniert. Hier sind die Codes.Wie funktionieren die Codes zum Laden von Bildern aus der Galerie Android

@Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null != data) { //Browse Gallery is requested 

     Uri selectedImage = data.getData(); 
     String[] filePathColumn = { MediaStore.Images.Media.DATA }; 

     Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null); 
     cursor.moveToFirst(); 

     int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
     String picturePath = cursor.getString(columnIndex); 
     cursor.close(); 

     loadImage(picturePath);   //load picture according the path 
     image_View.setImageBitmap(pic); //Show the selected picture 
    } 
} 

Uri SelectedImage = data.getData();

Holen Sie sich die uri von ausgewählten Bild von Vorsatz

String [] filePathColumn = {MediaStore.Images.Media.DATA};

MediaStore.Images.Media.DATA ist konstant. Ich verstehe nicht, warum nicht String anstelle von String []

Cursor Cursor = getContentResolver() Abfrage (SelectedImage, filePathColumn, null, null, null).

Ich verstehe diese Zeile nicht.

cursor.moveToFirst();

Wechseln Sie zum ersten Bild in der Galerie.

int spalteIndex = cursor.getColumnIndex (filePathColumn [0]);

Dafür bekomme ich immer 0 egal welches Bild ich wähle.

Zeichenfolge picturePath = cursor.getString (columnIndex);

Da columnIndex immer 0 ist, wie kann es dann verschiedene Pfade für verschiedene Bilder bekommen?

Kann mir jemand helfen zu überprüfen, ob meine Erklärung korrekt ist und die Zeile erklären, die ich nicht verstehe? Vielen Dank.

Antwort

2

1-

Uri selectedImage = data.getData(); 

Dies ist die Aussage, wo Sie die Daten über eine andere Absicht bestanden lesen müssen, die Sie zuvor über startActivityForResult Methode aufgerufen. In diesem Fall öffnen Sie wahrscheinlich eine Absicht und lassen den Benutzer ein Bild auswählen, dann wird Ihnen die URI des Bildes zurückgegeben und Sie verwenden getData, um das zu lesen.

2-

String[] filePathColumn = { MediaStore.Images.Media.DATA }; 

Wenn Sie Cursor etwas ein Content Provider (über ContentResolver) müssen Sie angeben, welche Spalten Sie müssen lesen aus der Datenbank zu lesen, und das Argument müssen Sie sollten passieren sein ein Array von String (ob es eine oder mehrere Spalten hat, die Sie noch ein Array übergeben müssen). MediaStore.Images.Media ist ein Datenbank-Vertrag, die Konstanten enthält, die Sie verwenden müssen, um Content-Provider zu sprechen

3-

Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null); 

Cursors verwendet werden, um Daten von Content Provider zu lesen. Wenn Sie mit anderen Programmiersprachen vertraut sind, ist es wie das Lesen von Zeilen aus der Datenbank und Ihre Ergebnisse werden in Cursors gespeichert. Wenn Sie URI übergeben, müssen Sie lesen nicht angeben, welche Datenbank wird ContentResolver, dass für Sie herausfinden, (dies ist ein Vorteil der Content-Anbieter verwenden)

4-

cursor.moveToFirst(); 

Wenn Sie gelesen die gewünschten Zeilen aus der Datenbank (in diesem Fall wahrscheinlich nur Sie ein Bild ausgewählt), müssen Sie den Cursor bewegen, um den ersten Eintrag (Zeile) der zurückgegebenen Ergebnisse

5-

int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
hinweisen,

Sie müssen wissen, auf welche Spalte Sie zugreifen müssen, um Ihre gewünschten Daten zu lesen (in diesem Fall Dateipfadname). so fragen Sie den Cursor, was ist der Spaltenindex der file pathname und es gibt Ihnen den Spaltenindex zurück. und natürlich in diesem Fall wird es immer 0, da Sie nur die Content-Provider aufgefordert, eine Spalte zurückzukehren (file pathname), so gäbe es keine Daten mehr sein, andere zu zeigen, als dass

6-

String picturePath = cursor.getString(columnIndex); 

und schließlich fragt diese Anweisung den Cursor, um die file pathname am Index (in diesem Fall Index 0) so am Ende haben Sie Ihren Pfad zur Datei. Beachten Sie, dass Sie mit dieser Methode immer nur ein Bild auf einmal lesen können

0

Cursor speichern Abfrageergebnisdatensätze in Zeilen und gewähren viele Methoden für den Zugriff und die Iteration der Datensätze. Auch ist int columnIndex = cursor.getColumnIndex(filePathColumn[0]); der Grund, warum Sie immer 0 für Ihren Index erhalten