文档章节

android设备唯一码的获取之二

yolinfeng
 yolinfeng
发布于 2015/06/08 20:37
字数 1277
阅读 112
收藏 0

此篇文章对比android设备唯一码的获取之一看比较好,地址

http://blog.csdn.net/fastthinking/article/details/18001967


如何确定一个android设备?

问题: wifi mac,手机号,sdkversion等 这些都可能因为用户刷ROM后改变。不靠谱的说,很多山寨Android pad 的IMEI也是无法获取的!
一般建议先拿IMEI号来唯一确定一个设备的身份,确实如上所说,有些设备没有电话相关功能的话是拿不到IMEI的,比如很多低价国产Android平板,但是只要是Android设备,不管是没有电话功能的平板,还是没有电话功能的MP4,比如Galaxy PLAYER,他们都是有WIFI功能的,所以可以通过mac地址来唯一确定一台设备。那些做第3方统计分析的平台,比如友盟,也是采用先拿IMEI,后拿MAC地址来确定设备。我觉得这是一个比较合理的方法,还有的通过执行一些linux命令去拿CPU序列号的,由于每个设备厂商实现各不同,有时候也是拿不到的。所以一般的话我认为就通过IMEI和MAC地址来唯一标识一台设备是比较合理的。

TelephonyManager tm = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);
String deviceid = tm.getDeviceId();
if(deviceid == null || deviceid.length==0){
<span style="white-space:pre">		</span>WifiManager manager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
<span style="white-space:pre">		</span>if (manager != null) {
<span style="white-space:pre">			</span>deviceid = manager.getConnectionInfo().getMacAddress();
<span style="white-space:pre">		</span>}
}

Android 中的几中方法,使用中常常不可靠
1. DEVICE_ID
假设我们确实需要用到真实设备的标识,可能就需要用到DEVICE_ID。通过 TelephonyManager.getDeviceId()获取,它根据不同的手机设备返回IMEI,MEID或者ESN码.
缺点:在少数的一些设备上,该实现有漏洞,会返回垃圾数据
 2. MAC ADDRESS

我们也可以通过Wifi获取MAC ADDRESS作为DEVICE ID

WifiManager manager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
		if (manager != null) {
			String MacAddress = manager.getConnectionInfo().getMacAddress();
			Log.i(tag, "MacAddress is " + MacAddress);
		}

如果Wifi关闭的时候,硬件设备可能不能返回MAC ADDRESS。经 测试,某些定制平板在wifi开关关闭的时候确实返回不了mac地址。另外使用一个无电话功能的台电a10四核pad和小米1s联通版。
3. Serial Number

A hardware serial number, if available. Alphanumeric only, case-insensitive.  

android.os.Build.SERIAL 直接读取
缺点:在少数的一些设备上,会返回垃圾数据
4. ANDROID_ID
ANDROID_ID是设备第一次启动时产生和存储的64bit的一个数,
缺点:当设备被wipe后该数改变, 不适用。

5.android 底层是 Linux,我们用Linux的方法来获取:

1 cpu号:
文件在: /proc/cpuinfo
通过Adb shell 查看:
adb shell cat /proc/cpuinfo


2 mac 地址
文件路径 /sys/class/net/wlan0/address
adb shell  cat /sys/class/net/wlan0/address                              
xx:xx:xx:xx:xx:aa

如果Wifi关闭的时候,硬件设备不能返回MAC ADDRESS.测试使用一个无电话功能的台电a10四核pad和小米1s联通版

在wifi打开的时候获取的mac地址同方法2地址相同。
获取MAC 地址代码

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TelephonyManager tm = (TelephonyManager) this
.getSystemService(Context.TELEPHONY_SERVICE);
String simSerialNumber = tm.getSimSerialNumber();
Log.i(tag, "simSerialNumber is " + simSerialNumber);
String deviceid = tm.getDeviceId();
Log.i(tag, "DeviceId is " + deviceid);
String SubscriberId = tm.getSubscriberId();
Log.i(tag, "SubscriberId is " + SubscriberId);
String Line1Number = tm.getLine1Number();
Log.i(tag, "Line1Number is " + Line1Number);
String ANDROID_ID = Secure.getString(getContentResolver(),
Secure.ANDROID_ID);
Log.i(tag, "ANDROID_ID is " + ANDROID_ID);
Log.i(tag, "android.os.Build.SERIAL is " + android.os.Build.SERIAL);
WifiManager manager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
if (manager != null) {
String MacAddress = manager.getConnectionInfo().getMacAddress();
Log.i(tag, "MacAddress is " + MacAddress);
}
Log.i(tag, "macSerial getted  by linux is " + getMac());


}


private String getMac() {
String macSerial = null;
String str = "";
Process pp = null;
try {
<span style="white-space:pre">			</span>pp = Runtime.getRuntime().exec(
<span style="white-space:pre">					</span>"cat /sys/class/net/wlan0/address ");
<span style="white-space:pre">			</span>InputStreamReader ir = new InputStreamReader(pp.getInputStream());
<span style="white-space:pre">			</span>LineNumberReader input = new LineNumberReader(ir);


<span style="white-space:pre">			</span>for (; null != str;) {
<span style="white-space:pre">				</span>str = input.readLine();
<span style="white-space:pre">				</span>if (str != null) {
<span style="white-space:pre">					</span>macSerial = str.trim();// 去空格
<span style="white-space:pre">					</span>break;
<span style="white-space:pre">				</span>}
<span style="white-space:pre">			</span>}
<span style="white-space:pre">		</span>} catch (IOException ex) {
<span style="white-space:pre">			</span>// 赋予默认值
<span style="white-space:pre">			</span>ex.printStackTrace();
<span style="white-space:pre">		</span>}finally {
<span style="white-space:pre">			</span>if(pp!=null){
<span style="white-space:pre">				</span>pp.destroy();
<span style="white-space:pre">			</span>}
<span style="white-space:pre">		</span>}
<span style="white-space:pre">		</span>return macSerial;
<span style="white-space:pre">		</span>
<span style="white-space:pre">	</span>}
台电a10 4核平板 打开wifi

