On Oreo (8.1.0) not getting the correct Wifi SSID. It's showing though it is connected to a wifi with SSID

前端 未结 7 1081
名媛妹妹
名媛妹妹 2021-01-02 03:02

I need to check the current connected wifi SSID on android. I checked with Nokia 6 and OnePlus 5 with respectively Oreo 8.1.0 and Oreo 8.0. Other phones with different OS v

7条回答
  •  抹茶落季
    2021-01-02 03:04

    There are different approaches how you can get the WIFI information (such as SSID) in android.

    Some of them already listed here, for example WifiManager service.

    But for OP question:

    Is there anything wrong with my code?

    No, the problem is not in your code. The main reason for the unexpected behavior, is because of the security patch of the last android releases.

    Before the patch (or any device that didn't get an update), the hackers could steal sensitive information that was leaked through the wifi info.

    For example the hackers could obtain the device geolocation, that should be accessible only with the Dangerous Permission LOCATION, that should be requested at runtime and can be revoked at any moment. But in the other hand - the WifiInfo is accessible only with the Normal Permission android.permission.ACCESS_WIFI_STATE which is granted at install time and cannot be revoked. That way, hackers could bypass the permission mechanism and access the data from dangerous permission using only normal permission.

    The issue was reported and tracked by CVE-2018-9489, you can read more about it here: Sensitive information expose via WIFI

    So the reason why you having those problems is because now android blocks the sensitive wifi info, unless the app holds the ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION.

    So, if you request those permissions explicitly (and allowed by the user), your code should work fine.

    For example:

    Manifest

    
    
    

    Activity

    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);
            }
        }
    }
    

提交回复
热议问题