![]() |
直爽的柿子 · 2023中超联赛赛程表(时间+地点+对阵双方 ...· 4 周前 · |
![]() |
豪气的小摩托 · 时髦办|火遍亚洲的萝莉头像变学霸,小说都不敢这么写· 1 月前 · |
![]() |
谈吐大方的楼房 · 特兰西瓦尼亚问题_百度百科· 1 月前 · |
![]() |
发怒的洋葱 · 华为智选818焕新季· 1 月前 · |
![]() |
侠义非凡的高山 · 民国总统徐世昌,日记里的秘密· 1 年前 · |
当我的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();
我将返回字符串,而不是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"/>
这一切为什么要发生?我怎样才能得到实际的SSID?在建立连接之前,广播是否提前启动?还有什么我该听的广播吗?我只对WIFI连接感兴趣,对3G连接不感兴趣。
更新:我刚刚检查过,
wifiInfo.getBSSID()
返回null。
我在广播接收器中收听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 ()) {
}
我查过
netInfo.isConnected()
了。那我就可以用
WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
WifiInfo info = wifiManager.getConnectionInfo();
String ssid = info.getSSID();
更新
从Android8.0开始,我们将不会获得连接网络的SSID,除非启用了位置服务,并且您的应用程序拥有访问它的权限。
如果您不想制作广播接收器,那么就简单地尝试
WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo;
wifiInfo = wifiManager.getConnectionInfo();
if (wifiInfo.getSupplicantState() == SupplicantState.COMPLETED) {
ssid = wifiInfo.getSSID();
}
请记住,每次用户断开或连接到新的SSID或任何wifi状态更改时,都需要初始化WifiInfo,即
wifiInfo = wifiManager.getConnectionInfo();
。
从Android8.1 (API 27)开始,应用程序必须获得
ACCESS_COARSE_LOCATION
(或
ACCESS_FINE_LOCATION
)许可才能从
WifiInfo.getSSID()
或
WifiInfo.getBSSID()
获得结果。针对API 29或更高版本(Android10)的应用程序必须被授予
ACCESS_FINE_LOCATION
。
从
WifiManager.getConnectionInfo()
和
WifiManager.getScanResults()
获得结果也需要此权限,但尚不清楚这是8.1中的新特性还是以前需要的。
来源 :"BSSID/SSID可用于推断位置,因此对使用WifiManager.getConnectionInfo()请求的这些WifiInfo字段的访问要求具有与WifiManager.getScanResults()相同的位置权限。“
在Android8.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*/
这是@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)
}
如果您没有使用BroadcastReceiver,请检查
这
应答以获得使用
Context
的SSID
这是在Android Oreo 8.1.0上进行的测试。
显示空值的Android9SSID使用以下代码。
ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
if (networkInfo.isConnected()) {
WifiManager wifiManager = (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
wifiInfo.getSSID();
String name = networkInfo.getExtraInfo();
String ssid = wifiInfo.getSSID();
return ssid.replaceAll("^\"|\"$", "");
}
我找到了一个有趣的解决方案来获得当前连接的Wifi的SSID。您只需使用迭代
WifiManager.getConfiguredNetworks()
并找到具有特定
WifiInfo.getNetworkId()
的配置。
我的例子
在带有动作
WifiManager.NETWORK_STATE_CHANGED_ACTION
的广播接收器中,我从意图中获得当前连接状态
NetworkInfo nwInfo = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
nwInfo.getState()
如果
NetworkInfo.getState
等于
NetworkInfo.State.CONNECTED
,那么我可以得到当前的WifiInfo对象
WifiManager wifiManager = (WifiManager) getSystemService (Context.WIFI_SERVICE);
WifiInfo info = wifiManager.getConnectionInfo ();
在那之后
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;
}
非常重要的是,这种方法 不需要位置或位置执行
In API29重新设计了Wifi API,因此这个解决方案在Android 10. 中已经过时了。
在Kotlin中回答给予许可
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
private fun getCurrentNetworkDetail() {
val connManager =
context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val networkInfo = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI)
if (networkInfo.isConnected) {
val wifiManager =
context.getApplicationContext().getSystemService(Context.WIFI_SERVICE) as WifiManager
val connectionInfo = wifiManager.connectionInfo
if (connectionInfo != null && !TextUtils.isEmpty(connectionInfo.ssid)) {
Log.e("ssid", connectionInfo.ssid)
else{
Log.e("ssid", "No Connection")
![]() |
豪气的小摩托 · 时髦办|火遍亚洲的萝莉头像变学霸,小说都不敢这么写 1 月前 |
![]() |
谈吐大方的楼房 · 特兰西瓦尼亚问题_百度百科 1 月前 |
![]() |
发怒的洋葱 · 华为智选818焕新季 1 月前 |
![]() |
侠义非凡的高山 · 民国总统徐世昌,日记里的秘密 1 年前 |