07-29 14:43:06.880: I/MainActivity(21404): DeviceId is 3588170056-------
07-29 14:43:06.880: I/MainActivity(21404): SubscriberId is 
07-29 14:43:06.880: I/MainActivity(21404): Line1Number is 
07-29 14:43:06.880: I/MainActivity(21404): ANDROID_ID is c76ec70cf84-------
07-29 14:43:06.880: I/MainActivity(21404): android.os.Build.SERIAL is unknown
07-29 14:43:06.890: I/MainActivity(21404): MacAddress is 00:7d:0e:0-------
07-29 14:43:06.920: I/MainActivity(21404): macSerial getted  by linux is 00:7d:0e:03:c6:e6

台电a10 4核平板 关闭wifi

07-29 14:45:25.340: I/MainActivity(21404): macSerial getted  by linux is null


小米1s 打开wifi

07-29 14:46:35.934: I/MainActivity(10172): simSerialNumber is 898601128---------
07-29 14:46:35.934: I/MainActivity(10172): DeviceId is 8630920---------
07-29 14:46:35.934: I/MainActivity(10172): SubscriberId is 4600191---------
07-29 14:46:35.944: I/MainActivity(10172): Line1Number is +86156---------
07-29 14:46:35.944: I/MainActivity(10172): ANDROID_ID is fa7ae33b---------
07-29 14:46:35.944: I/MainActivity(10172): android.os.Build.SERIAL is 341---------
07-29 14:46:35.954: I/MainActivity(10172): MacAddress is d4:97:0b---------
07-29 14:43:06.920: I/MainActivity(21404): macSerial getted  by linux is 00:7d:0-------

小米1s 关闭wifi

07-29 14:46:35.994: I/MainActivity(10172): macSerial getted  by linux is null

本文转载自:http://blog.csdn.net/fastthinking/article/details/38271133

yolinfeng
粉丝 12
博文 196
码字总数 11946
作品 0
珠海
架构师
私信 提问
android手机获取手机唯一识别号

一些特殊的代码,对于手机还是挺有用的 显示IMEI: #06# 开启语音拨号记录 ##8351## 关闭语音拨号记录 ##8350## 手机信息/设置 ##4636## 现场测试 ##7262626## PUK解锁 (从紧急拨号界面) 05<...

xiahuawuyu
2012/10/13
1K
0
简单的安卓应用授权认证(JNI)

最近一直在做公司的一个安卓开发框架,含so库,接近尾声了,领导提出一个需求,要求使用这个框架的开发者必须有我们的授权才可以,但是对方发布的应用后又不能被此授权限制——要不然所有的应...

tnjin
2014/11/09
1K
2
Android编程获取手机的IMEI

手机在生产时,每部手机均有一个唯一的标识(ID),国际上采用国际移动设备身份码(IMEI, International Mobile Equipment Identity)。IMEI是由15位数字组成的"电子串号",它与每台手机一一对应...

嘿嘿嘿IT
03/31
59
0
android 设备唯一码的获取,Cpu号,Mac地址

开发Android应用中,我们常常需要设备的唯一码来确定客户端。 Android 中的几中方法,使用中常常不可靠 DEVICE_ID 假设我们确实需要用到真实设备的标识,可能就需要用到DEVICE_ID。通过 Tele...

韩工
2012/08/29
3.3K
0
Android 开发常用代码片段

1、图片旋转 2、获取手机号码 3.格式化string.xml 中的字符串 4、android设置全屏的方法 A.在java代码中设置 B、在AndroidManifest.xml中配置 5、设置Activity为Dialog的形式 在AndroidMani...

长平狐
2013/01/06
300
0

没有更多内容

加载失败,请刷新页面

加载更多

OpenStack 简介和几种安装方式总结

OpenStack :是一个由NASA和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目。项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。OpenSta...

小海bug
昨天
5
0
DDD(五)

1、引言 之前学习了解了DDD中实体这一概念,那么接下来需要了解的就是值对象、唯一标识。值对象,值就是数字1、2、3,字符串“1”,“2”,“3”,值时对象的特征,对象是一个事物的具体描述...

MrYuZixian
昨天
6
0
数据库中间件MyCat

什么是MyCat? 查看官网的介绍是这样说的 一个彻底开源的,面向企业应用开发的大数据库集群 支持事务、ACID、可以替代MySQL的加强版数据库 一个可以视为MySQL集群的企业级数据库,用来替代昂贵...

沉浮_
昨天
4
0
解决Mac下VSCode打开zsh乱码

1.乱码问题 iTerm2终端使用Zsh,并且配置Zsh主题,该主题主题需要安装字体来支持箭头效果,在iTerm2中设置这个字体,但是VSCode里这个箭头还是显示乱码。 iTerm2展示如下: VSCode展示如下: 2...

HelloDeveloper
昨天
7
0
常用物流快递单号查询接口种类及对接方法

目前快递查询接口有两种方式可以对接,一是和顺丰、圆通、中通、天天、韵达、德邦这些快递公司一一对接接口,二是和快递鸟这样第三方集成接口一次性对接多家常用快递。第一种耗费时间长,但是...

程序的小猿
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部