11

如何在 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

4

3 回答 3

13

Android 版本 9 (Pie) 更改需要(由用户)启用位置,否则即使您的应用程序具有正确的权限,对 getConnectioInfo() 的调用也会失败。这在Android 9 更改中有记录(摘录如下):


限制访问 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));
于 2019-01-30T17:16:09.813 回答
1

您可以使用位置权限访问您在 Android 8 中连接的 ssid wifi,但在 android 9 中您必须打开位置。在这里阅读更多: https ://developer.android.com/about/versions/pie/android-9.0-changes-all

于 2019-07-04T07:49:07.197 回答
1

这与权限有关....因为 API 级别 27 您需要ACCESS_FINE_LOCATIONACCESS_COARSE_LOCATION权限。您可能还需要Android 9(根据https://developer.android.com/guide/topics/connectivity/wifi-scanCHANGE_WIFI_STATE无论如何都要进行 wifi 扫描)

于 2018-10-26T09:44:41.457 回答