我的应用程序在Android 6.0.1上运行。它是用Python / Kivy编写的,我希望这是不相关的。
我的数据可能会变大。它不是私人的。我希望用户能够从PC访问。因此,我想将其存储在测试设备的外部 SD卡上。
是的,我指定要在清单中添加WRITE_EXTERNAL_STORAGE
(通过buildozer.spec文件)。
我通过检查设备上的“应用程序管理器”中的应用程序来确认此方法是否有效。它具有正确的权限。
是的,我在运行时立即在启动时再次请求权限。 (请参阅相关问题Why can't I write to Android External Storage?和Can't write in external storage)我通过提供回调来确认此方法是否有效。授予读写权限。
然后,我的应用程序获取python-for-android的secondary_external_storage_path()
。奇怪的是,它返回None!在使用基于环境变量的启发式方法之前,首先检查its source code,然后尝试询问android.os.Environment
。根据我使用adb shell
进行的估算,它应该找到已声明但已设置为SECONDARY_STORAGE
的环境变量/storage/extSdCard
-不存在的位置! -因此它在那里失败并返回None。
因此,我受到挫败,我暂时对地址/storage/3143-6351/
进行了硬编码,并在其下创建了一个子目录。
我将一些文件推送到该目录中。
这是其中一个文件的ls输出。在我的专家看来,这些权限似乎是合理的。
-rwxrwx--x root sdcard_rw 0 2020-07-07 16:13 heard.csv
父目录具有类似的权限。
我的应用程序启动,愉快地读取该目录中的文件,但是当它尝试写入时:
PermissionError: [Errno 13] Permission denied: '/storage/3143-6351/{path ellided}/heard.csv'
当我处理主要的辅助存储(即不是隐藏的应用程序存储,而是直接在电话上共享的存储(但易混淆地称为/sdcard
)时,此方法可以正常工作。
为什么在被授予读权限的同时被拒绝写权限?