如何解决 Android 上“无虚拟方法”错误的问题

xxv*_*rmv 5 java android android-wifi android-studio android-9.0-pie

我正在 android studio 中为 android Pie 编写一个应用程序。我想获取 wifi 信息。

    @RequiresApi(api = Build.VERSION_CODES.S)
    public String getData() {       
 
        String wifiDataTest;
        WifiInfo wifiInfo = wifiManager.getConnectionInfo();
        int frequency = wifiInfo.getFrequency();
        int ipAddress = wifiInfo.getIpAddress();
        int speed = wifiInfo.getLinkSpeed();
        String ssid = wifiInfo.getSSID();
        int wifiStandard = wifiInfo.getWifiStandard();

        wifiDataTest = "Frequency [MHz]: " + frequency + "\nIP address: " + ipAddress
                + "\nSpeed [Mbps]: " + speed + "\nSSID: " + ssid  + "\nWifi standard: " + wifiStandard;


        return "WIFI\n" + wifiDataTest;
    }
Run Code Online (Sandbox Code Playgroud)

withint wifiStandard = wifiInfo.getWifiStandard ();显示了错误:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.sensors, PID: 11040
    java.lang.NoSuchMethodError: No virtual method getWifiStandard()I in class Landroid/net/wifi/WifiInfo; or its super classes (declaration of 'android.net.wifi.WifiInfo' appears in /system/framework/framework.jar)
Run Code Online (Sandbox Code Playgroud)

我在任何地方都没有找到有关此类错误的信息。之前的一切都getWifiStandard ();运行良好。

Mou*_*ALI 1

您正在尝试运行包含getWifiStandard()仅在 Android 11 或更高版本上存在的方法的应用。

尝试这个 :

public String getData() {

        String wifiDataTest;
        WifiInfo wifiInfo = wifiManager.getConnectionInfo();
        int frequency = wifiInfo.getFrequency();
        int ipAddress = wifiInfo.getIpAddress();
        int speed = wifiInfo.getLinkSpeed();
        String ssid = wifiInfo.getSSID();
        String wifiStandard = "";
        
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.R) {
            wifiDataTest = "Frequency [MHz]: " + frequency + "\nIP address: " + ipAddress
                    + "\nSpeed [Mbps]: " + speed + "\nSSID: " + ssid + "\nWifi standard: " + wifiInfo.getWifiStandard();
        } else {
            if (wifiInfo.getLinkSpeed() <= 11) wifiStandard =  "802.b";
            else if (wifiInfo.getLinkSpeed() <= 54) wifiStandard =  "802.g";
            else if (wifiInfo.getLinkSpeed() <= 300) wifiStandard =  "802.11n";
            else if (wifiInfo.getLinkSpeed() <= 866.5) wifiStandard =  "802.11ac";
            
            wifiDataTest = "Frequency [MHz]: " + frequency + "\nIP address: " + ipAddress
                    + "\nSpeed [Mbps]: " + speed + "\nSSID: " + ssid + "\nWifi standard: " + wifiStandard;
        }
       
        return "WIFI\n" + wifiDataTest;
    }
Run Code Online (Sandbox Code Playgroud)