Zaktualizowana odpowiedź, prawie 5 lat później:
Kod w oryginalnej odpowiedzi nie działa niezawodnie, jak obrazy z różnych źródeł, czasami powrócić z różną zawartością URI, czyli content://
zamiast file://
. Lepszym rozwiązaniem jest po prostu użycie context.getContentResolver().openInputStream(intent.getData())
, ponieważ zwróci InputStream, który możesz obsłużyć według własnego wyboru.
Na przykład BitmapFactory.decodeStream()
działa idealnie w tej sytuacji, ponieważ można również użyć pola Opcje i inSampleSize, aby zmniejszyć próbkę dużych obrazów i uniknąć problemów z pamięcią.
Jednak rzeczy takie jak Dysk Google zwracają identyfikatory URI do obrazów, które nie zostały jeszcze pobrane. Dlatego musisz wykonać kod getContentResolver () w wątku w tle.
Oryginalna odpowiedź:
Pozostałe odpowiedzi wyjaśniły, jak wysłać zamiar, ale nie wyjaśniły dobrze, jak sobie z tym poradzić. Oto przykładowy kod, jak to zrobić:
protected void onActivityResult(int requestCode, int resultCode,
Intent imageReturnedIntent) {
super.onActivityResult(requestCode, resultCode, imageReturnedIntent);
switch(requestCode) {
case REQ_CODE_PICK_IMAGE:
if(resultCode == RESULT_OK){
Uri selectedImage = imageReturnedIntent.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 filePath = cursor.getString(columnIndex);
cursor.close();
Bitmap yourSelectedImage = BitmapFactory.decodeFile(filePath);
}
}
}
Następnie masz wybrany obraz zapisany w „yourSelectedImage”, aby robić, co chcesz. Ten kod działa, pobierając lokalizację obrazu w bazie danych ContentResolver, ale sam w sobie nie wystarczy. Każde zdjęcie zawiera około 18 kolumn informacji, od ścieżki pliku do „ostatniej modyfikacji daty” do współrzędnych GPS miejsca, w którym zdjęcie zostało zrobione, chociaż wiele pól nie jest faktycznie używanych.
Aby zaoszczędzić czas, ponieważ tak naprawdę nie potrzebujesz innych pól, wyszukiwanie kursorem odbywa się za pomocą filtra. Filtr działa poprzez określenie nazwy żądanej kolumny, MediaStore.Images.Media.DATA, która jest ścieżką, a następnie podanie tego ciągu [] do zapytania kursora. Zapytanie kursora powraca ze ścieżką, ale nie wiesz, w której kolumnie się znajduje, dopóki nie użyjesz columnIndex
kodu. To po prostu pobiera numer kolumny na podstawie jej nazwy, tej samej, której użyto w procesie filtrowania. Gdy to osiągniesz, w końcu możesz dekodować obraz do bitmapy za pomocą ostatniego wiersza kodu, który podałem.