# 前言 #

本篇文章主要介绍android如何获取本机ip地址及ip归属地。

打开网易新闻 查看精彩图片

# 定义 #
ip地址是指手机在连接到互联网时所获得的唯一网络地址。
ip归属地是指通过ip地址查询器对应的地理位置信息,如省市区等信息。
# 获取ip地址 #
如果只是查看本机ip,不涉及应用开发,可以依次打开手机设置-我的设备-状态信息-ip地址界面进行查看(不同品牌手机型号会有差异)。
下面开发过程中获取本机ip方法:
1.首先是要在清单文件中配置必要的权限:
2.手机在不同的网络环境下获取ip的方法:
//获取ip
public void getIPAddress(Context context) {
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = cm.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isConnectedOrConnecting()) {
//网络连接可用,判断网络连接类型
if (networkInfo.getType() == ConnectivityManager.TYPE_WIFI) {
//wifi网络
WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
int ipAddress = wifiInfo.getIpAddress();
String ip = String.format("%d.%d.%d.%d",
(ipAddress & 0xff),
(ipAddress >> 8 & 0xff),
(ipAddress >> 16 & 0xff),
(ipAddress >> 24 & 0xff));
Log.e("tag", "ip:" + ip);
} else if (networkInfo.getType() == ConnectivityManager.TYPE_MOBILE) {
//移动网络
getLocalIpAddress();
}
} else {
//没有网络链接
}
}
private void getLocalIpAddress() {
try {
ArrayList networkInterfaces = Collections.list(NetworkInterface.getNetworkInterfaces());
for (NetworkInterface networkInterface : networkInterfaces) {
ArrayList inetAddresses = Collections.list(networkInterface.getInetAddresses());
for (InetAddress address : inetAddresses) {
String ip = address.getHostAddress();
if (!address.isLoopbackAddress() && (address instanceof Inet4Address)) {
Log.e("tag", "ipv4:" + ip);
}
if (!address.isLoopbackAddress() && (address instanceof Inet6Address)) {
Log.e("tag", "ipv6:" + ip);
}
}
}
} catch (SocketException socketException) {
Log.e("tag", socketException.getMessage());
}
}
# 获取ip归属地 #
想要获取到ip归属地,一般需要获取到ip地址后通过第三方服务来查询,下面展示一下android使用ip数据云获取ip归属地的具体方法:
//获取ip归属地
private Location getIpData(String ip, String key) {
Location location = null;
try {
URL url = new URL("https://api.ipdatacloud.com/v2/query?ip=" + ip + "&key=+" + key);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
StringBuffer sb = new StringBuffer();
String line;
while ((line = in.readLine()) != null) {
sb.append(line);
}
in.close();
connection.disconnect();
// 解析返回的JSON数据,获取IP归属地信息
// 这里需要使用JSON解析库,例如gson、fastjson
String jsonResult = sb.toString();
location = new Gson().fromJson(jsonResult, Location.class);
} catch (Exception e) {
e.printStackTrace();
}
return location;
}
class Location {
private String AreaCode; //行政区码
private String City; //城市
private String CityCode; //城市代码
private String Continent; //洲
private String Country; //国家/地区
private String CountryCode; //国家/地区英文简写
private String District; //区县
private String Elevation; //海拔
private String Ip; //ip地址
private String Isp; //运营商
private String Latitude; //纬度
private String Longitude; //经度
private Street[] MultiStreet; //历史街道位置
private String Province; //省份
private String Street; //街道
private String TimeZone; //时区
private String WeatherStation; //气象站
private String ZipCode; //邮编
}
class Street {
private String Lng; //经度
private String Lat; //纬度
private String Province; //省份
private String City; //城市
private String District; //区县
private String Street; //街道
private String Radius; //范围半径
private String ZipCode; //邮政编码
}
# 总结 #
本文简要总结了android获取ip地址及归属地的方法,在实际开发中还需要根据自身的实际情况进行修改。
在众多第三方服务中,ip数据云作为新一代ip地址数据服务领军者,为广大开发者提供了丰富的产品服务,具体可去官网https://www.ipdatacloud.com进行测试、咨询。