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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 12:35:23