Python 为什么filemanager不能在android kivymd上工作?

Python 为什么filemanager不能在android kivymd上工作?,python,kivy,kivymd,Python,Kivy,Kivymd,我用它创建了文件管理器 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' MDToolb

我用它创建了文件管理器

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()

但它已经不起作用了。我已经使用buildozer为android创建了这个应用程序。但当点击该按钮时,android上的文件管理器不会打开。我还允许在应用程序设置中使用存储权限。但仍然没有打开文件管理器

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()

使用kivymd在android上打开文件管理器的实现是什么?

您没有查看
“/”
目录的权限

def file_manager_open(self):
    self.file_manager.show(self.user_data_dir)

您没有查看
“/”
目录的权限

def file_manager_open(self):
    self.file_manager.show(self.user_data_dir)
您需要将self.file_manager.show('/')更改为

其中primary_ext_storage是android手机上的文件目录。您还需要在下面声明

from android.storage import primary_external_storage_path
primary_ext_storage = primary_external_storage_path()
primary_external_storage_path()返回Android的所谓“primary external storage”,通常位于/sdcard/和 任何其他应用程序都可能访问。它与Windows上的Documents目录相比效果最好

除此之外,您还需要在脚本中添加以下代码,以确保有权访问手机上的存储

from android.permissions import request_permissions, Permission
request_permissions([Permission.WRITE_EXTERNAL_STORAGE, Permission.READ_EXTERNAL_STORAGE])
不要被主存储的名称所迷惑。它不是指你的android手机SD卡。相反,它将指向您的内部存储

对于android手机上的外部存储,您可以使用

from android.storage import secondary_external_storage_path
secondary_ext_storage = secondary_external_storage_path()
您需要将self.file_manager.show('/')更改为

其中primary_ext_storage是android手机上的文件目录。您还需要在下面声明

from android.storage import primary_external_storage_path
primary_ext_storage = primary_external_storage_path()
primary_external_storage_path()返回Android的所谓“primary external storage”,通常位于/sdcard/和 任何其他应用程序都可能访问。它与Windows上的Documents目录相比效果最好

除此之外,您还需要在脚本中添加以下代码,以确保有权访问手机上的存储

from android.permissions import request_permissions, Permission
request_permissions([Permission.WRITE_EXTERNAL_STORAGE, Permission.READ_EXTERNAL_STORAGE])
不要被主存储的名称所迷惑。它不是指你的android手机SD卡。相反,它将指向您的内部存储

对于android手机上的外部存储,您可以使用

from android.storage import secondary_external_storage_path
secondary_ext_storage = secondary_external_storage_path()

请注意,如果您的目标是Android 10,则需要选择退出作用域存储。请注意,如果您的目标是Android 10,则需要选择退出作用域存储。