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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 18:54:03