Android开发获取手机内网IP地址与外网IP地址的详细方法与源码实例

在进行Android应用开发过程中,有时候会遇到获取当前Android设备所使用的网络IP地址的场景,有时候需要本地的网络IP地址,即局域网地址,更多的时候是需要当前网络的真实的对外IP地址,即真实的网络地址,如大数据分析时往往需要Android设备上传本地的外网地址。本文对各种IP地址的获取进行了总结。

首先用大家比较熟悉的电脑端局域网地址和外网地址的获取方式对比一下:(1)、电脑端局域网地址获取方式,可以通过在终端命令行输入ipconfig进行查看,如下图IPv地址标识的就是本机的局域网地址:

(2)、电脑端外网地址的获取方式,可以通过在浏览器里面查询,如在百度页面搜索“IP地址查询”查看本地外网地址,如下图是笔者本机的外网地址:

本地IP地址有两种情况:一是wifi下,二是移动网络下

wifi下获取本地局域网IP地址

// wifi下获取本地网络IP地址(局域网地址)
public static String getLocalIPAddress(Context context) {
    WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
    if (wifiManager != null) {
      @SuppressLint("MissingPermission") WifiInfo wifiInfo = wifiManager.getConnectionInfo();
      String ipAddress = intIP2StringIP(wifiInfo.getIpAddress());
      return ipAddress;
    }
    return "";
  }

移动网络获取网络IP地址

// 获取有限网IP
  public static String getHostIp() {
    try {
      for (Enumeration<NetworkInterface> en = NetworkInterface
          .getNetworkInterfaces(); en.hasMoreElements(); ) {
        NetworkInterface intf = en.nextElement();
        for (Enumeration<InetAddress> enumIpAddr = intf
            .getInetAddresses(); enumIpAddr.hasMoreElements(); ) {
          InetAddress inetAddress = enumIpAddr.nextElement();
          if (!inetAddress.isLoopbackAddress()
              && inetAddress instanceof Inet4Address) {
            return inetAddress.getHostAddress();
          }
        }
      }
    } catch (Exception ex) {
    }
    return "0.0.0.0";
  }

获取外网地址非移动网络

获取Android设备的外网地址,即当前Wifi网络真正的网络地址,也即是网络运营商分配给用户的IP地址。

获取外网地址的原理:通过访问外网网站,从网站返回的数据中解析本地的IP地址。PS:在本地是无法获取到外网的IP地址的,需要借助服务器。

/**
 * 获取外网ip地址(非本地局域网地址)的方法
 */
public static String getOutNetIP() {
    String ipAddress = "";
    try {
      String address = "http://ip.taobao.com/service/getIpInfo2.php?ip=myip";
      URL url = new URL(address);
      HttpURLConnection connection = (HttpURLConnection) url
          .openConnection();
      connection.setUseCaches(false);
      connection.setRequestMethod("GET");
      connection.setRequestProperty("user-agent",
          "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.7 Safari/537.36"); //设置浏览器ua 保证不出现503
      if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
        InputStream in = connection.getInputStream();
        // 将流转化为字符串
        BufferedReader reader = new BufferedReader(
            new InputStreamReader(in));
        String tmpString;
        StringBuilder retJSON = new StringBuilder();
        while ((tmpString = reader.readLine()) != null) {
          retJSON.append(tmpString + "\n");
        }
        JSONObject jsonObject = new JSONObject(retJSON.toString());
        String code = jsonObject.getString("code");
        Log.e(TAG, "提示:" +retJSON.toString());
        if (code.equals("0")) {
          JSONObject data = jsonObject.getJSONObject("data");
          ipAddress = data.getString("ip")/* + "(" + data.getString("country")
              + data.getString("area") + "区"
              + data.getString("region") + data.getString("city")
              + data.getString("isp") + ")"*/;
          Log.e(TAG, "您的IP地址是:" + ipAddress);
        } else {
          Log.e(TAG, "IP接口异常,无法获取IP地址!");
        }
      } else {
        Log.e(TAG, "网络连接异常,无法获取IP地址!");
      }
    } catch (Exception e) {
      Log.e(TAG, "获取IP地址时出现异常,异常信息是:" + e.toString());
    }
    return ipAddress;
  }

