Android应用获取当前AP的BSSID始终显示02:00:00:00:00:00求助
问题分析与解决方案
核心问题
- 权限请求是异步操作,你在调用
requestPermissions后立即获取WifiInfo,此时权限还未真正授予,导致系统返回默认的BSSID值02:00:00:00:00:00 - 未正确处理权限授权后的回调逻辑,无法在权限生效后重新获取有效WiFi信息
修复步骤
1. 重写权限回调方法
在MainActivity中添加权限授权结果的处理方法,仅当权限全部授予后再执行BSSID获取逻辑:
@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); // 检查所有请求的权限是否都已授予 boolean allPermissionsGranted = true; for (int result : grantResults) { if (result != PackageManager.PERMISSION_GRANTED) { allPermissionsGranted = false; break; } } if (allPermissionsGranted && requestCode == 100) { fetchAndDisplayBSSID(); } else { textView.setText("权限未授予,无法获取BSSID"); } }
2. 封装BSSID获取逻辑
把获取WiFi信息的代码抽成独立方法,方便重复调用:
private void fetchAndDisplayBSSID() { WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE); // 双重权限校验,避免权限被收回的情况 if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED || ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_WIFI_STATE) != PackageManager.PERMISSION_GRANTED) { return; } WifiInfo wifiInfo = wifiManager.getConnectionInfo(); // 同时校验连接状态和BSSID有效性 if (wifiInfo.getSupplicantState() == SupplicantState.COMPLETED && !"02:00:00:00:00:00".equals(wifiInfo.getBSSID())) { textView.setText(wifiInfo.getBSSID()); } else { textView.setText("未连接到有效WiFi或连接未完成"); } }
3. 修改onCreate初始化逻辑
在onCreate中仅做初始化和权限检查,避免异步权限请求未完成就执行获取操作:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = findViewById(R.id.textView); // 先检查权限状态,已授予直接获取,未授予则发起请求 if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_WIFI_STATE) == PackageManager.PERMISSION_GRANTED) { fetchAndDisplayBSSID(); } else { // 使用自定义请求码100,避免与系统常量冲突 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_WIFI_STATE, Manifest.permission.ACCESS_FINE_LOCATION}, 100); } }
额外注意事项
- Android 10+ 位置服务限制:即使权限授予,若设备位置服务未开启,仍可能无法获取正确BSSID,建议添加位置服务开启状态的检查提示
- 连接状态延迟处理:部分场景下
SupplicantState.COMPLETED状态触发时,BSSID可能还未更新,可延迟1-2秒再调用fetchAndDisplayBSSID,或注册WifiManager.NETWORK_STATE_CHANGED_ACTION广播监听连接状态变化
内容的提问来源于stack exchange,提问作者friendly joe
相关产品推荐
相关产品推荐

