【问题标题】:Python: Permission denied problem on AndroidPython:Android上的权限被拒绝问题
【发布时间】:2024-01-12 02:16:01
【问题描述】:

我只是想将网站上的.mp3 文件保存在Android 上的/storage/emulated/0/Download 文件夹中,但我总是得到Errno 13 Permission denied

这里是示例代码:

import requests

# full path to mp3 file in website example
target_link = 'https://www.yt-download.org/download/IFtwhMK64H8/mp3/128/1630338605/f2803874069bf196561631cea2b1b11c2b1d2f9555e2baf751eb28b46d484bb5/0.mp3'

r = requests.get(target_link)

# downloading it into download folder on Android
with open('/storage/emulated/0/Download/file.mp3', 'wb') as f:
    f.write(r.content)

更新: 忘了说我是用 Kivy 作为 GUI 框架的。

【问题讨论】:

  • 如何让它在 Android 上运行?你在用什么?在 Android 上,下载文件夹的写入权限需要特定权限。请提供有关环境的信息
  • 哦,对不起,我忘了说我用 Kivy 和 KivyMD 做了简单的 GUI,我只是在 android 上部署了这个应用程序。
  • 我有INTERNET, WRITE_EXTERNAL_STORAGE, READ_EXTERNAL_STORAGE 权限。
  • 列出WRITE_EXTERNAL_STORAGE 不会自动授予您该权限。您还必须通过操作系统提示用户并要求他们接受它。列出该权限只会通知您打算请求此特定权限的 Android 操作系统。

标签: python android python-3.x save


【解决方案1】:

您肯定需要 WRITE_EXTERNAL_STORAGE 权限。 在最新的 Android 版本上,必须明确请求该权限。 然后你必须使用这样的东西:

from android.permissions import Permission, request_permissions, check_permission

def check_permissions(perms):
    for perm in perms:
        if check_permission(perm) != True:
            return False
    return True

perms = [Permission.WRITE_EXTERNAL_STORAGE, Permission.READ_EXTERNAL_STORAGE]
    
if  check_permissions(perms)!= True:
    request_permissions(perms)

这将确保您拥有所有必需的权限并且用户明确授予了这些权限。请注意,您必须每次都检查它们,因为用户可以在应用程序之外撤消它们。

您的代码的其余部分看起来没问题,即使我最好使用 primary_external_storage_path(),而不是提供绝对路径。

【讨论】:

  • 嗯,我认为在 buildozer.spec 文件中有 WRITE_EXTERNAL_STORAGE 会让我的应用程序下载它想要的任何东西。好的,谢谢你的回答。
  • 这是 7.0 之前的 Android 版本的正确行为(我可能被误认为是该版本)。从那个版本开始,write_external_storage 需要明确的许可。 Android 文档中提到了它,但我不确定 Kivy 的文档是否提到它。
最近更新 更多