【问题标题】:How to get WIFI SSID in Android 9.0(PIE)?如何在 Android 9.0(PIE) 中获取 WIFI SSID?
【发布时间】:2019-03-31 00:55:58
【问题描述】:

如何在 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 android-wifi android-9.0-pie android-connectivitymanager networkinfo


    【解决方案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_LOCATIONACCESS_COARSE_LOCATION 权限。对于 Android 9,您可能还需要CHANGE_WIFI_STATE(根据https://developer.android.com/guide/topics/connectivity/wifi-scan,无论如何都要进行 wifi 扫描)

    【讨论】:

    • 我已经尝试过了,但不工作,将 networkInfo.getExtraInfo() 设为 null 并将 wifiInfo.getSSID() 设为“”。
    • 您是否专门向用户请求这些权限?
    • @AbhinavTiwari 从 Android 6 开始,您还必须明确要求用户提供这些权限(仅在清单文件中声明它们是不够的) - developer.android.com/training/permissions/requesting
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-30
      • 2021-10-10
      • 2021-02-05
      • 2015-06-26
      相关资源
      最近更新 更多