• 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"/>
    
  • 相关阅读:
    asp数据查询及数据筛选
    数据链接(无源方式)
    HTML5 Input 类型
    PS调出米黄色复古柔和外景人物照
    PS调出清新淡雅外景女生背影照
    PS提亮户外儿童照
    PS制作恐怖逼真滴血文字
    ps昏暗室内照片调成暖色光亮效果
    PS滤镜制作下雨照片特效
    PS滤镜给城市夜空照片添加满天星
  • 原文地址:https://www.cnblogs.com/duduhuo/p/6200614.html
Copyright © 2020-2023  润新知