Skip to content

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.

Launching

Pick files with startActivityForResult

from mpos import Intent, Activity

class MyActivity(Activity):
    def _open_file_clicked(self, event):
        intent = Intent(action="pick_file")
        intent.putExtra("mode", "pick")
        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" "browse" or "pick".
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.

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("mode", "pick")
        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 view action work
  • AppManager - How file-type handlers are resolved
  • Creating Apps - Declaring view handlers in an app manifest
Back to top