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
相关产品推荐
相关产品推荐

