Android开发获取手机内网IP地址与外网IP地址的详细方法与源码实例
时间:2022-07-27
本文章向大家介绍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地址的详细方法与源码实例
- 挑战数据结构和算法面试题——最大间隔
- 一则orabbix报警的分析(r6笔记第65天)
- 中科院计算所开源深度文本匹配开源工具 MatchZoo
- 简单易学的机器学习算法——线性回归(1)
- 当主键碰到NULL(r6笔记第64天)
- 记一次dg故障的处理总结(r6笔记第63天)
- Java企业面试——Javaweb
- Linux下/var/spool/clientmqueue空间不足的解决(r6笔记第81天)
- Pytorch 0.3发布:实现多方面提速,增加对ONNX支持 | 快讯
- 基于DB time的调优分析 (r6笔记第79天)
- 通过shell脚本抓取awr报告中的问题sql(r6笔记第78天)
- Tomcat 快速入门
- 服务器进程异常的原因分析(r6笔记第74天)
- Elastic 技术栈之 Filebeat
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 【colab pytorch】模型权重初始化
- 【colab pytorch】提取模型中的某一层
- django-URL实例命名空间(十一)
- 【colab pytorch】数据预处理
- django-URL默认参数传递
- springmvc之自定义视图
- 【colab pytorch】训练和测试常用模板代码
- django-VIews之HttpResponse(一)
- django-Views之request(二)
- django-Views之常见的几种错误视图代码(三)
- django-Views之装饰器(四)
- django-Views之使用视图渲染模板(五)
- springmvc实例之显示雇员相关信息(一)
- django-Views之类视图 (六)
- springmvc之重定向