Search code examples
pythonkivykivymd

Why is filemanager not working on android kivymd?


I have used this to create file manager.

https://kivymd.readthedocs.io/en/latest/components/file-manager/

But it is not working anymore. I have created the app using the code for android using buildozer. But when tapping on button does not open file manager on android. I have also allowed storage permission in app settings. But still not opening file manager.

from kivy.core.window import Window
from kivy.lang import Builder

from kivymd.app import MDApp
from kivymd.uix.filemanager import MDFileManager
from kivymd.toast import toast


KV = '''
BoxLayout:
    orientation: 'vertical'

    MDToolbar:
        title: "MDFileManager"
        left_action_items: [['menu', lambda x: None]]
        elevation: 10

    FloatLayout:

        MDRoundFlatIconButton:
            text: "Open manager"
            icon: "folder"
            pos_hint: {'center_x': .5, 'center_y': .6}
            on_release: app.file_manager_open()
'''


class Example(MDApp):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        Window.bind(on_keyboard=self.events)
        self.manager_open = False
        self.file_manager = MDFileManager(
            exit_manager=self.exit_manager,
            select_path=self.select_path,
            preview=True,
        )

    def build(self):
        return Builder.load_string(KV)

    def file_manager_open(self):
        self.file_manager.show('/')  # output manager to the screen
        self.manager_open = True

    def select_path(self, path):
        '''It will be called when you click on the file name
        or the catalog selection button.

        :type path: str;
        :param path: path to the selected directory or file;
        '''

        self.exit_manager()
        toast(path)

    def exit_manager(self, *args):
        '''Called when the user reaches the root of the directory tree.'''

        self.manager_open = False
        self.file_manager.close()

    def events(self, instance, keyboard, keycode, text, modifiers):
        '''Called when buttons are pressed on the mobile device.'''

        if keyboard in (1001, 27):
            if self.manager_open:
                self.file_manager.back()
        return True


Example().run()

What will be the implementation for opening file manager on android using kivymd?


Solution

  • You need to change self.file_manager.show('/') to

    self.file_manager.show(primary_ext_storage)
    

    where primary_ext_storage is the file directory on your android phone. You also need to declare below.

    from android.storage import primary_external_storage_path
    primary_ext_storage = primary_external_storage_path()
    

    primary_external_storage_path() returns Android’s so-called “primary external storage”, often found at /sdcard/ and potentially accessible to any other app. It compares best to the Documents directory on Windows.

    On top of that, you need to add the following code in your script to ensure there is permission to access to the storage on the phone.

    from android.permissions import request_permissions, Permission
    request_permissions([Permission.WRITE_EXTERNAL_STORAGE, Permission.READ_EXTERNAL_STORAGE])
    

    Do not be confused by the name of primary_ext_storage . It is not referring to your android phone SD card. Instead, it will be pointing to your internal storage.

    For external storage on android phone, you can use

    from android.storage import secondary_external_storage_path
    secondary_ext_storage = secondary_external_storage_path()