为什么 filemanager 不能在 android kivymd 上工作?
Why is filemanager not working on android kivymd?
我用它来创建文件管理器。
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()
使用 kivymd 在 android 上打开文件管理器的实现是什么?
您没有权限查看 "/"
目录
def file_manager_open(self):
self.file_manager.show(self.user_data_dir)
您需要将self.file_manager.show('/')更改为
self.file_manager.show(primary_ext_storage)
其中 primary_ext_storage 是 android phone 上的文件目录。您还需要在下面声明。
from android.storage import primary_external_storage_path
primary_ext_storage = primary_external_storage_path()
primary_external_storage_path() returns Android所谓的“primary external storage”,常见于/sdcard/和
任何其他应用程序都可能访问。它与 Windows.
上的文档目录相比效果最好
最重要的是,您需要在脚本中添加以下代码以确保有权限访问 phone.
上的存储
from android.permissions import request_permissions, Permission
request_permissions([Permission.WRITE_EXTERNAL_STORAGE, Permission.READ_EXTERNAL_STORAGE])
不要被 primary_ext_storage 的名字混淆。它不是指您的 android phone SD 卡。相反,它将指向您的内部存储空间。
对于 android phone 上的外部存储,您可以使用
from android.storage import secondary_external_storage_path
secondary_ext_storage = secondary_external_storage_path()
我用它来创建文件管理器。
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()
使用 kivymd 在 android 上打开文件管理器的实现是什么?
您没有权限查看 "/"
目录
def file_manager_open(self):
self.file_manager.show(self.user_data_dir)
您需要将self.file_manager.show('/')更改为
self.file_manager.show(primary_ext_storage)
其中 primary_ext_storage 是 android phone 上的文件目录。您还需要在下面声明。
from android.storage import primary_external_storage_path
primary_ext_storage = primary_external_storage_path()
primary_external_storage_path() returns Android所谓的“primary external storage”,常见于/sdcard/和 任何其他应用程序都可能访问。它与 Windows.
上的文档目录相比效果最好最重要的是,您需要在脚本中添加以下代码以确保有权限访问 phone.
上的存储from android.permissions import request_permissions, Permission
request_permissions([Permission.WRITE_EXTERNAL_STORAGE, Permission.READ_EXTERNAL_STORAGE])
不要被 primary_ext_storage 的名字混淆。它不是指您的 android phone SD 卡。相反,它将指向您的内部存储空间。
对于 android phone 上的外部存储,您可以使用
from android.storage import secondary_external_storage_path
secondary_ext_storage = secondary_external_storage_path()