在Oreo(8.1.0)上没有获得正确的Wifi SSID.虽然它连接到带有SSID的wifi,但它显示<unknown ssid>

Zim*_*Zim 10 android ssid wifi android-8.0-oreo

我需要检查android上当前连接的wifi SSID.我分别用诺基亚6和OnePlus 5检查了Oreo 8.1.0和Oreo 8.0.其他具有不同操作系统版本的手机正常使用此代码.我的代码有什么问题吗?

private WifiInfo wifiInfo;
private String ssid = "";
private WifiManager wifiManager;

private boolean getWifiStatus() {
    wifiManager= (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
    wifiInfo = wifiManager.getConnectionInfo();
    ssid = "";
    ssid = wifiInfo.getSSID();
    ConnectivityManager cm =
            (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
    boolean isWiFi = false;
    if(activeNetwork != null){
        isWiFi = activeNetwork.getType() == ConnectivityManager.TYPE_WIFI;
    }

    Log.d(TAG, "getWifiStatus: " + ssid);
    if(ssid.contains("TripleMZim") && wifiManager.isWifiEnabled() && isWiFi ){
        return true;
    }
    else{
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

清单文件中的权限:

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>
Run Code Online (Sandbox Code Playgroud)

Nik*_*tin 14

如何在android中获取WIFI信息(如SSID)有不同的方法.

其中一些已在上面列出,例如WifiManager服务.

但对于OP问题:

我的代码有什么问题吗?

不,问题不在您的代码中. 出现意外行为的主要原因是因为上一次安卓发布的安全补丁.

在修补程序(或任何未获得更新的设备)之前,黑客可以窃取通过wifi信息泄露的敏感信息.

例如,黑客可以获得设备地理位置,该地理位置应该只能通过危险许可 位置访问,该位置应该在运行时请求并且可以随时撤销.但另一方面 - WifiInfo只能在安装时授予的普通权限 才能访问,android.permission.ACCESS_WIFI_STATE并且无法撤销.这样,黑客可以完全绕过权限机制,并仅使用正常权限从危险权限访问数据.

该问题已被报告和跟踪CVE-2018-9489,您可以在此处阅读更多相关信息:通过WIFI公开敏感信息

所以你有这些问题的原因是因为现在android阻止敏感的wifi信息,除非应用程序持有ACCESS_COARSE_LOCATIONACCESS_FINE_LOCATION.

因此,如果您明确地(并且允许用户)请求这些权限,您的代码应该可以正常工作.

例如:

表现

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
Run Code Online (Sandbox Code Playgroud)

活动

private static final int LOCATION = 1;
protected void onStart() {
   super.onStart();
   //Assume you want to read the SSID when the activity is started
   tryToReadSSID();
}

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    if(grantResults[0] == PackageManager.PERMISSION_GRANTED && requestCode == LOCATION){
        //User allowed the location and you can read it now
        tryToReadSSID();
    }
}

private void tryToReadSSID() {
    //If requested permission isn't Granted yet
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        //Request permission from user
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, LOCATION);
    }else{//Permission already granted 
        WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(WIFI_SERVICE);
        WifiInfo wifiInfo = wifiManager.getConnectionInfo();
        if(wifiInfo.getSupplicantState() == SupplicantState.COMPLETED){
            String ssid = wifiInfo.getSSID();//Here you can access your SSID
            System.out.println(ssid);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


beh*_*lit 9

Oreo 8.1+设备需要启用粗略位置运行时权限以及位置服务才能检索连接的SSID,因为它可以推断用户位置.

更多信息请点击此处

这与此有关


Yas*_*yan 9

在Android Oreo中,你可以ConnectivityManager用来了解你的wifi SSID.

允许

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
Run Code Online (Sandbox Code Playgroud)

获取SSID的代码

ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = cm.getActiveNetworkInfo();
if (info != null && info.isConnected()) {
    String ssid = info.getExtraInfo();
    Log.d(TAG, "WiFi SSID: " + ssid);
}
Run Code Online (Sandbox Code Playgroud)

这是在Android Oreo 8.1.0中测试的.您将获得带有双引号的SSID.

  • @WahibUlHaq启用GPS并设置位置权限后,在Android Pie 9.0事件上不起作用。.在Pixel XL(第一代)上测试 (2认同)