android - Android 9.0(PIE)如何获取WIFI SSID?

标签 android android-wifi android-9.0-pie android-connectivitymanager networkinfo

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/

相关文章:

android - 如何在 Android 中使用未知加密算法连接到 WiFi 网络?

android - 导出的 SQLite 数据库不是最新的

安卓 : Allow Cleartext http

java - 如何使用 AmazonSNSClient 避免 Android 9 中的应用程序崩溃?

安卓 WebView : detect scroll

android - 如何扫描未格式化的 NFC 标签

android - 将字符串从 android 发送到 visual basic 2010

android - Android Wifi P2P : failed to connect to/192. 168.49.1(端口1080):isConnected失败:ECONNREFUSED(连接被拒绝)

android - 无法在 Android 设备的/data/user/0 的子目录中捕获文件

java - 更新的 Android SDK 向我的应用程序添加了错误