根据网络类型集成方法

@SuppressLint("MissingPermission")
  public static String getIpAddress(Context context) {
    if (context == null) {
      return "";
    }
    ConnectivityManager conManager = (ConnectivityManager) context
        .getSystemService(Context.CONNECTIVITY_SERVICE);
    try {
      NetworkInfo info = conManager.getActiveNetworkInfo();
      if (info != null && info.isConnected()) {
        // 3/4g网络
        if (info.getType() == ConnectivityManager.TYPE_MOBILE) {
          return getHostIp();
        } else if (info.getType() == ConnectivityManager.TYPE_WIFI) {
//          return getLocalIPAddress(context); // 局域网地址
          return getOutNetIP(); // 外网地址
        } else if (info.getType() == ConnectivityManager.TYPE_ETHERNET) {
          // 以太网有限网络
          return getHostIp();
        }
      }
    } catch (Exception e) {
      return "";
    }
    return "";
  }

下面在为大家提供两个获取手机IP地址的实例源码

获取内网IP地址

  /**
   * 获取ip地址
   * @return
   */
  public static String getHostIP() {

    String hostIp = null;
    try {
      Enumeration nis = NetworkInterface.getNetworkInterfaces();
      InetAddress ia = null;
      while (nis.hasMoreElements()) {
        NetworkInterface ni = (NetworkInterface) nis.nextElement();
        Enumeration<InetAddress> ias = ni.getInetAddresses();
        while (ias.hasMoreElements()) {
          ia = ias.nextElement();
          if (ia instanceof Inet6Address) {
            continue;// skip ipv6
          }
          String ip = ia.getHostAddress();
          if (!"127.0.0.1".equals(ip)) {
            hostIp = ia.getHostAddress();
            break;
          }
        }
      }
    } catch (SocketException e) {
      Log.i("yao", "SocketException");
      e.printStackTrace();
    }
    return hostIp;

  }

获取外网IP地址

