如何在Android 9.0(PIE)中获取WIFI SSID?

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() + "\"";
}

但是这段代码在安卓9.0上无法运行。

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还需要在设备上启用位置服务(在“设置”>“位置”下)。


在我的情况下,我调用以下函数(仅在运行Android 9+时)来检测是否启用了位置权限,然后再尝试读取WIFI SSID。

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 包含一个“被动”的,即使我的位置已禁用。我认为它应该被排除在外。 - Jks Liu
在运行Android 9的Google Pixel上,关闭“使用位置”后,locnProviders.isEmpty()返回true。您正在测试哪个平台和Android版本? - gOnZo
三星Galaxy S9+和Android 9 - Jks Liu

1

1

我已经尝试过这个,但是不起作用,获取networkInfo.getExtraInfo()为null,wifiInfo.getSSID()为“<未知ssid>”。 - Abhinav Tiwari
您是否特别要求用户授予这些权限? - John O'Reilly
1
@AbhinavTiwari 自从Android 6以后,你还必须明确地向用户请求这些权限(仅在清单文件中声明是不够的)- https://developer.android.com/training/permissions/requesting - John O'Reilly

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接