如何向Android申请访问用户文件的权限
在现代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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。