如何向Android申请访问用户文件的权限

移动开发 2026-07-09

在现代Android上,使用Tauri(一个Rust后端和一个JavaScript前端),如何让用户授权访问 'home' 目录 (/storage/emulated/0) 下的所有文件,以便同时访问文档、下载、图片、视频等,以及外部存储设备中的内容?

我尝试了下面的代码,能够在所有平台上成功编译,没有错误或警告,应用在Android上也能正常运行,没有错误或崩溃,但从未请求过用户权限。因此它无法读取甚至无法列出许多基本文件。有没有人知道这是哪里出了问题?

// rust side
...
#[cfg(target_os = "android")]
use tauri_plugin_android_fs::{AndroidFsExt};
...
tauri::Builder::default()
        .plugin(tauri_plugin_android_fs::init())
...
// this is the func to let the app ask the user for minimal storage access
#[tauri::command]
async fn request_directory_access(app: tauri::AppHandle) {
    #[cfg(target_os = "android")]
    {
        let fs = app.android_fs_async();
        let file_picker = fs.file_picker();
        let _ = file_picker
            .pick_dir(
                None,  // no initial location hint
                true,  // local only (no cloud storage)
            )
            .await
            .map_err(|e| e.to_string());
    }
}
// javascript side
...
// request file access permission if android
window.addEventListener("DOMContentLoaded", async () => {
    try {
        await invoke("request_directory_access");
    } catch (err) {
        console.error(err);
    }
});
...

解决方案

pick_dir() 不是权限请求。它会打开Android的 SAF文件夹选择器。

你的代码之所以看起来没有任何显示,可能是因为你在 DOMContentLoaded 时调用了它。在Android上,这些对话框通常需要通过直接的用户操作来触发(按钮点击、菜单点击等)。

此外,现代Android不再允许普通应用对 /storage/emulated/0 获得无限制访问。使用SAF时,用户只授权对他们选择的文件夹的访问权限,而不是对整个存储的访问。

因此你的Rust代码基本上没问题。尝试在按钮点击时调用它,而不是在启动时自动调用。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章