Güncel cevap, yaklaşık 5 yıl sonra:
Çeşitli kaynaklardan görüntüleri bazen yani farklı bir içerikle URI ile dönmek gibi orijinal yanıtında kod artık, güvenilir bir şekilde çalışır content://
ziyade file://
. Daha iyi bir çözüm basitçe kullanmaktır context.getContentResolver().openInputStream(intent.getData())
, çünkü seçtiğiniz gibi işleyebileceğiniz bir InputStream döndürür.
Örneğin, BitmapFactory.decodeStream()
bu durumda mükemmel çalışır, çünkü büyük resimleri küçültmek ve bellek sorunlarından kaçınmak için Seçenekler ve inSampleSize alanını da kullanabilirsiniz.
Ancak, Google Drive gibi şeyler URI'leri henüz indirilmemiş görüntülere döndürür. Bu nedenle, arka plan iş parçacığında getContentResolver () kodunu gerçekleştirmeniz gerekir.
Orijinal cevap:
Diğer cevaplar, niyetin nasıl gönderileceğini açıkladı, ancak yanıtı nasıl ele alacağını iyi açıklamadılar. Bunu nasıl yapacağınıza dair bazı örnek kodlar:
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);
}
}
}
Bundan sonra, seçilen görüntüyü istediğiniz gibi yapmak için "yourSelectedImage" da depolanır. Bu kod, görüntünün ContentResolver veritabanındaki konumunu alarak çalışır, ancak bu tek başına yeterli değildir. Her görüntünün dosya yolundan 'son değiştirilme tarihi'ne, fotoğrafın çekildiği yerdeki GPS koordinatlarına kadar 18 sütunluk bilgi vardır, ancak alanların çoğu gerçekte kullanılmaz.
Diğer alanlara gerçekten ihtiyacınız olmadığından zaman kazanmak için imleç araması bir filtreyle yapılır. Filtre, istediğiniz sütunun adını (yol olan MediaStore.Images.Media.DATA) belirterek ve ardından o dizeyi [] imleç sorgusuna vererek çalışır. İmleç sorgusu yolla döner, ancak columnIndex
kodu kullanana kadar hangi sütunda olduğunu bilmezsiniz . Bu, filtreleme işleminde kullanılanın adıyla sütun sayısını alır. Bunu elde ettikten sonra, görüntüyü son verdiğim kod satırı ile bir bitmap'e deşifre edebilirsiniz.