您的位置:

Android获取IP详解

一、Android获取IP地址权限

在Android系统中,获取IP地址需要使用网络状态权限,可以通过以下代码获取网络状态权限:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />

其中,ACCESS_NETWORK_STATE是获取网络状态的权限,INTERNET是使用网络的权限。

二、Android获取IP

在Android系统中,可以通过以下代码获取IP:

public String getIPAddress(boolean useIPv4) {
    try {
        List<NetworkInterface> interfaces = Collections.list(NetworkInterface.getNetworkInterfaces());
        for (NetworkInterface intf : interfaces) {
            List<InetAddress> addrs = Collections.list(intf.getInetAddresses());
            for (InetAddress addr : addrs) {
                if (!addr.isLinkLocalAddress()) {
                    String sAddr = addr.getHostAddress();
                    boolean isIPv4 = InetAddressUtils.isIPv4Address(sAddr);
                    if (useIPv4) {
                        if (isIPv4)
                            return sAddr;
                    } else {
                        if (!isIPv4) {
                            int delim = sAddr.indexOf('%'); // 分离IPv6地址中的zone
                            return delim<0 ? sAddr.toUpperCase() : sAddr.substring(0, delim).toUpperCase();
                        }
                    }
                }
            }
        }
    } catch (Exception e) {
        Log.e("getIPAddress", e.toString());
    }
    return "";
}

其中,getNetworkInterfaces()方法获取网络接口列表,getInetAddresses()方法获取网络接口的IP地址列表。

三、Android获取OAID

OAID是一种由中国移动广告联盟提出的Android设备标识符,可以用于替代AndroidID等识别标识符,一些手机品牌已开放获取OAID的API。

获取OAID的方式如下所示:

import com.bun.miitmdid.core.JLibrary;

public class MainActivity extends AppCompatActivity {
    TextView tv_oaid;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tv_oaid = findViewById(R.id.tv_oaid);

        // 初始化OAID库
        JLibrary.InitEntry(this);

        // 获取OAID
        MiitHelper miitHelper = new MiitHelper(new MiitHelper.AppIdsUpdater() {
            @Override
            public void OnIdsAvalid(@NonNull final String ids) {
                tv_oaid.setText(ids);
            }
        });
        miitHelper.getDeviceIds(this);
    }
}

四、Android获取IP地址不准确的问题

在Android系统中,获取IP地址的方法可能会因为手机的网络模式而导致不准确的问题,可以通过以下代码规避问题:

public String getIPAddress() {
    WifiManager wm = (WifiManager) getApplicationContext().getSystemService(WIFI_SERVICE);
    String ip = Formatter.formatIpAddress(wm.getConnectionInfo().getIpAddress());
    return ip;
}

其中,WIFI_SERVICE是获取WIFI服务的系统服务,getConnectionInfo()方法获取WIFI连接信息,getIpAddress()方法获取IP地址。

五、Android获取IP和MAC地址

Android系统中,可以通过WifiManager类获取IP和MAC地址:

public String getIpAddress() {
    WifiManager wm = (WifiManager) getApplicationContext().getSystemService(WIFI_SERVICE);
    String ip = Formatter.formatIpAddress(wm.getConnectionInfo().getIpAddress());
    return ip;
}

public String getMacAddress() {
    WifiManager wm = (WifiManager) getApplicationContext().getSystemService(WIFI_SERVICE);
    return wm.getConnectionInfo().getMacAddress();
}

其中,getMacAddress()方法获取MAC地址。

六、Android获取IPv4和IPv6地址

Android系统中,可以通过以下代码分别获取IPv4和IPv6地址:

public String getIPv4Address() {
    try {
        List<NetworkInterface> interfaces = Collections.list(NetworkInterface.getNetworkInterfaces());
        for (NetworkInterface iface : interfaces) {
            List<InetAddress> addrs = Collections.list(iface.getInetAddresses());
            for (InetAddress addr : addrs) {
                if (!addr.isLoopbackAddress() && addr instanceof Inet4Address) {
                    return addr.getHostAddress();
                }
            }
        }
    } catch (Exception e) {
        Log.e("getIPv4Address", e.toString());
    }
    return "";
}

public String getIPv6Address() {
    try {
        List<NetworkInterface> interfaces = Collections.list(NetworkInterface.getNetworkInterfaces());
        for (NetworkInterface iface : interfaces) {
            List<InetAddress> addrs = Collections.list(iface.getInetAddresses());
            for (InetAddress addr : addrs) {
                if (!addr.isLoopbackAddress() && addr instanceof Inet6Address) {
                    return addr.getHostAddress();
                }
            }
        }
    } catch (Exception e) {
        Log.e("getIPv6Address", e.toString());
    }
    return "";
}

七、获取AndroidID

AndroidID是Android系统中的一个字符串,用于标识设备。它在设备首次启动时生成,并且无法更改。

获取AndroidID的方式如下所示:

public String getAndroidID() {
    String android_id = Settings.Secure.getString(getContentResolver(), Settings.Secure.ANDROID_ID);
    return android_id;
}

八、结语

以上就是Android获取IP的详细介绍,通过不同的方法可以获取不同的信息,根据实际需求选择相应的方式即可。