Overview
The Android file system is strict and complex because its behavior and the available APIs vary depending on the version.
This plugin was created to provide explicit and consistent file operations.
No special permission or configuration is required.
Setup
Register this plugin with your Tauri project:
src-tauri/src/lib.rs
#[cfg_attr(mobile, tauri::mobile_entry_point)]
pub fn run() {
tauri::Builder::default()
.plugin(tauri_plugin_android_fs::init()) .run(tauri::generate_context!())
.expect("error while running tauri application");
}
The current dialog in this plugin has an issue. To avoid this, please follow these two steps:
src-tauri/Cargo.toml
[dependencies]
tauri-plugin-android-fs = { features = ["avoid-issue1"], .. }
src-tauri/capabilities/default.json
{
..
"permissions": [
"android-fs:default",
..
]
}
Usage
This plugin can use only from rust side.
Then, there are three main ways to manipulate files:
1. Dialog
Opens the file/folder picker to read and write user-selected entries.
use tauri_plugin_android_fs::{AndroidFs, AndroidFsExt, FileAccessMode};
fn example(app: tauri::AppHandle) -> tauri_plugin_android_fs::Result<()> {
let api = app.android_fs();
let selected_files = api.show_open_file_dialog(
&["*/*"], true )?;
if selected_files.is_empty() {
}
else {
for uri in selected_files {
let file_type = api.get_mime_type(&uri)?.unwrap(); let file_name = api.get_name(&uri)?;
let file: std::fs::File = api.open_file(&uri, FileAccessMode::Read)?;
let file_path: tauri_plugin_fs::FilePath = uri.into();
}
}
Ok(())
}
use tauri_plugin_android_fs::{AndroidFs, AndroidFsExt, Entry, FileAccessMode};
fn example(app: tauri::AppHandle) -> tauri_plugin_android_fs::Result<()> {
let api = app.android_fs();
let selected_folder = api.show_open_dir_dialog()?;
if let Some(dir_uri) = selected_folder {
let new_file_uri = api.create_file(
&dir_uri, "MyFolder/file.txt", Some("text/plain") )?;
if let Err(e) = api.write(&new_file_uri, "contents") {
let _ = api.remove_file(&new_file_uri);
return Err(e)
}
for entry in api.read_dir(&dir_uri)? {
match entry {
Entry::File { name, uri, last_modified, byte_size, mime_type, .. } => {
let file: std::fs::File = api.open_file(&uri, FileAccessMode::ReadWrite)?;
},
Entry::Dir { name, uri, last_modified, .. } => {
},
}
}
}
else {
}
Ok(())
}
use tauri_plugin_android_fs::{AndroidFs, AndroidFsExt, FileAccessMode};
fn example(app: tauri::AppHandle) -> tauri_plugin_android_fs::Result<()> {
let api = app.android_fs();
let selected_file = api.show_save_file_dialog(
"", Some("image/png") )?;
if let Some(uri) = selected_file {
let mut file: std::fs::File = api.open_file(&uri, FileAccessMode::WriteTruncate)?;
let file_path: tauri_plugin_fs::FilePath = uri.into();
}
else {
}
Ok(())
}
2. Public Storage
File storage that is available to other applications and users.
Currently, this is for Android 10 (API level 29) or higher.
use tauri_plugin_android_fs::{AndroidFs, AndroidFsExt, PublicGeneralPurposeDir, PublicImageDir, PublicStorage};
fn example(app: tauri::AppHandle) -> tauri_plugin_android_fs::Result<()> {
let api = app.android_fs();
let storage = api.public_storage();
let contents: Vec<u8> = vec![];
let uri = storage.create_file_in_public_app_dir(
PublicImageDir::Pictures, "my-image.png", Some("image/png") )?;
if let Err(e) = api.write(&uri, &contents) {
let _ = api.remove_file(&uri);
return Err(e)
}
let uri = storage.create_file_in_public_app_dir(
PublicGeneralPurposeDir::Documents, "2025-3-2/data.txt", Some("text/plain") )?;
if let Err(e) = api.write(&uri, &contents) {
let _ = api.remove_file(&uri);
return Err(e)
}
Ok(())
}
3. Private Storage
File storage intended for the app’s use only.
use tauri_plugin_android_fs::{AndroidFs, AndroidFsExt, PrivateDir, PrivateStorage};
fn example(app: tauri::AppHandle) -> tauri_plugin_android_fs::Result<()> {
let storage = app.android_fs().private_storage();
let contents: Vec<u8> = todo!();
let path: std::path::PathBuf = storage.resolve_path(PrivateDir::Cache)?;
storage.write(
PrivateDir::Data, "config/data1", &contents
)?;
let contents = storage.read(
PrivateDir::Data, "config/data1" )?;
Ok(())
}
Link
License
MIT OR Apache-2.0