获取设备信息——获取客户端ip地址和mac地址
1、获取本地IP(有可能是 内网IP,192.168.xxx.xxx)
/**
* 获取本地IP
*
* @return
*/
public static String getLocalIpAddress() {
try {
Enumeration<networkinterface> en = NetworkInterface
.getNetworkInterfaces();
while (en.hasMoreElements()) {
NetworkInterface ni = en.nextElement();
Enumeration<inetaddress> enIp = ni.getInetAddresses();
while (enIp.hasMoreElements()) {
InetAddress inet = enIp.nextElement();
if (!inet.isLoopbackAddress()
&& (inet instanceof Inet4Address)) {
return inet.getHostAddress().toString();
}
}
}
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} return "0";
}</inetaddress></networkinterface>
2.获取网络ip,比上述方法更加精确,但是要异步执行。
public class GetLocalHostIP implements Callable<String>{ private GetLocalHostIP(){
super();
}
public static String getIP(){
ExecutorService executorService = Executors.newCachedThreadPool();
Future<String> localIP = executorService.submit(new GetLocalHostIP());
String ip = null; try {
ip = localIP.get();
}catch (InterruptedException e){
e.printStackTrace();
}
catch (ExecutionException e){
e.printStackTrace();
}
if(ip == null || ip.startsWith("192.168")){
return "10.142.92.242";
}else{
return ip;
}
} @Override
public String call() throws Exception {
URL infoUrl = null;
String ipLine = "";
try {
infoUrl = new URL("http://myip.dnsomatic.com");
BufferedReader in = new BufferedReader(new InputStreamReader(infoUrl.openStream()));
ipLine = in.readLine();
} catch (Exception e) {
try {
infoUrl = new URL("http://icanhazip.com/");
BufferedReader in = new BufferedReader(new InputStreamReader(infoUrl.openStream()));
ipLine = in.readLine();
} catch (Exception e2) {
e2.printStackTrace();
}
}
return ipLine;
}
}
上述方法可以获取ip,但是获取速度较慢,对网速要求较高。(两个网址都是国际通用,访问较慢),下面介绍国内网站获取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;
}
各大运营商都提供了ip地址查询的接口:
新浪的IP地址查询接口:http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js
新浪多地域测试方法:http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js&ip=218.192.3.42
搜狐IP地址查询接口(默认GBK):http://pv.sohu.com/cityjson
搜狐IP地址查询接口(可设置编码):http://pv.sohu.com/cityjson?ie=utf-8
搜狐另外的IP地址查询接口:http://txt.go.sohu.com/ip/soip
太平洋电脑 IP库接口:(默认callback=IPCallBack) http://whois.pconline.com.cn/ipJson.jsp
http://whois.pconline.com.cn/?ip=[ip地址字符串]
直接访问:http://whois.pconline.com.cn/?ip=
调用方法非常丰富,提供多种JS嵌入调用。
网易有道IP地址API接口
查询IP地址:
http://www.youdao.com/smartresult-xml/search.s?type=ip&q=115.156.238.114
淘宝IP地址库API接口
1. 请求接口(GET):
http://ip.taobao.com/service/getIpInfo.php?ip=[ip地址字串]
网上部分IP地址查询接口需要收费,或者对每秒钟请求次数有限制如: http://iframe.ip138.com/ic.asp
3.获取mac地址
public static String getLocalMacAddress() {//没有缓存的地址,则查询
String mac_s = "";
try {
byte[] mac;
NetworkInterface ne = NetworkInterface.getByInetAddress(InetAddress.getByName(getLocalIpAddress()));
mac = ne.getHardwareAddress();
mac_s = byte2hex(mac);
} catch (Exception e) {
}
mac_s;
return mac_s;
}
4. 获取设备唯一标识:
Android的开发者在一些特定情况下都需要知道手机中的唯一设备ID。例如,跟踪应用程序的安装,生成用于复制保护的DRM时需要使用设备的唯一ID。在本文档结尾处提供了作为参考的示例代码片段。
范围
本文提供有关如何读取各种Android设备的 ID的介绍,用以使用标识号。本文假定用户已经安装了Android以及开发应用程序必要的工具。并且,本文假定用户已了解Android的基本知识。
简介在搭载Android操作系统的设备中,已经存在好几种类型的设备标识号。先前的所有Android设备都具有电话功能,因此查找每部设备硬件唯一的IMEI,MEID,或ESN也很容易。但仅能使用Wifi的设备或音乐播放器没有电话硬件,所以没有这种类型的唯一标识号。本文阐述了如何读取不同Android设备的标识号。检索Android设备ID各种方式
以下是Android设备不同类型的识别设备ID。
· 唯一编号(IMEI,MEID,ESN,IMSI)
· MAC地址
· 序列号
· ANDROID_ID
唯一编号(IMEI,MEID,ESN,IMSI)
说明在以前,当Android设备均作为电话使用时,寻找唯一标识号比较简单:()可用于找到(取决于网络技术)手机硬件唯一的IMEI,MEID,ESN和IMSI编号。
TelephonyManager.getDeviceId
IMEI,MEID,ESN,IMSI的定义如下:
•IMEI(国际移动设备识别码)唯一编号,用于识别 GSM,WCDMA手机以及一些卫星电话(移动设备识别码)全球唯一编号,用于识别CDMA移动电台设备的物理硬件,MEID出现的目的是取代ESN号段(电子序列号)(电子序列号)唯一编号,用于识别CDMA手机(国际移动用户识别码)与所有GSM和UMTS网络手机用户相关联的唯一识别编号如需要检索设备的ID,在项目中要使用以下代码:
缺点
•需要添加权限: 动态权限申请特别麻烦
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
•Android设备要具有电话功能
•其工作不是很可靠
•序列号
•当其工作时,该值保留了设备的重置信息(“恢复出厂设置”),从而可以消除当客户删除自己设备上的信息,并把设备转另一个人时发生的错误。
Mac地址
说明
可通过检索找到设备的Wi - Fi或蓝牙硬件的Mac地址。但是,不推荐使用Mac地址作为唯一的标识号。
缺点设备要具备Wi – Fi功能(并非所有的设备都有Wi – Fi功能)如果设备目前正在使用Wi - Fi,则不能报告Mac地址
序列号
从Android 2.3(“姜饼”)开始,通过android.os.Build.SERIAL方法序列号可被使用。没有电话功能的设备也都需要上给出唯一的设备ID; 某些手机也可以需要这样做。序列号可以用于识别MID(移动互联网设备)或PMP(便携式媒体播放器),这两种设备都没有电话功能。通过读取系统属性值“ro.serialno”的方法,可以使用序列号作为设备ID 。如检索序列号并作为设备ID使用,请参考下面的代码示例。
缺点
序列号无法在所有Android设备上使用。
ANDROID_ID
说明
更具体地说,Settings.Secure.ANDROID_ID 是一串64位的编码(十六进制的字符串),是随机生成的设备的第一个引导,其记录着一个固定值,通过它可以知道设备的寿命(在设备恢复出厂设置后,该值可能会改变)。 ANDROID_ID也可视为作为唯一设备标识号的一个好选择。
缺点
• 对于Android 2.2(“Froyo”)之前的设备不是100%的可靠
• 此外,在主流制造商的畅销手机中至少存在一个众所周知的错误,每一个实例都具有相同的ANDROID_ID。
结论
对于绝大多数应用来说,只需识别特定的安装配置,而不需要识别物理设备。所幸是,这样做就省去了麻烦。
下面是部分使用设备ID的最佳途径:
•支持各种设备类型的另一种方法是使用getDeviceID()API和ro.serialno的组合
•有许多值得参考的原因,来提醒开发者避免试图识别特定的设备。对于那些想做一下这方面尝试的用户,最好的办法可能是使用ANDROID_ID,并在一些传统设备上做尝试。
推荐使用AndroidId 作为识别设备的唯一标识。
5、获取屏幕宽高
android获取屏幕的高度和宽度用到WindowManager这个类,两种方法:
1、WindowManager wm = (WindowManager) getContext()
.getSystemService(Context.WINDOW_SERVICE); int width = wm.getDefaultDisplay().getWidth();
int height = wm.getDefaultDisplay().getHeight(); 2、WindowManager wm = this.getWindowManager(); int width = wm.getDefaultDisplay().getWidth();
int height = wm.getDefaultDisplay().getHeight();
参考:http://blog.csdn.net/aminfo/article/details/7604451/
获取设备信息——获取客户端ip地址和mac地址的更多相关文章
- 史上最全的iOS各种设备信息获取总结
来源:si1ence 链接:http://www.jianshu.com/p/b23016bb97af 为了统计用户信息.下发广告,服务器端往往需要手机用户设备及app的各种信息,下面讲述一下各种信息 ...
- iOS: iOS各种设备信息获取
Author:si1ence Link:http://www.jianshu.com/p/b23016bb97af 为了统计用户信息.下发广告,服务器端往往需要手机用户设备及app的各种信息,下面讲述 ...
- 获取本机的IP地址和mac地址
1. 以前一直用ipconfig来查看ip地址,哈哈哈,现在发现挺好玩 #获取本机的IP地址和mac地址 import uuid import socket def get_mac_address() ...
- 获取本机IP地址和MAC地址
unit NetFunc; interface uses SysUtils, Windows, dialogs, winsock, Classes, ComObj, WinInet, Variants ...
- React Native(五)——获取设备信息react-native-device-info
心酸史: 自从接触rn开始后,越来越多的引入第三方组件而开始的配置文件,让自己一再头疼: 明明是按照官方文档一步一步的配置,为什么别人可以做到的自己却屡屡出错,真是哭笑不得--从微信分享react-n ...
- delphi 获取本机IP地址和MAC地址
unit NetFunc; interface uses SysUtils, Windows, dialogs, winsock, Classes, ComObj, WinInet, Variants ...
- delphi 获取本机IP地址和MAC地址 (转)
unit NetFunc; interface uses SysUtils, Windows, dialogs, winsock, Classes, ComObj, WinInet, Variants ...
- java获取服务器IP地址及MAC地址的方法
这篇文章主要介绍了java编程实现获取机器IP地址及MAC地址的方法,实例分析了Java分别针对单网卡及多网卡的情况下获取服务器IP地址与MAC地址的相关技巧,需要的朋友可以参考下 本文实例讲述了 ...
- Android 获取设备信息 异常
/**获取设备信息 * @param c * @return */ public static void setDeviceInfo(Context c,RequestParams params){ ...
随机推荐
- =default(c++11)
1.概念 1)如果我们需要编译器默认的行为,则可以在参数列表后面加上=default来显式地要求编译器生成合成版本的默认构造函数和拷贝控制成员:合成的默认构造函数.合成拷贝构造函数.合成拷贝赋值运算符 ...
- 20155211 2016-2017-2 《Java程序设计》第七周学习总结
20155211 2016-2017-2 <Java程序设计>第七周学习总结 教材学习内容总结 第十二章 Lambda Lambda表达式中this的参考对象以及toString()的接受 ...
- 转:解决windows下eclipse中android项目关联android library project失败问题
近日,在做一个人人的第三方小项目.打算直接使用renren 的sdk 进行开发.因为renren的sdk是以android library project 形式发布的(关于这种project的内容可以 ...
- [mysql] mysql如何实现更新一条记录中某个字段值的一部分呢?
场景:在平常我们使用word文档等等office办公软件时,我们常会使用搜索->替换的功能. mysql: 在mysql 中有时候,我们也需要这样子的实现: 实现 SQL 语句: update ...
- smarty-2014-02-28
使用smarty,在tpl文件中如何使用相对路径调用css&javascript文件,实际上这个相对路径的参照物就是以调用该tpl文件的php文件来写. 假如,我在index.php这个文件中 ...
- 转载:R语言Data Frame数据框常用操作
Data Frame一般被翻译为数据框,感觉就像是R中的表,由行和列组成,与Matrix不同的是,每个列可以是不同的数据类型,而Matrix是必须相同的. Data Frame每一列有列名,每一行也可 ...
- python3--django for 循环中,获取序号
功能需求:在前端页面中,for循环id会构不成连续的顺序号,所以要找到一种伪列的方式来根据数据量定义序号 因此就用到了在前端页面中的一个字段 forloop.counter,完美解决 <tbod ...
- 实现单台测试机6万websocket长连接
本文由作者郑银燕授权网易云社区发布. 本文是我在测试过程中的记录,实现了单台测试机发起最大的websocket长连接数.在一台测试机上,连接到一个远程服务时的本地端口是有限的.根据TCP/IP协议,由 ...
- extjs4.0以上添加多行工具栏的方法
4.0.0起提供了dockedItems ,只要写两个dockItem,xtype为'toolbar',dock为 'top'即可
- WebBench源码分析
源码分析共享地址:https://github.com/fivezh/WebBench 下载源码后编译源程序后即可执行: sudo make clean sudo make & make in ...