在 Android 上尝试使用 Kivy 和 Python 写入 /storage/emulated/0 时出现 [Errno 1] 操作不允许错误

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

我已经在桑树丛里呆了几个星期了,现在正在尝试在 Android 手机上实现文件写入。 我的开发设置是在装有 Anaconda 和 Pycharm 的 Windows PC 上进行的。 我正在使用 kivy 和 buildozer 来创建 Android 应用程序。 我的测试应用程序只是尝试将文件(test.txt)写入手机上SD卡的根目录。

目录为:/storage/emulated/0

我收到的错误是:[Errno 1] 不允许操作:'/storage/emulated/0/test.txt'

我在代码中请求权限,但是应用程序启动或安装时没有提示权限。

这是代码;

import kivy
from kivy.app import App
from kivy.uix.gridlayout import GridLayout
from kivy.uix.textinput import TextInput
from kivy.uix.button import Button
from kivy.utils import platform
import os

class MyGridLayout(GridLayout):
    def __init__(self, **kwargs):
        super(MyGridLayout, self).__init__(**kwargs)

        self.cols = 1

        self.dir_button = Button(text="Show Directory")
        self.dir_button.bind(on_press=self.press_dir)
        self.add_widget(self.dir_button)

        self.write_button = Button(text="Write File")
        self.write_button.bind(on_press=self.press_write)
        self.add_widget(self.write_button)

        self.text_field = TextInput(multiline=True)
        self.add_widget(self.text_field)

    def press_dir(self, instance):
        if platform == 'android':
            from android.storage import primary_external_storage_path
            self.file_dir = primary_external_storage_path()
        else:
            self.file_dir = App.get_running_app().user_data_dir

        if not os.path.exists(self.file_dir):
            os.mkdir(self.file_dir)

        self.text_field.text = self.file_dir

    def press_write(self, instance):
        self.file_name = "test.txt"
        self.full_name = os.path.join(self.file_dir, self.file_name)
        try:
            with open(self.full_name, "w") as outfile:
                outfile.write("Hello World")
        except Exception as e:
            self.text_field.text = str(e)

class TestWriteApp(App):
    def build(self):
        return MyGridLayout()

if platform == 'android':
    from android.permissions import request_permissions, Permission
    request_permissions([Permission.WRITE_EXTERNAL_STORAGE,
                         Permission.READ_EXTERNAL_STORAGE])

testwriteapp = TestWriteApp()
testwriteapp.run()

以下是测试时的截图; 显示目录按钮 在此输入图片描述

写入文件按钮 在此输入图片描述

感谢您的帮助。

我尝试了很多事情...在 buildozer.spec 文件中添加权限,将输出位置更改为内部 user_data_dir (我认为这有效,但我需要用户能够使用“文件”应用程序来获取生成的文件)

python android permissions kivy
2个回答
0
投票

在 Android 11+ 设备上,您无法再像您尝试的那样写入外部存储的根目录。

而是使用已有的公共目录,例如文档和下载。

在 Android 13 设备上,您不需要任何权限即可执行此操作。


0
投票

文件数据AIMBOT‼️100% VIP.7z 1 无法打开输出文件:errno=1:不允许操作:/storage/emulated/0/Download/FILES DATA AIMBOT‼️ 100%/⚠️ peringatan |||警告⚠️/BACA⚠️____________________________________________________________ GUNA FILES INI DI AKUN KECIL SAJA ||| TIDAK DI SARANKAN DI GUNAKAN DI AKUN UTAMA ‼️ 2 无法打开输出文件:errno=1:不允许操作:/storage/emulated/0/Download/FILES DATA AIMBOT‼️ 100%/⚠️ peringatan |||警告⚠️/阅读⚠️____________________________________________________________ 仅在小帐户上使用这些文件|||不建议在主账户上使用‼️

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