Android 9.0(PIE)如何获取WIFI SSID?我的代码在 android 版本 8.1.0 之前工作正常,但它不适用于 Android 9.0
ConnectivityManager connManager = (ConnectivityManager) activity.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
if (networkInfo.isConnected()) {
WifiManager wifiManager = (WifiManager) activity.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
wifiInfo.getSSID();
String name = networkInfo.getExtraInfo();
String ssid = "\"" + wifiInfo.getSSID() + "\"";
}
但是这段代码不适用于Android 9.0
最佳答案
Android 版本 9 (Pie) 更改需要启用位置(由用户),否则即使您的应用具有正确的权限,对 getConnectioInfo() 的调用也会失败。 这记录在 Android 9 changes 中(以下摘录):
限制访问 Wi-Fi 位置和连接信息
在Android 9中,应用进行Wi-Fi扫描的权限要求比之前的版本更加严格。有关详细信息,请参阅 Wi-Fi 扫描限制。
类似的限制也适用于 getConnectionInfo() 方法,该方法返回描述当前 Wi-Fi 连接的 WifiInfo 对象。如果调用应用程序具有以下权限,您只能使用此对象的方法来检索 SSID 和 BSSID 值:
- ACCESS_FINE_LOCATION 或 ACCESS_COARSE_LOCATION
- ACCESS_WIFI_STATE
检索 SSID 或 BSSID 还需要在设备上启用位置服务(在“设置”>“位置”下)。
在我的例子中,我在尝试读取 WIFI SSID 之前调用下面的函数(仅当在 Android 9+ 上运行时)来检测是否启用了位置。
public static boolean isLocnEnabled(Context context) {
List locnProviders = null;
try {
LocationManager lm =(LocationManager) context.getApplicationContext().getSystemService(Activity.LOCATION_SERVICE);
locnProviders = lm.getProviders(true);
return (locnProviders.size() != 0);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (BuildConfig.DEBUG) {
if ((locnProviders == null) || (locnProviders.isEmpty()))
Log.d(TAG, "Location services disabled");
else
Log.d(TAG, "locnProviders: " + locnProviders.toString());
}
}
return(false);
}
如果位置没有启用,我会弹出一个对话框,说它是必需的,并允许用户跳转到位置设置页面(见下面的代码):
context.startActivity(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS));
关于android - Android 9.0(PIE)如何获取WIFI SSID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53005755/