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

【讨论】:

以上是关于如何在 Android 9.0(PIE) 中获取 WIFI SSID?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Android Studio 不会在 Android Pie (9.0) 上运行应用程序?

多进程中的 Android Pie (9.0) WebView

Android Pie 9.0 将用户带到通知中心

下载管理器在 Android Pie 9.0 NetworkSecurityConfig 中不起作用:未指定网络安全配置,使用平台默认值

安卓9.0内测的背后,是上万App开发者半年来的适配优化

如何在 Android Pie 中获取 pdf 文件的实际文件路径? [复制]