Cập nhật câu trả lời, gần 5 năm sau:
Mã trong câu trả lời ban đầu không còn hoạt động đáng tin cậy nữa, vì hình ảnh từ nhiều nguồn khác nhau đôi khi trả về với một URI nội dung khác, tức là content://
thay vì file://
. Một giải pháp tốt hơn là chỉ cần sử dụngcontext.getContentResolver().openInputStream(intent.getData())
, vì điều đó sẽ trả về InputStream mà bạn có thể xử lý khi bạn chọn.
Ví dụ, BitmapFactory.decodeStream()
hoạt động hoàn hảo trong tình huống này, vì sau đó bạn cũng có thể sử dụng trường Tùy chọn và inSampleSize để giảm mẫu hình ảnh lớn và tránh các vấn đề về bộ nhớ.
Tuy nhiên, những thứ như Google Drive trả lại URI cho hình ảnh chưa thực sự được tải xuống. Do đó, bạn cần thực hiện mã getContentResolver () trên một luồng nền.
Câu trả lời gốc:
Các câu trả lời khác giải thích cách gửi ý định, nhưng họ không giải thích tốt cách xử lý phản hồi. Đây là một số mã mẫu về cách làm điều đó:
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);
}
}
}
Sau này, bạn đã có hình ảnh đã chọn được lưu trữ trong "yourSelectedImage" để làm bất cứ điều gì bạn muốn. Mã này hoạt động bằng cách lấy vị trí của hình ảnh trong cơ sở dữ liệu ContentResolver, nhưng bản thân nó không đủ. Mỗi hình ảnh có khoảng 18 cột thông tin, từ filepath đến 'ngày sửa đổi lần cuối' đến tọa độ GPS của nơi bức ảnh được chụp, mặc dù nhiều trường không thực sự được sử dụng.
Để tiết kiệm thời gian vì bạn không thực sự cần các trường khác, tìm kiếm con trỏ được thực hiện bằng bộ lọc. Bộ lọc hoạt động bằng cách chỉ định tên của cột bạn muốn, MediaStore.Images.Media.DATA, là đường dẫn, sau đó đưa chuỗi đó [] cho truy vấn con trỏ. Truy vấn con trỏ trả về với đường dẫn, nhưng bạn không biết nó nằm trong cột nào cho đến khi bạn sử dụng columnIndex
mã. Điều đó chỉ đơn giản là lấy số cột dựa trên tên của nó, cùng một cột được sử dụng trong quá trình lọc. Khi bạn đã có được điều đó, cuối cùng bạn cũng có thể giải mã hình ảnh thành một bitmap với dòng mã cuối cùng tôi đưa ra.