Java 通过WifiManager获取android设备的恒定mac地址时出错

Java 通过WifiManager获取android设备的恒定mac地址时出错,java,android,Java,Android,我正试图通过WifiManager获得使用Java的android设备的MacAddress public String getMacAdress(Context context){ WifiManager wifiManager=(WifiManager)context.getSystemService(Context.WIFI_SERVICE); String macAdress=wifiManager.getConnectionInfo().getMacAddress(

我正试图通过WifiManager获得使用Java的android设备的MacAddress

  public String getMacAdress(Context context){
    WifiManager wifiManager=(WifiManager)context.getSystemService(Context.WIFI_SERVICE);
    String macAdress=wifiManager.getConnectionInfo().getMacAddress();
    if(macAdress==null){
        macAdress="Device don't have mac address or wi-fi is disabled";
    }
    return  macAdress;
}
但它返回的是02:00:00:00:00的常量值。 我设置了以下权限:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET"/>


自API 23以来,
getMacAddress()
返回一个常量值,而不是实际的MAC地址。这是出于安全和隐私目的。如果您有较旧的设备,您将获得实际的MAC地址,前提是这些设备在您的
minSdkVersion
targetSdkVersion
范围内

从Android 6.0或更高版本开始,API将为您提供02:00:00:00:00的MAC地址。请参阅下文:

访问硬件标识符为用户提供更好的数据保护,从本版本开始,Android将删除 使用访问应用程序的设备本地硬件标识符 Wi-Fi和蓝牙API

WifiInfo.getMacAddress()BluetoothAdapter.getAddress()方法现在返回一个常量值02:00:00:00

请尝试以下代码:

public String getMacAddress() {
    try {
        List<NetworkInterface> ifaceList = Collections.list(NetworkInterface.getNetworkInterfaces());
        for (NetworkInterface iface : ifaceList) {
            if (iface == null) {
                continue;
            }
            if (!iface.getName().equalsIgnoreCase("wlan0")) {
                continue;
            }
            byte[] macBytes = iface.getHardwareAddress();
            if (macBytes == null) {
                return "";
            }
            StringBuilder macSb = new StringBuilder();
            for (byte bytes : macBytes) {
                macSb.append(String.format("%02X:", bytes));
            }
            if (macSb.length() == 0) {
                return "";
            }
            macSb.deleteCharAt(macSb.length() - 1);
            return macSb.toString();
        }
    } catch (Exception ex) {
        ex.printStackTrace();
    }
    return "";
}
公共字符串getMacAddress(){
试一试{
List ifaceList=Collections.List(NetworkInterface.getNetworkInterfaces());
用于(网络接口iface:ifaceList){
if(iface==null){
继续;
}
如果(!iface.getName().equalsIgnoreCase(“wlan0”)){
继续;
}
byte[]macBytes=iface.getHardwareAddress();
if(macBytes==null){
返回“”;
}
StringBuilder macSb=新的StringBuilder();
用于(字节:macBytes){
macSb.append(String.format(“%02X:”,字节));
}
如果(macSb.length()==0){
返回“”;
}
macSb.deleteCharAt(macSb.length()-1);
返回macSb.toString();
}
}捕获(例外情况除外){
例如printStackTrace();
}
返回“”;
}

您还期望什么?你是在真实设备上运行代码还是在模拟器上运行代码?代码没有问题。你在模拟器上得到这个
02:00:00:00:00。
吗?我在真实设备上运行。