导入“android.permissions”在 Kivy 应用程序中不起作用

问题描述 投票:0回答:1

所以我想使用 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 也是如此。

python android kivy kivy-language kivymd
1个回答
0
投票

事实上,要在 Android 上使用文件选择器,您必须首先请求许可。这分两步完成:

  1. 在 buildozer 规范文件中添加您所需的权限,该文件允许您编译 Android 代码。根据您的情况,编辑文件中的
    android.permissions
    行以请求
    READ_EXTERNAL_STORAGE
    WRITE_EXTERNAL_STORAGE
    :
# (list) Permissions
android.permissions = READ_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGE
  1. 在代码启动时请求权限。为此,您必须导入
    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。

© www.soinside.com 2019 - 2024. All rights reserved.