Android 12上 Kivy的文件访问被拒绝
我在让Kivy的 FileChooserListView正常工作时遇到问题。
我的Python脚本:
# check if on android and request permissions
from sys import platform
if platform == 'android':
from android.permissions import request_permissions, Permission
from android.storage import app_storage_path, primary_external_storage_path
request_permissions([
Permission.READ_EXTERNAL_STORAGE,
Permission.WRITE_EXTERNAL_STORAGE
])
class MyLayout(Widget):
pass
class k8(App):
def build(self):
return MyLayout()
if __name__ == '__main__':
k8().run()
Buildozer.spec:
...
# (list) Application requirements
# comma separated e.g. requirements = sqlite3,kivy
requirements = python3,kivy,pillow,numpy,pandas,matplotlib,pyjnius
...
# (list) Permissions
# (See https://python-for-android.readthedocs.io/en/latest/buildoptions.html for all the supported syntaxes and properties)
#android.permissions = android.permission.INTERNET, (name=android.permission.WRITE_EXTERNAL_STORAGE;maxSdkVersion=18), MANAGE_EXTERNAL_STORAGE
android.permissions = MANAGE_EXTERNAL_STORAGE
当我在Android上运行应用时,屏幕会出现一块黑屏,屏幕顶部有两个文本,分别是“name”和“size”。
我在logcat中看到的错误报告:
adb logcat | grep python
...
23690 23732 I python : PermissionError: [Errno 13] Permission denied: '/'
我认为问题在于应用没有访问文件的权限,我不确定应该怎么做才能获得访问权限。
编辑: 这是我的k8.kv
<MyLayout>
BoxLayout:
orientation: 'vertical'
size: root.width, root.height
padding: 50
spacing: 20
FileChooserListView:
id: file_chooser
path: root.file_paths
以及我当前的脚本:
# import kivy
from fontTools.diff import color
from kivy.app import App
from kivy.uix import button
from kivy.uix.label import Label
from kivy.uix.gridlayout import GridLayout
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.textinput import TextInput
from kivy.uix.button import Button
from kivy.uix.widget import Widget
from kivy.properties import ObjectProperty, StringProperty
from kivy.uix.image import Image
from kivy.core.window import Window
from kivy.lang import Builder
from kivy.uix.floatlayout import FloatLayout
from sys import platform
print(platform)
#kivy settings
Builder.load_file('k8.kv')
# check if on android and request permissions
if platform == 'android':
from android.storage import primary_external_storage_path, app_storage_path
from android.permissions import request_permissions, Permission
request_permissions([
Permission.READ_EXTERNAL_STORAGE,
Permission.WRITE_EXTERNAL_STORAGE
])
class MyLayout(Widget):
# store path for fileview
file_paths = StringProperty()
def init(self, **kwargs):
super().__init__(self, **kwargs)
self.file_paths = primary_external_storage_path
pass
class k8(App):
def build(self):
return MyLayout()
if __name__ == '__main__':
k8().run()
解决方案
Android对文件访问权限有严格的限制。你可能需要为你的 FileChooserListView 提供一个你可以访问的起始文件夹。例如:
from android.storage import primary_external_storage_path
primary = primary_external_storage_path()
FileChooserListView(path=primary)
你也可能需要在你的 request_permissions() 代码中获得 MANAGE_EXTERNAL_STORAGE 权限。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。