如何检测WiFi调试模式的开启与关闭状态及实时变更?
检测WiFi调试状态的实现方案
一、应用启动时主动检测状态
WiFi调试的开关状态存储在系统全局设置中,可直接读取该值判断状态。注意需要申请READ_SETTINGS权限(系统特殊权限,需引导用户手动授权)。
代码示例:
private static final int REQUEST_CODE_AUTH_SETTINGS = 1001; // 检测WiFi调试状态 private void checkAdbWifiState() { if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_SETTINGS) != PackageManager.PERMISSION_GRANTED) { // 引导用户前往设置页授权 Intent authIntent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS); authIntent.setData(Uri.parse("package:" + getPackageName())); startActivityForResult(authIntent, REQUEST_CODE_AUTH_SETTINGS); return; } // 读取状态:1为开启,0为关闭 int state = Settings.Global.getInt(getContentResolver(), Settings.Global.ADB_WIFI_ENABLED, 0); boolean isWifiDebugEnabled = state == 1; // 此处处理状态结果,比如更新UI或业务逻辑 } // 处理授权返回结果 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CODE_AUTH_SETTINGS) { checkAdbWifiState(); } }
二、监听WiFi调试状态变化
系统在WiFi调试状态变更时会发送Settings.Global.ACTION_ADB_WIFI_ENABLED_CHANGED广播,通过动态注册广播接收器可实时获取状态变化。
代码示例:
1. 定义广播接收器
public class AdbWifiStateReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (Settings.Global.ACTION_ADB_WIFI_ENABLED_CHANGED.equals(intent.getAction())) { // 读取最新状态 int state = Settings.Global.getInt(context.getContentResolver(), Settings.Global.ADB_WIFI_ENABLED, 0); boolean isEnabled = state == 1; // 处理状态变更逻辑 } } }
2. 动态注册接收器(建议在Activity/Service的onCreate中注册)
private AdbWifiStateReceiver wifiStateReceiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // ...其他初始化逻辑 wifiStateReceiver = new AdbWifiStateReceiver(); IntentFilter filter = new IntentFilter(Settings.Global.ACTION_ADB_WIFI_ENABLED_CHANGED); registerReceiver(wifiStateReceiver, filter); } @Override protected void onDestroy() { super.onDestroy(); // 注销接收器,避免内存泄漏 if (wifiStateReceiver != null) { unregisterReceiver(wifiStateReceiver); } }
注意事项
- API兼容:
Settings.Global.ADB_WIFI_ENABLED从Android 11(API 30)开始正式对外开放,若需兼容更早版本,可直接使用字符串常量"adb_wifi_enabled"替代系统常量进行读取。 - 权限限制:
READ_SETTINGS权限无法通过常规权限弹窗申请,必须引导用户到应用设置页手动开启权限。 - 广播注册:由于Android 8.0(API 26)后静态注册广播接收器受限,建议使用动态注册方式确保能接收到状态变更广播。
内容的提问来源于stack exchange,提问作者Ricardo Rodrigues
相关产品推荐
相关产品推荐

