You need to enable JavaScript to run this app. Pydroid3中借助jnius申请Android读取短信权限触发类找不到异常的问题
优惠活动
大模型
产品
解决方案
定价
更多

Pydroid3中借助jnius申请Android读取短信权限触发类找不到异常的问题

报错核心原因

你遇到的jnius.jnius.JavaException: Class not found b'org/kivy/android/PythonActivity$PermissionsCallback' 并非jnius调用逻辑的问题,本质是三类配置/调用时机错误叠加导致:

  • 依赖版本不匹配:旧版本python-for-android框架未内置PermissionsCallback这个内部类,和你导入的android.permissions模块版本不兼容
  • 调用时机错误:将request_permissions写在模块顶层导入阶段,此时App的Android运行时环境尚未完全初始化,类加载链路断裂
  • 打包配置缺失:未在打包配置中完成短信权限的系统级注册,运行时类加载路径不完整
修正后的正确实现

将权限申请逻辑从模块顶层移动到App生命周期内执行,等运行时环境完全初始化后再触发类加载和权限申请,示例代码如下:

import kivy
from kivy.app import App
from kivy.uix.label import Label
from jnius import autoclass
from android.permissions import request_permissions, Permission


class SmsReadApp(App):
    def build(self):
        # App启动完成后再发起权限申请
        self.apply_sms_permission()
        return Label(text="短信读取程序运行中")

    def apply_sms_permission(self):
        # 绑定权限申请结果回调
        def permission_handler(permissions, grant_status):
            if all(grant_status):
                # 权限通过后再动态加载短信读取相关的Java类
                self.init_sms_reader()
            else:
                print("短信读取权限申请被拒绝")

        request_permissions(
            [Permission.READ_SMS],
            permission_handler
        )

    def init_sms_reader(self):
        # 权限就绪后再执行autoclass加载,避免类加载异常
        sms_provider = autoclass('android.provider.Telephony$Sms')
        # 后续短信读取逻辑可在此扩展


if __name__ == "__main__":
    SmsReadApp().run()
打包阶段必须完成的配套调整
  • 将buildozer依赖的python-for-android版本升级到0.7.0及以上,匹配内置的android.permissions模块逻辑,消除版本不匹配导致的类缺失问题
  • 在buildozer.spec的权限配置段显式声明android.permissions = READ_SMS,完成系统层面的权限注册
  • 移除代码中手动提前加载PythonActivity的逻辑:android.permissions模块内部已经完成了PythonActivity实例的引用获取,提前手动加载会打乱类加载顺序,直接触发类找不到的异常

内容的提问来源于stack exchange,提问作者Adriel Oloko

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.05 06:54:02