All tests run on an 8-year-old MacBook Air.
When I was building HiyokoMTP, I hit a limitation that seems obvious in hindsight: you can't use a native macOS folder picker to browse an Android device over MTP.
NSOpenPanel — the standard macOS file dialog — has no idea your Android device exists. It only sees what Finder mounts, and Finder doesn't mount MTP devices as a proper volume. So the entire native folder selection API is useless for this use case.
Why the Native Dialog Can't See Your Android Device
macOS exposes the file system to apps through a set of APIs that assume storage is mounted as a volume. MTP doesn't work that way. It's a stateful protocol layered over USB — not a file system mount.
Android File Transfer used to create a virtual mount, but that approach had reliability issues and kernel extension dependencies, and is largely abandoned. Modern MTP implementations talk to the device directly over USB and manage the object tree themselves. The OS never sees it as a folder.
The result: NSOpenPanel, NSSavePanel, Finder integration — none of it works for MTP paths. You're on your own.
How to Build One Anyway
If you need folder selection over MTP, you have to build your own picker from scratch. Here's the approach:
Rust side — expose a list_mtp_dir(path) command via Tauri IPC. This queries the MTP device for the contents of a given directory and returns the object list.
#[tauri::command]
fn list_mtp_dir(path: String) -> Result<Vec<MtpObject>, String> {
// query MTP device and return object list
}
React side — build a modal UI that behaves like a minimal Finder:
// On open
const root = await invoke("list_mtp_dir", { path: "/" });
// On folder selection
const contents = await invoke("list_mtp_dir", { path: selectedPath });
// Maintain a navigation stack to support back navigation
const [navStack, setNavStack] = useState<string[]>(["/"]);
It's straightforward in principle — it's just more work than you'd expect, because the OS would normally handle all of this for you.
Current State in HiyokoMTP
Worth noting upfront: this isn't implemented yet in the current version. For now, folder paths are entered manually or via preset. A proper MTP folder picker is planned for v2.
If you're building your own MTP client and need this, the architecture above is the approach to take — there's no shortcut through native APIs.
One-time purchase, no subscription.
→ https://hiyokomtp.lemonsqueezy.com/checkout/buy/2e966b64-554e-42a0-b865-4240281978a1
Have you run into other macOS APIs that silently break over MTP?
Top comments (0)