`Intent(MediaStore.Audio.Media.RECORD_SOUND_ACTION)` 返回 `data.getData()` 為 `file:///storage/emulated/0/Recording.mp3`,而非 `content://` Uri,導致 `ContentResolver.query()` 無結果。
Uri uri = data.getData();
String path;
if ("file".equals(uri.getScheme())) {
path = uri.getPath(); // 直接獲取絕對路徑
} else if ("content".equals(uri.getScheme())) {
// 通過 ContentResolver 查詢 _DATA 列 (已棄用但仍可用) 或 openInputStream 讀取
try (Cursor cursor = getContentResolver().query(uri, new String[]{MediaStore.MediaColumns.DATA}, null, null, null)) {
if (cursor != null && cursor.moveToFirst()) {
path = cursor.getString(0);
}
}
}
// 統一使用 path 或 uri 進行後續操作
自行啟動錄音 Intent 時指定輸出 Uri:
File audioFile = new File(getExternalFilesDir(Environment.DIRECTORY_MUSIC), "recording_" + System.currentTimeMillis() + ".mp3");
Uri outputUri = FileProvider.getUriForFile(this, "com.example.fileprovider", audioFile);
Intent intent = new Intent(MediaStore.Audio.Media.RECORD_SOUND_ACTION);
intent.putExtra(MediaStore.EXTRA_OUTPUT, outputUri);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
startActivityForResult(intent, REQUEST_RECORD);
需在 `AndroidManifest.xml` 配置 `
`Intent(MediaStore.ACTION_IMAGE_CAPTURE)` **未指定 `EXTRA_OUTPUT`** 時,系統相機返回縮略圖 Bitmap 放在 `data.getExtras().get("data")`。此鍵名 `"data"` 定義於 `MediaStore.EXTRA_OUTPUT` 文檔及 AOSP 源碼 `Camera.java`,非公開 API 但行為穩定。生產環境必須指定 `EXTRA_OUTPUT` 獲取全尺寸圖片,依賴 `data` 會得到低質量縮略圖且部分相機不返回。