You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 23:31:02