FileExplorerActivity
FileExplorerActivity is a reusable file browser built into MicroPythonOS. It can browse the local filesystem or let the user pick one or more files, and it integrates with the view action to open files in the appropriate app.
Overview
The activity is registered for the pick_file action, so any app can ask the user to choose files without implementing its own file picker. It is also used directly as the built-in File Manager app.
Two modes are supported:
browse(default): navigate directories, open files, rename or delete them.pick: select one or more files and return them to the caller. Thepick_fileaction automatically uses pick mode, so callers do not need to set the"mode"extra.
Launching
Pick files with startActivityForResult
Using the pick_file action automatically opens FileExplorerActivity in pick mode, so you do not need to set the "mode" extra.
from mpos import Intent, Activity
class MyActivity(Activity):
def _open_file_clicked(self, event):
intent = Intent(action="pick_file")
intent.putExtra("start_dir", "/data/audio")
intent.putExtra("path_pattern", [".wav"])
self.startActivityForResult(intent, self._on_file_picked)
def _on_file_picked(self, result):
if result and result.get("result_code"):
paths = result.get("data", {}).get("paths", [])
for path in paths:
print("Selected:", path)
Browse the filesystem
from mpos import Intent, FileExplorerActivity
class MyActivity(Activity):
def _browse_files(self):
intent = Intent(activity_class=FileExplorerActivity)
intent.putExtra("start_dir", "/sdcard")
self.startActivity(intent)
Intent extras
| Extra | Type | Default | Description |
|---|---|---|---|
mode |
str |
"browse" (or "pick" when action is "pick_file") |
"browse" or "pick". Only needed when launching FileExplorerActivity directly; the "pick_file" action implies picker mode automatically. |
start_dir |
str |
"." |
Directory to open. Non-existent paths are walked up to the first existing parent, falling back to "/". |
path_pattern |
str or list |
[] |
File extensions to accept in pick mode, e.g. [".png", ".jpg"]. Strings may include a leading * ("*.wav"). An empty list accepts all files. |
Pick mode result
When the user confirms the selection, the result callback receives:
{
"result_code": True,
"data": {
"paths": ["/path/to/file1.wav", "/path/to/file2.wav"]
}
}
If no file is selected, the current directory path is returned instead:
{
"result_code": True,
"data": {
"paths": ["/data/audio/"]
}
}
When the user cancels, the result is:
{
"result_code": False,
"data": {}
}
Browse mode behavior
In browse mode, tapping a directory navigates into it. Tapping a file sends a view intent:
self.startActivity(Intent(action="view", data=path))
The system then resolves the file to the appropriate viewer using the manifest-declared pathPattern of installed apps, or falls back to the framework's generic ViewActivity.
Long-pressing a file or folder opens an action bar with Delete, Rename, and Cancel options. Delete shows a confirmation dialog; Rename launches RenameActivity.
Deleting directories
Deleting a folder removes it recursively, including all files and subdirectories inside it. A confirmation dialog is shown before any deletion begins.
!!! warning
Directory deletion cannot be undone. Use the confirmation dialog carefully, especially when deleting paths under /data/ or /apps/.
Example: image picker
import lvgl as lv
from mpos import Activity, Intent
class GalleryLauncher(Activity):
def onCreate(self):
screen = lv.obj()
btn = lv.button(screen)
lv.label(btn).set_text("Choose image")
btn.add_event_cb(self._choose_image, lv.EVENT.CLICKED, None)
self.setContentView(screen)
def _choose_image(self, event):
intent = Intent(action="pick_file")
intent.putExtra("start_dir", "/data/images")
intent.putExtra("path_pattern", [".png", ".jpg", ".jpeg", ".raw"])
self.startActivityForResult(intent, self._on_image_picked)
def _on_image_picked(self, result):
if result and result.get("result_code"):
paths = result.get("data", {}).get("paths", [])
if paths and not paths[0].endswith("/"):
print("Opening image:", paths[0])
See Also
- Intents - How implicit intents and the
viewaction work - AppManager - How file-type handlers are resolved
- Creating Apps - Declaring
viewhandlers in an app manifest