Android API 30下Kivy读取TXT文件遇权限拒绝问题求示例
Android API 30+ 下读取TXT文件权限问题解决示例
问题根源:Android 11及以上版本限制了直接通过文件路径访问外部存储文件,Plyer的文件选择器返回的是content://格式的URI,而非本地文件路径,直接用open()方法读取会触发权限拒绝错误。
以下是修改后的完整代码示例,通过Android的ContentResolver读取文件内容:
from kivy.utils import platform from plyer import filechooser # Android平台需要导入的模块 if platform == 'android': from android import mActivity from android.content import ContentResolver from java.io import BufferedReader, InputStreamReader class YourAppClass: def show_selection(self, chooser, selection, *args): if not selection: return file_uri = selection[0] # 取第一个选中的文件 print(f"选中的文件URI: {file_uri}") if platform == 'android': # 获取Android的ContentResolver实例 resolver = mActivity.getContentResolver() # 通过URI打开输入流 input_stream = resolver.openInputStream(file_uri) # 读取流内容 reader = BufferedReader(InputStreamReader(input_stream)) eng_text = "" line = reader.readLine() while line is not None: eng_text += line + "\n" line = reader.readLine() # 关闭资源 reader.close() input_stream.close() else: # 非Android平台直接用文件路径读取 with open(file_uri, "r") as f: eng_text = f.read() print(f"文件内容:\n{eng_text}") def file_manager_open(self, *args): # 调用Plyer文件选择器,指定过滤TXT文件 filechooser.open_file( on_selection=self.show_selection, filters=[("Text Files", "*.txt")] )
关键说明:
- 平台判断:仅在Android平台使用ContentResolver处理URI,其他平台保持原有逻辑
- ContentResolver读取:通过系统提供的ContentResolver访问文件,绕过直接路径访问的权限限制
- 资源关闭:记得关闭输入流和阅读器,避免资源泄漏
内容的提问来源于stack exchange,提问作者KryptonH
相关产品推荐
相关产品推荐

