zmb*_*mbq 55 android ssid wifi
当我的Android设备连接到WIFI时,我正在尝试获取WIFI网络的SSID.
我注册了BroadcastReceiver android.net.wifi.supplicant.CONNECTION_CHANGE.当WIFI断开连接或重新连接时,我收到通知.不幸的是,我无法获得网络的SSID.
我正在使用以下代码来查找SSID:
WifiManager wifiManager = (WifiManager) context.getSystemService(context.WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
String ssid = wifiInfo.getSSID();
Run Code Online (Sandbox Code Playgroud)
而不是SSID,我得到了<unknown ssid>回来的字符串.
这些是清单中的权限(我添加了ACCESS_NETWORK_STATE只是为了检查,我实际上并不需要它)
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
Run Code Online (Sandbox Code Playgroud)
为什么会这样?我怎样才能获得实际的SSID?在建立连接之前,广播是否已提前播出?我应该听另一个广播吗?我只对WIFI连接感兴趣,而不是3G连接.
更新:我刚刚检查过,wifiInfo.getBSSID()返回null.
Eri*_*uff 90
我在广播接收器中监听WifiManager.NETWORK_STATE_CHANGED_ACTION
if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals (action)) {
NetworkInfo netInfo = intent.getParcelableExtra (WifiManager.EXTRA_NETWORK_INFO);
if (ConnectivityManager.TYPE_WIFI == netInfo.getType ()) {
Run Code Online (Sandbox Code Playgroud)
我检查netInfo.isConnected().然后我就可以使用了
WifiManager wifiManager = (WifiManager) getSystemService (Context.WIFI_SERVICE);
WifiInfo info = wifiManager.getConnectionInfo ();
String ssid = info.getSSID();
Run Code Online (Sandbox Code Playgroud)
UPDATE
从Android 8.0开始,除非打开GPS,否则我们不会获得连接网络的SSID.
mik*_*e47 46
从Android 8.1(API 27)开始,必须为应用授予ACCESS_COARSE_LOCATION(或ACCESS_FINE_LOCATION)权限才能从WifiInfo.getSSID()或获取结果WifiInfo.getBSSID().
获得结果也需要此权限WifiManager.getConnectionInfo(),WifiManager.getScanResults()尽管不清楚这是8.1中的新内容还是之前需要的.
来源:"BSSID/SSID可用于推断位置,因此需要相同的位置权限才能访问使用WifiManager.getConnectionInfo()请求的WifiInfo字段,如WifiManager.getScanResults()."
Pra*_*nav 30
WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo;
wifiInfo = wifiManager.getConnectionInfo();
if (wifiInfo.getSupplicantState() == SupplicantState.COMPLETED) {
ssid = wifiInfo.getSSID();
}
Run Code Online (Sandbox Code Playgroud)
记住,每当用户断开连接或连接到新的SSID或任何wifi状态更改时,您需要初始化WifiInfo即 wifiInfo = wifiManager.getConnectionInfo();
Tom*_*son 13
我找到了一个有趣的解决方案来获取当前连接的Wifi AP的SSID。您只需要使用迭代WifiManager.getConfiguredNetworks()并找到特定的配置WifiInfo.getNetworkId()
我的例子
在带有操作的广播接收器中,WifiManager.NETWORK_STATE_CHANGED_ACTION
我从意图中获取当前连接状态
NetworkInfo nwInfo = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
nwInfo.getState()
Run Code Online (Sandbox Code Playgroud)
如果NetworkInfo.getState等于,NetworkInfo.State.CONNECTED那么我可以获得当前的WifiInfo对象
WifiManager wifiManager = (WifiManager) getSystemService (Context.WIFI_SERVICE);
WifiInfo info = wifiManager.getConnectionInfo ();
Run Code Online (Sandbox Code Playgroud)
在那之后
public String findSSIDForWifiInfo(WifiManager manager, WifiInfo wifiInfo) {
List<WifiConfiguration> listOfConfigurations = manager.getConfiguredNetworks();
for (int index = 0; index < listOfConfigurations.size(); index++) {
WifiConfiguration configuration = listOfConfigurations.get(index);
if (configuration.networkId == wifiInfo.getNetworkId()) {
return configuration.SSID;
}
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
而且非常重要的一点是,该方法不需要位置信息或位置信息
在Android 8.1中,必须打开“位置”以获取SSID,否则,您可以获取连接状态,但不能获取SSID
WifiManager wifiManager = (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo = null;
if (wifiManager != null)
wifiInfo = wifiManager.getConnectionInfo();
String ssid = null;
if (wifiInfo != null)
ssid = wifiInfo.getSSID(); /*you will get SSID <unknown ssid> if location turned off*/
Run Code Online (Sandbox Code Playgroud)
这是@EricWoodruff 给出的答案的后续内容。
您可以使用netInfo来getExtraInfo()获取 wifi SSID。
if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals (action)) {
NetworkInfo netInfo = intent.getParcelableExtra (WifiManager.EXTRA_NETWORK_INFO);
if (ConnectivityManager.TYPE_WIFI == netInfo.getType ()) {
String ssid = info.getExtraInfo()
Log.d(TAG, "WiFi SSID: " + ssid)
}
}
Run Code Online (Sandbox Code Playgroud)
如果您不使用 BroadcastReceiver,请检查此答案以使用以下方式获取 SSIDContext
这是在 Android Oreo 8.1.0 上测试的
| 归档时间: |
|
| 查看次数: |
84469 次 |
| 最近记录: |