如何获取所有已连接网络的 BSSID?
how to get BSSID of all connected network?
我使用了下面的代码,但它运行良好,但几个月后我得到的结果是 any 而不是 BSSID 价值。这是我的代码。请指导我任何其他替代方式。
@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);
}
}
我也遇到了同样的问题。我在广播接收器的帮助下解决了它,并围绕它构建了我自己的逻辑。
广播接收器class,确保提供的权限ACCESS_WIFI_STATE和CHANGE_WIFI_STATE清单。
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);
}
}
广播用户class
实现广播接收器class接口即OnWifiResultArrived
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
}
或
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
});
我找到了一些解决方案,为什么我在 getConfiguredNetworks() api 中得到 any 或 null 字符串 android。背后的原因是,如果我们在某些情况下具有相同的 SSID 和相同的密码,它将作为 any 或 null 字符串发送。所以 getConfiguredNetworks() 在您尝试连接相同的 ssid 时不是正确的方法。所以使用 getScanResults() Api 而不是 getConfiguredNetworks()。经过一些自己的研究,我发现了它。仅当您获得具有 相同 ssid 和密码 的 AP 列表时才会出现此问题。使用扫描结果并 add wifi 配置中的网络然后连接它,但此方法在 API 级别 26 中已弃用。所以它不会从 api 级别 26 开始工作。 reference link
//
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;
}
}
要获取当前连接的 WIFI 网络的 BSSID,请使用 WiFiInfo class。
WifiManager wifiMan = (WifiManager) context.getSystemService(
Context.WIFI_SERVICE);
WifiInfo wifiInfo = wifiMan.getConnectionInfo();
String macAddr = wifiInfo.getMacAddress();
String bssid = wifiInfo.getBSSID();
我使用了下面的代码,但它运行良好,但几个月后我得到的结果是 any 而不是 BSSID 价值。这是我的代码。请指导我任何其他替代方式。
@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);
}
}
我也遇到了同样的问题。我在广播接收器的帮助下解决了它,并围绕它构建了我自己的逻辑。
广播接收器class,确保提供的权限ACCESS_WIFI_STATE和CHANGE_WIFI_STATE清单。
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);
}
}
广播用户class 实现广播接收器class接口即OnWifiResultArrived
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
}
或
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
});
我找到了一些解决方案,为什么我在 getConfiguredNetworks() api 中得到 any 或 null 字符串 android。背后的原因是,如果我们在某些情况下具有相同的 SSID 和相同的密码,它将作为 any 或 null 字符串发送。所以 getConfiguredNetworks() 在您尝试连接相同的 ssid 时不是正确的方法。所以使用 getScanResults() Api 而不是 getConfiguredNetworks()。经过一些自己的研究,我发现了它。仅当您获得具有 相同 ssid 和密码 的 AP 列表时才会出现此问题。使用扫描结果并 add wifi 配置中的网络然后连接它,但此方法在 API 级别 26 中已弃用。所以它不会从 api 级别 26 开始工作。 reference link
//
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;
}
}
要获取当前连接的 WIFI 网络的 BSSID,请使用 WiFiInfo class。
WifiManager wifiMan = (WifiManager) context.getSystemService(
Context.WIFI_SERVICE);
WifiInfo wifiInfo = wifiMan.getConnectionInfo();
String macAddr = wifiInfo.getMacAddress();
String bssid = wifiInfo.getBSSID();