在 Android 應用中透過 ACTION_PICK 或 ACTION_GET_CONTENT 選取圖片時,回傳的 Uri 通常為 content:// 結構,無法直接作為檔案路徑使用。若需將圖片載入 Bitmap 或進行檔案操作,必須透過 ContentResolver 查詢 MediaStore 取得實際路徑(_data 欄位)。
public String getRealPathFromURI(Context context, Uri contentUri) {
String[] projection = { MediaStore.Images.Media.DATA };
Cursor cursor = null;
try {
cursor = context.getContentResolver().query(contentUri, projection, null, null, null);
if (cursor != null && cursor.moveToFirst()) {
int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
return cursor.getString(columnIndex);
}
} finally {
if (cursor != null) cursor.close();
}
return null;
}
MediaStore 直接開啟 InputStream,避免依賴檔案路徑。API 29+ 可直接使用 ContentResolver.openInputStream(uri) 讀取位圖,無需解析路徑:
InputStream is = context.getContentResolver().openInputStream(uri);
Bitmap bitmap = BitmapFactory.decodeStream(is);
is.close();
掌握 URI 轉路徑技巧,能讓圖片選取與載入流程更穩健,適應各 Android 版本與儲存架構變化。