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

时间:2018-10-26 09:35:43

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

如何在Android 9.0(PIE)中获取WIFI SSID?我的代码在android 8.1.0之前可以正常工作,但在android 9.0上却无法正常工作

Matrix matrix = new Matrix();
matrix.Translate(bitmap.Width / -2, bitmap.Height / -2, MatrixOrder.Append);
matrix.RotateAt(angle, new System.Drawing.Point(0, 0), MatrixOrder.Append);

matrix.Scale(2, 2, MatrixOrder.Append);

using (GraphicsPath graphicsPath = new GraphicsPath())

但是此代码在Android 9.0上不起作用

3 个答案:

答案 0 :(得分:2)

更改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));

答案 1 :(得分:0)

这与权限相关。...由于API级别为27,因此您需要Dimension cs = new Dimension(jlp.getWidth() - 1, jlp.getHeight() - 1); GrassPane gp = new GrassPane(); gp.setSize(cs); jlp.add(gp); gp.initializeDisplay(); jlp.setLayer(gp, 90); LobbyPane lp = new LobbyPane(this); lp.setSize(cs); lp.initializeDisplay(); lp.initializeComponents(); jlp.add(lp); jlp.setLayer(lp, 110); ACCESS_FINE_LOCATION权限。对于Android 9,您可能还需要ACCESS_COARSE_LOCATION(无论如何,https://developer.android.com/guide/topics/connectivity/wifi-scan都需要进行wifi扫描)

答案 2 :(得分:0)

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