diff --git a/.changes/android-external-files-fix.md b/.changes/android-external-files-fix.md new file mode 100644 index 000000000000..b6c2a1446a9d --- /dev/null +++ b/.changes/android-external-files-fix.md @@ -0,0 +1,5 @@ +--- +"tauri": patch:bug +--- + +Fixed 500 error when accessing local video files in Android external storage directory via `convertFileSrc`. Added better error handling and logging for Android external storage access to help diagnose permission and accessibility issues. \ No newline at end of file diff --git a/crates/tauri/src/protocol/asset.rs b/crates/tauri/src/protocol/asset.rs index a5007d294cb9..037dcd72eda0 100644 --- a/crates/tauri/src/protocol/asset.rs +++ b/crates/tauri/src/protocol/asset.rs @@ -48,8 +48,31 @@ fn get_response( return resp.status(403).body(Vec::new().into()).map_err(Into::into); } + // Check if the file exists before trying to open it + if !std::path::Path::new(&path).exists() { + log::error!("File does not exist at path: {}", path); + return resp.status(404).body(Vec::new().into()).map_err(Into::into); + } + + // Check if we have read permissions + if let Err(e) = std::fs::metadata(&path) { + log::error!("Failed to get metadata for {}: {}", path, e); + return resp.status(422).body(format!("Failed to access file metadata: {}", e).into_bytes().into()).map_err(Into::into); + } + let (mut file, len, mime_type, read_bytes) = crate::async_runtime::safe_block_on(async move { - let mut file = File::open(&path).await?; + let mut file = match File::open(&path).await { + Ok(file) => file, + Err(e) => { + #[cfg(target_os = "android")] + { + if path.starts_with("/storage/emulated/0/Android/data/") { + log::error!("Failed to open Android external storage file '{}': {}. This may be due to missing storage permissions or the file being inaccessible from the webview context.", path, e); + } + } + return Err(e.into()); + } + }; // get file length let len = {