所以我想使用 plyer 的文件选择器,虽然它在我的电脑上运行良好,但实际上不允许在 Android 上选择任何文件。它打开文件选择器,即使用户选择文件也不会获取文件路径。我在网上到处找,似乎找不到解决方案,因为我看到的是 android.permissions 应该带有 kivy 安装。
有人可以帮我吗?
为了澄清起见,我添加了一个简单的代码,基本上显示了我要做什么。这也适用于 PC,但 Android 上的文本输入为空,这意味着它没有“获取”任何文件。
from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.textinput import TextInput
from plyer import filechooser
import os
class MyApp(App):
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.file_paths = []
self.file_names = []
def build(self):
layout = BoxLayout(orientation='vertical')
button = Button(text='Open File Chooser', on_release=self.show_file_chooser)
self.text_input = TextInput(readonly=True)
layout.add_widget(button)
layout.add_widget(self.text_input)
return layout
def show_file_chooser(self, *args):
filechooser.open_file(on_selection=self.handle_selection, multiple=True)
def handle_selection(self, selection):
self.file_paths = []
self.file_names = []
for file_path in selection:
self.file_paths.append(file_path)
file_name = os.path.basename(file_path)
self.file_names.append(file_name)
# Print the list of file paths
print(self.file_paths)
print(self.file_names)
# Update the UI with the selected file names
self.text_input.text = '\n'.join(self.file_names)
if __name__ == '__main__':
MyApp().run()
由于权限问题,Plyer 文件选择器似乎无法工作,但 android.permissions 无法工作,即使我降级 kivy 也是如此。
事实上,要在 Android 上使用文件选择器,您必须首先请求许可。这分两步完成:
android.permissions
行以请求 READ_EXTERNAL_STORAGE
和 WRITE_EXTERNAL_STORAGE
:# (list) Permissions
android.permissions = READ_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGE
android.permissions
模块。无需安装它,这是由 Buildozer 在编译 Android 代码时自动完成的。然后使用命令request_permissions([Permission.READ_EXTERNAL_STORAGE, Permission.WRITE_EXTERNAL_STORAGE])
请求权限。 Android 上会出现一个弹出窗口,允许用户选择。这里是代码修改建议:
import os
from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.textinput import TextInput
from kivy import platform
from plyer import filechooser
if platform == "android":
from android.permissions import request_permissions, Permission, check_permission # pylint: disable=import-error # type: ignore
request_permissions([Permission.READ_EXTERNAL_STORAGE,
Permission.WRITE_EXTERNAL_STORAGE])
class MyApp(App):
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.file_paths = []
self.file_names = []
def build(self):
layout = BoxLayout(orientation='vertical')
button = Button(text='Open File Chooser',
on_release=self.show_file_chooser)
self.text_input = TextInput(readonly=True)
layout.add_widget(button)
layout.add_widget(self.text_input)
return layout
def show_file_chooser(self, *args):
filechooser.open_file(
on_selection=self.handle_selection, multiple=True)
def handle_selection(self, selection):
self.file_paths = []
self.file_names = []
for file_path in selection:
self.file_paths.append(file_path)
file_name = os.path.basename(file_path)
self.file_names.append(file_name)
# Print the list of file paths
print(self.file_paths)
print(self.file_names)
# Update the UI with the selected file names
self.text_input.text = '\n'.join(self.file_names)
if __name__ == '__main__':
MyApp().run()
为了更进一步,我建议您看看这个存储库它确实帮助我在我自己的应用程序上集成了一个很好的文件选择器,并且有一个相对简单的API。