首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何获得所有连接网络的BSSID?

如何获得所有连接网络的BSSID?
EN

Stack Overflow用户
提问于 2018-07-23 06:32:09
回答 3查看 2.3K关注 0票数 8

我使用了下面的代码,但它运行得很好,但是几个月后,我得到了一个结果,它是、any,而不是BSSID值。这是我的密码。请指导我其他的方法。

代码语言:javascript
复制
 @SuppressLint("LongLogTag")
public void loadWifiAvailableList() {
    WifiManager wifiMan = (WifiManager) getApplicationContext().getSystemService(
            Context.WIFI_SERVICE);
    WifiInfo wifiInfo = wifiMan.getConnectionInfo();

    String macAddr = wifiInfo.getMacAddress();
    String bssid = wifiInfo.getBSSID();
   //here i am getting the proper bssid
    Log.d("bssid from get connection info",bssid);

    List<WifiConfiguration> list = wifiMan.getConfiguredNetworks();
    for( WifiConfiguration i : list ) {
        if(i.BSSID!=null)
     //here i am getting any from i.BSSID
        Log.d("bssid from get configured network",i.BSSID);

    }
}

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-07-26 08:00:53

我已经找到了一些解决方案,为什么我要在getConfiguredNetworks()中的 api中获得任何或空的字符串。背后的原因是,如果我们在某些场景中具有相同的SSID和相同的密码,它将以的形式发送任何或空的字符串。因此,当您试图连接同一个ssid时,getConfiguredNetworks()不是一个正确的方法。所以使用getScanResults() Api而不是getConfiguredNetworks().经过自己的研究,我已经发现了。只有当您获得具有相同的ssid和密码的AP列表时,才会出现此问题。扫描结果和添加是网络在wifi配置中的连接,但此方法在API级别26中被否决。因此,它不会在api 级别26上工作。参考链接

代码语言:javascript
复制
  //https://stackoverflow.com/a/8818490
        wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);

        //checking the right network.
        List<ScanResult> scanresults = wifiManager.getScanResults();
        {
            for (ScanResult scanresult : scanresults) {
                Log.d("scan result1", scanresult.BSSID + "");
 }}


 WifiConfiguration conf = new WifiConfiguration();
    conf.SSID = "\"" + networkSSID + "\"";
    conf.BSSID = Bssid;
  WifiManager wifiManager = (WifiManager)getApplicationContext().getSystemService(Context.WIFI_SERVICE);
  ///this wont work from api level 26
    wifiManager.addNetwork(conf);
    List<WifiConfiguration> list = wifiManager.getConfiguredNetworks();
    for (WifiConfiguration i : list) {
        if (i.BSSID != null && i.BSSID.equals(Bssid)) {
            wifiManager.disconnect();
            wifiManager.enableNetwork(i.networkId, true);
            wifiManager.reassociate();
            Log.d("changing network", "connecting the right network");
            break;
        }

    }
票数 0
EN

Stack Overflow用户

发布于 2018-07-25 11:19:04

我也有同样的问题。我用广播接收器解决了这个问题,并围绕它建立了我自己的逻辑。

广播接收类,请确保清单中提供的权限ACCESS_WIFI_STATECHANGE_WIFI_STATE

代码语言:javascript
复制
public class WifiChecker extends BroadcastReceiver {

    private OnWifiResultArrived onWifiResultArrived = null;
    private static boolean CAN_CALL_AGAIN = true;
    private WifiManager wifiManager;

    /**
     * @param context context of activity.
     * Remember to provide permission
     * <p>
     * {@code <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />},
     * {@code <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />}</p>
     */
    @SuppressLint("MissingPermission")
    public WifiChecker(Context context) {
        CAN_CALL_AGAIN = true;
        wifiManager = (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
        context.registerReceiver(this, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
        wifiManager.startScan();

        rerunAgain();
    }

    private void rerunAgain() {
        new Handler().postDelayed(new Runnable() {
            @SuppressLint("MissingPermission")
            @Override
            public void run() {
                if (CAN_CALL_AGAIN)
                    wifiManager.startScan();

                rerunAgain();       //rerun the broadcast again
            }
        }, 1000);
    }

    public void addListerForWifiCallback(OnWifiResultArrived onWifiResultArrived) {
        this.onWifiResultArrived = onWifiResultArrived;
    }


    @SuppressLint("MissingPermission")
    @Override
    public void onReceive(Context context, Intent intent) {
        updateUi(wifiManager.getScanResults());
    }

    private void updateUi(final List<ScanResult> scanResults) {

        try {
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    try {
                        if (onWifiResultArrived != null)

                            onWifiResultArrived.isInWifiRange(scanResults);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }

                }
            }, 1000);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void unregisterListner(Context context) {
        this.onWifiResultArrived = null;
        CAN_CALL_AGAIN = false;
    }

    public interface OnWifiResultArrived {
        void isInWifiRange(List<ScanResult> scanResults);
    }
}

广播类的用户或者是OnWifiResultArrived实现广播接收类接口。

代码语言:javascript
复制
WifiChecker checker = new WifiChecker(this);
checker.addListerForWifiCallback(this);

@Override
public void isInWifiRange(List<ScanResult> scanResults){
    //get your BSSID here
    scanResults.get(position).BSSID;
    //write your logic for checking weather it is connected or not
}

代码语言:javascript
复制
WifiChecker checker = new WifiChecker(this);
checker.addListerForWifiCallback(@Override
public void isInWifiRange(List<ScanResult> scanResults){
    //get your BSSID here
    scanResults.get(position).BSSID;
   //write your logic for checking weather it is connected or not
});
票数 4
EN

Stack Overflow用户

发布于 2018-07-31 06:54:00

要获得当前连接的WIFI网络的BSSID,请使用WiFiInfo类。

代码语言:javascript
复制
WifiManager wifiMan = (WifiManager) context.getSystemService(
                        Context.WIFI_SERVICE);
        WifiInfo wifiInfo = wifiMan.getConnectionInfo();

        String macAddr = wifiInfo.getMacAddress();
        String bssid = wifiInfo.getBSSID();
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51472789

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档