如何在 Android 9.0(PIE) 中获取 WIFI SSID?
Posted
技术标签:
【中文标题】如何在 Android 9.0(PIE) 中获取 WIFI SSID?【英文标题】:How to get WIFI SSID in Android 9.0(PIE)? 【发布时间】:2019-03-31 00:55:58 【问题描述】:我的代码在 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
【问题讨论】:
【参考方案1】: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));
【讨论】:
我的 locnProviders 包含“被动”,即使我的位置被禁用。我认为应该排除它。 在运行 Android 9 的 Google Pixel 上,关闭“使用位置”,locnProviders.isEmpty() 返回 true。你在测试什么平台和安卓版本? 三星 Galaxy S9+ & Android 9【参考方案2】:这与权限有关....因为 API 级别 27,您需要 ACCESS_FINE_LOCATION
或 ACCESS_COARSE_LOCATION
权限。对于 Android 9,您可能还需要CHANGE_WIFI_STATE
(根据https://developer.android.com/guide/topics/connectivity/wifi-scan,无论如何都要进行 wifi 扫描)
【讨论】:
我已经尝试过了,但不工作,将 networkInfo.getExtraInfo() 设为 null 并将 wifiInfo.getSSID() 设为“您可以在具有位置权限的 Android 8 中访问您连接的 ssid wifi,但在 android 9 中您必须打开位置。 在这里阅读更多: https://developer.android.com/about/versions/pie/android-9.0-changes-all
【讨论】:
以上是关于如何在 Android 9.0(PIE) 中获取 WIFI SSID?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 Android Studio 不会在 Android Pie (9.0) 上运行应用程序?
多进程中的 Android Pie (9.0) WebView
下载管理器在 Android Pie 9.0 NetworkSecurityConfig 中不起作用:未指定网络安全配置,使用平台默认值