为啥文件管理器不能在 android kivymd 上运行?

Posted

技术标签:

【中文标题】为啥文件管理器不能在 android kivymd 上运行?【英文标题】:Why is filemanager not working on android kivymd?为什么文件管理器不能在 android kivymd 上运行? 【发布时间】:2021-02-27 03:33:01 【问题描述】:

我用它来创建文件管理器。

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

但它不再工作了。我已经使用 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()

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

【问题讨论】:

【参考方案1】:

你需要把self.file_manager.show('/')改成

self.file_manager.show(primary_ext_storage)

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

from android.storage import primary_external_storage_path
primary_ext_storage = primary_external_storage_path()

primary_external_storage_path() 返回 Android 的所谓“主外部存储”,通常位于 /sdcard/ 和 任何其他应用程序都可以访问。它与 Windows 上的 Documents 目录相比最好。

最重要的是,您需要在脚本中添加以下代码,以确保有权限访问手机上的存储。

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

不要被 primary_ext_storage 的名称所迷惑。它不是指您的 android 手机 SD 卡。相反,它将指向您的内部存储。

对于安卓手机的外部存储,你可以使用

from android.storage import secondary_external_storage_path
secondary_ext_storage = secondary_external_storage_path()

【讨论】:

请注意,如果您的目标是 Android 10,则需要选择退出范围存储。 developer.android.com/training/data-storage/use-cases【参考方案2】:

您无权查看"/" 目录

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

【讨论】:

以上是关于为啥文件管理器不能在 android kivymd 上运行?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 KivyMD apk 应用程序在打开后立即关闭?

KivyMD,在 android 中看不到图标,但在 linux 上工作

Android Apk 仅适用于 KivyMd 崩溃

为啥我在 Kivymd 中的 rgb 颜色看起来与真实颜色不同?

为啥我的同一个 kivymd 应用程序说应用程序未安装?

有没有办法在 Android 中测试 Kivymd 应用程序?