zoukankan      html  css  js  c++  java
  • Android获取本机IPv4地址

    获取本机IPv4地址可分两种情况,一种是WiFi已开启,一种是蜂窝移动数据已开启

    1、WiFi已开启

    WiFi开启的情况下,通过WiFi获取本机IP地址,如果仅仅打开WiFi,但并未接入网络,则IP地址可认为是0.0.0.0
    如果已经接入网络,则可以通过如下方式获取IPv4地址。

    // 获取WiFi服务
    WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
    // 判断WiFi是否开启
    WifiInfo wifiInfo = wifiManager.getConnectionInfo();
    int ipAddress = wifiInfo.getIpAddress();
    String ip = (ipAddress & 0xFF) + "." +
                    ((ipAddress >> 8) & 0xFF) + "." +
                    ((ipAddress >> 16) & 0xFF) + "." +
                    (ipAddress >> 24 & 0xFF);
    

    2、蜂窝移动数据已开启

    蜂窝移动数据开启的情况下可以通过如下方式获取IPv4地址。

    try {
    	NetworkInterface networkInterface;
    	InetAddress inetAddress;
    	for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements(); ) {
    		networkInterface = en.nextElement();
    		for (Enumeration<InetAddress> enumIpAddr = networkInterface.getInetAddresses(); enumIpAddr.hasMoreElements(); ) {
    			inetAddress = enumIpAddr.nextElement();
    			if (!inetAddress.isLoopbackAddress() && !inetAddress.isLinkLocalAddress()) {
    				String ip = inetAddress.getHostAddress();
    			}
    		}
    	}
    } catch (SocketException ex) {
    	ex.printStackTrace();
    }
    

    3、封装为工具类

    可以将以上两种方式封装为一个工具类IPUtils,由工具类自动判断网络类型并调用相应的方法,最终返回一个IPv4地址。
    完整代码如下所示。

    • IPUtils.java
    import android.content.Context;
    import android.net.wifi.WifiInfo;
    import android.net.wifi.WifiManager;
    
    import java.net.InetAddress;
    import java.net.NetworkInterface;
    import java.net.SocketException;
    import java.util.Enumeration;
    
    /**
     * =======================================================
     * 版权:Copyright LiYing 2015-2016. All rights reserved.
     * 作者:liying - liruoer2008@yeah.net
     * 日期:2016/12/19 19:43
     * 版本:1.0
     * 描述:IP地址工具类
     * 备注:
     * =======================================================
     */
    public class IPUtils {
    
        /**
         * 获取本机IPv4地址
         *
         * @param context
         * @return 本机IPv4地址;null:无网络连接
         */
        public static String getIpAddress(Context context) {
            // 获取WiFi服务
            WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
            // 判断WiFi是否开启
            if (wifiManager.isWifiEnabled()) {
                // 已经开启了WiFi
                WifiInfo wifiInfo = wifiManager.getConnectionInfo();
                int ipAddress = wifiInfo.getIpAddress();
                String ip = intToIp(ipAddress);
                return ip;
            } else {
                // 未开启WiFi
                return getIpAddress();
            }
        }
    
        private static String intToIp(int ipAddress) {
            return (ipAddress & 0xFF) + "." +
                    ((ipAddress >> 8) & 0xFF) + "." +
                    ((ipAddress >> 16) & 0xFF) + "." +
                    (ipAddress >> 24 & 0xFF);
        }
    
        /**
         * 获取本机IPv4地址
         *
         * @return 本机IPv4地址;null:无网络连接
         */
        private static String getIpAddress() {
            try {
                NetworkInterface networkInterface;
                InetAddress inetAddress;
                for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements(); ) {
                    networkInterface = en.nextElement();
                    for (Enumeration<InetAddress> enumIpAddr = networkInterface.getInetAddresses(); enumIpAddr.hasMoreElements(); ) {
                        inetAddress = enumIpAddr.nextElement();
                        if (!inetAddress.isLoopbackAddress() && !inetAddress.isLinkLocalAddress()) {
                            return inetAddress.getHostAddress();
                        }
                    }
                }
                return null;
            } catch (SocketException ex) {
                ex.printStackTrace();
                return null;
            }
        }
    }
    

    之后,只需要在需要得到IPv4地址的位置调用IPUtils.getIpAddress(Context context)即可。

    最后,别忘了在AndroidManifest.xml文件中声明需要的权限,如下。

    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    
  • 相关阅读:
    R语言:随机抽样(sample函数)
    SNP (Single Nucleotide Polymorphism), SNV ( single nucleotide variants ) , Indel (insertion-deletion) 的区别
    剑指offer五十六之删除链表中重复的结点
    剑指offer五十五之链表中环的入口结点
    剑指offer五十四之字符流中第一个不重复的字符
    剑指offer五十三之表示数值的字符串
    剑指offer五十二之正则表达式匹配
    剑指offer五十一之构建乘积数组
    求游戏晋级花费的宝石的期望
    剑指offer五十一之构建乘积数组
  • 原文地址:https://www.cnblogs.com/duduhuo/p/6200614.html
Copyright © 2011-2022 走看看