/**
	 * 获取IP地址
	 * @return
   */
	public static String GetNetIp() {
		URL infoUrl = null;
		InputStream inStream = null;
		String line = "";
		try {
			infoUrl = new URL("http://pv.sohu.com/cityjson?ie=utf-8");
			URLConnection connection = infoUrl.openConnection();
			HttpURLConnection httpConnection = (HttpURLConnection) connection;
			int responseCode = httpConnection.getResponseCode();
			if (responseCode == HttpURLConnection.HTTP_OK) {
				inStream = httpConnection.getInputStream();
				BufferedReader reader = new BufferedReader(new InputStreamReader(inStream, "utf-8"));
				StringBuilder strber = new StringBuilder();
				while ((line = reader.readLine()) != null)
					strber.append(line + "\n");
				inStream.close();
				// 从反馈的结果中提取出IP地址
				int start = strber.indexOf("{");
				int end = strber.indexOf("}");
				String json = strber.substring(start, end + 1);
				if (json != null) {
					try {
						JSONObject jsonObject = new JSONObject(json);
						line = jsonObject.optString("cip");
					} catch (JSONException e) {
						e.printStackTrace();
					}
				}
				return line;
			}
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return line;
	}

本文主要讲解了Android获取手机内网IP地址与外网IP地址的详细方法与源码实例,更多关于Android开发知识与技巧请查看下面的相关链接

(0)

相关推荐

  • Android实现IP地址输入框的方法示例代码

    前言 本文主要给大家介绍了关于Android实现IP地址格式输入框的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 实现效果图: 解决方案: 1.添加4个EditText和三个TextView 2.设置TextView内容为点,且靠下方.设置EditText背景和边框为透明 3.为每个EditText添加监听事件 示例代码 Layout: <LinearLayout android:layout_width="match_parent" android

  • Android 获取IP地址的实现方法

    Android 获取IP地址 最近做项目,有一个需求是Android设备获取当前IP的功能,经过一番查询资料解决了,记录下实现方法. 1.使用WIFI 首先设置用户权限 <uses-permission Android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission> <uses-permission android:name="android.permission.CH

  • android实现获取有线和无线Ip地址的方法

    本文实例讲述了android实现获取有线和无线Ip地址的方法.分享给大家供大家参考.具体如下: 做android的开发时,遇到了获取有线ip地址的问题.不多说 上代码! for (Enumeration<NetworkInterface> en = NetworkInterface .getNetworkInterfaces(); en.hasMoreElements();) { NetworkInterface intf = en.nextElement(); if (intf.getNam

  • Android开发实现在Wifi下获取本地IP地址的方法

    本文实例讲述了Android开发实现在Wifi下获取本地IP地址的方法.分享给大家供大家参考,具体如下: 代码核心介绍: WifiManager类提供了对设备Wifi功能的管理,包括Wifi开关的打开和关闭,IP地址获取等等,早期的Android版本甚至支持对于IP的设置.在这里仅介绍其简单的一个小应用--获取IP地址. 首先先添加Uses-Permission:CHANGE_WIFI_STATE,WAKE_LOCK和ACCESS_WIFI_STATE.代码如下(AndroidManifest.

  • Android手机获取IP地址的两种方法

    1.使用WIFI 首先设置用户权限 复制代码 代码如下: <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>  <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>  <

  • android 获取本机的IP地址和mac物理地址的实现方法

    获取本机IP地址 public String getLocalIpAddress() { WifiManager wifiManager = (WifiManager) getSystemService(android.content.Context.WIFI_SERVICE); WifiInfo wifiInfo = wifiManager.getConnectionInfo(); int ipAddress = wifiInfo.getIpAddress(); try { return In

  • Android中使用adb命令通过IP地址连接手机

    前提:已经通过USB设备线连接过电脑,并成功安装驱动. adb连接手机进行调试有两种方式,一种是使用USB线,另一种是使用无线WiFi. 第一种  使用USB线连接 1. 在手机上启用USB调试 2. 打开DOS命令窗口,输入 cd D:\Android\sdk\platform-tools 回车 3. 再输入adb devices,此时可以看到自己连接的设备. PS:无法看到自己设备时,查看手机USB调试是否打开:PC端是否安装手机驱动. 第二种  使用无线WiFi连接 首先先了解一点底层的知

  • Android 判断ip地址合法实现代码

    Android 判断ip地址合法实现代码 昨天,我在网上找了一下判断文本框内的字符串是否是合法的ip地址,自己想到了正则表达式,可是自己对这个却不熟,所以在网上查找了一些资料,最后终于是做出来了. 具体的代码很简单, public boolean isIP(String addr) { if(addr.length() < 7 || addr.length() > 15 || "".equals(addr)) { return false; } /** * 判断IP格式和范

  • Android开发准确获取手机IP地址的两种方式

    最近看了好多网上获取IP地址的例子,发现好多都不完全准确,这里我写一下获取ip地址的两种方式. 比如微信支付,后台在做接口的时候,要求App端传入IP地址,我们需要判断是网络环境,WI-FI还是3G,所以需要获取这两种环境的ip地址. 第一步:首先是判断网络环境: String ip; ConnectivityManager conMann = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE); N

  • Android获得设备状态信息、Mac地址、IP地址的方法

    前言 在APP开发时,经常会遇到要获取手机状态信息的场景,像升级时获取版本号,像发生异常时要收集手机信息等等.有些软件还要根据Mac地址来判定当前用户以前是否登录过.下面将一一介绍获取这些手机状态信息的方法. 1 通过build获取手机硬件信息 运用反射获取Build信息,然后从build中得到对应字段的值.这种情况适用于获取所有的build信息. 或者直接调用Build类直接拿里面的字段名,如:android.os.Build.MODEL; // 手机型号 .这是为了获取单独某个手机信息的方法

随机推荐