Android Kivy应用触发PermissionError: [Errno13] /data/.cache权限拒绝求助
解决Android上Kivy应用的PermissionError: /data/.cache权限拒绝问题
问题现象
在Android设备运行Kivy应用时触发错误:PermissionError: [Errno 13] Permission denied: '/data/.cache'。从日志追踪可知,是fake_user_agent库尝试创建/data/.cache/fakeua目录时失败——Android系统禁止普通应用写入/data/.cache这类系统级目录。
环境信息
- Python版本:3.6.9
- Kivy:2.0.0
- Kivy-Garden:0.1.5
- buildozer:1.5.1.dev0
- Cython:0.29.34
- 操作系统:XUbuntu 18.04
Buildozer.spec配置
requirements = python3,kivy,fake_user_agent,beautifulsoup4,pyrogram,tgcrypto,pyQiwiP2P,requests,urllib3,chardet,certifi,idna,lxml,aiohttp,multidict,attr,yarl,async_timeout,attrs,Pillow,cchardet,charset-normalizer==2.1.1,aiosignal,frozenlist,android,libtool,pathlib2,pathlib android.permissions = INTERNET,WRITE_EXTERNAL_STORAGE,READ_EXTERNAL_STORAGE,ACCESS_NETWORK_STATE,ACCESS_WIFI_STATE
错误日志(Logcat)
04-23 14:41:12.798 3353 3392 I python : Traceback (most recent call last): 04-23 14:41:12.799 3353 3392 I python : File "/home/bodya/program_nastena/.buildozer/android/platform/build-arm64-v8a_armeabi-v7a/build/other_builds/python3/armeabi-v7a__ndk_target_22/python3/Lib/pathlib.py", line 1323, in mkdir 04-23 14:41:12.799 3353 3392 I python : FileNotFoundError: [Errno 2] No such file or directory: '/data/.cache/fakeua' 04-23 14:41:12.799 3353 3392 I python : During handling of the above exception, another exception occurred: 04-23 14:41:12.799 3353 3392 I python : Traceback (most recent call last): 04-23 14:41:12.799 3353 3392 I python : File "/home/bodya/program_nastena/.buildozer/android/app/main.py", line 8, in <module> 04-23 14:41:12.800 3353 3392 I python : File "/home/bodya/program_nastena/.buildozer/android/platform/build-arm64-v8a_armeabi-v7a/build/python-installs/myapp/armeabi-v7a/fake_user_agent/__init__.py", line 3, in <module> 04-23 14:41:12.800 3353 3392 I python : File "/home/bodya/program_nastena/.buildozer/android/platform/build-arm64-v8a_armeabi-v7a/build/python-installs/myapp/armeabi-v7a/fake_user_agent/user_agent.py", line 30, in <module> 04-23 14:41:12.800 3353 3392 I python : File "/home/bodya/program_nastena/.buildozer/android/platform/build-arm64-v8a_armeabi-v7a/build/python-installs/myapp/armeabi-v7a/fake_user_agent/settings.py", line 12, in <module> 04-23 14:41:12.800 3353 3392 I python : File "/home/bodya/program_nastena/.buildozer/android/platform/build-arm64-v8a_armeabi-v7a/build/other_builds/python3/armeabi-v7a__ndk_target_22/python3/Lib/pathlib.py", line 1327, in mkdir 04-23 14:41:12.801 3353 3392 I python : File "/home/bodya/program_nastena/.buildozer/android/platform/build-arm64-v8a_armeabi-v7a/build/other_builds/python3/armeabi-v7a__ndk_target_22/python3/Lib/pathlib.py", line 1323, in mkdir 04-23 14:41:12.801 3353 3392 I python : PermissionError: [Errno 13] Permission denied: '/data/.cache' 04-23 14:41:12.801 3353 3392 I python : Python for android ended.
解决方案
方法1:修改fake_user_agent缓存路径到应用私有目录
Android应用仅能自由访问自身私有存储目录,将fake_user_agent的缓存路径替换为应用私有缓存目录即可解决权限问题。在main.py开头添加以下代码:
import os from fake_user_agent import settings # 获取应用私有缓存目录 cache_dir = os.path.join(os.environ.get('ANDROID_APP_PATH', '.'), 'cache') os.makedirs(cache_dir, exist_ok=True) # 覆盖fake_user_agent的默认缓存路径 settings.CACHE_PATH = os.path.join(cache_dir, 'fakeua')
方法2:禁用fake_user_agent的缓存功能
如果不需要缓存用户代理数据,可直接关闭缓存,避免创建目录的操作。在main.py开头添加:
from fake_user_agent import settings settings.CACHE = False
额外注意事项
Android 6.0+需要动态请求权限,即便配置文件中声明了权限,仍需在代码中主动请求:
from android.permissions import request_permissions, Permission request_permissions([Permission.WRITE_EXTERNAL_STORAGE, Permission.READ_EXTERNAL_STORAGE])
内容的提问来源于stack exchange,提问作者BroproGames Official
相关产品推荐
相关产品推荐

