Python for Android的Kivy应用如何正确申请永久WiFi控制权限
问题原因与解决方案
崩溃原因
你遇到的崩溃是因为权限申请调用时机过早:动态权限申请依赖安卓Activity上下文,你直接把申请代码写在全局作用域,此时Kivy App还未完成初始化、Activity上下文还未就绪,就会触发闪退。
具体解决步骤
- 第一步:把权限申请逻辑移到Kivy App的
on_start生命周期回调中执行,同时申请所有需要的权限,不要只申请单个权限 - 第二步:等待权限申请通过后再初始化WifiManager、执行WiFi开关操作
- 第三步:添加权限申请结果的判断逻辑,处理用户拒绝授权的场景
可用代码示例
import platform from kivy.app import App from kivy.uix.button import Button class WifiTestApp(App): def build(self): return Button(text="开关WiFi", on_press=self.toggle_wifi) def on_start(self): # 仅安卓平台需要申请动态权限 if platform == 'android': from android.permissions import request_permissions, Permission # 一次性申请所有需要的权限 perms = [Permission.CHANGE_WIFI_STATE, Permission.ACCESS_WIFI_STATE] # 安卓12及以上系统操作WiFi还需要额外的ACCESS_FINE_LOCATION权限,可按需添加 # perms.append(Permission.ACCESS_FINE_LOCATION) request_permissions(perms, self.on_permission_result) def on_permission_result(self, permissions, grants): # 权限申请结果回调,grants是布尔值列表,对应每个权限是否通过 all_granted = all(grants) if all_granted: # 权限全部通过后再初始化WifiManager from wifidroid.wifi import WifiManager self.wifi = WifiManager() else: # 可在此处添加用户拒绝权限的提示逻辑 pass def toggle_wifi(self, instance): if not hasattr(self, 'wifi'): # 权限未通过时直接返回,避免运行报错 return current_state = self.wifi.isWifiEnabled() self.wifi.EnabledWifi(not current_state) if __name__ == "__main__": WifiTestApp().run()
永久授权说明
你之前每次操作WiFi都需要用户点允许,是因为没有提前做动态权限申请,系统每次检测到WiFi操作时都会弹出临时授权提示。
按上述逻辑实现后,用户第一次打开App时会弹出权限申请框,只要选择「允许」(部分高版本安卓系统显示为「始终允许」),后续打开App就不会再重复申请权限,也不需要每次操作WiFi时再授权。
内容的提问来源于stack exchange,提问作者mehdi alizade
相关产品推荐
相关产品推荐

