此篇文章对比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地址来唯一标识一台设备是比较合理的。
(经实践确认,此方法也不靠谱.1.测试过有的设备在启动平板时飞行模式打开,deviceId获取不到。飞行模式关闭时能获取到。有的设备deviceId一直获取不到。2.测试,某些定制平板在wifi开关关闭的时候确实返回不了mac地址
TelephonyManager tm = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);String deviceid = tm.getDeviceId();if(deviceid == null || deviceid.length==0){  WifiManager manager = (WifiManager) getSystemService(Context.WIFI_SERVICE);  if (manager != null) {   deviceid = manager.getConnectionInfo().getMacAddress();  }}

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 {pp = Runtime.getRuntime().exec("cat /sys/class/net/wlan0/address ");InputStreamReader ir = new InputStreamReader(pp.getInputStream());LineNumberReader input = new LineNumberReader(ir);for (; null != str;) {str = input.readLine();if (str != null) {macSerial = str.trim();// 去空格break;}}} catch (IOException ex) {// 赋予默认值ex.printStackTrace();}finally {if(pp!=null){pp.destroy();}}return macSerial;}
台电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

更多相关文章

  1. Android设备Root检测方法
  2. 在定制android设备时,刷机后不全屏显示或实现长按Home键current a
  3. android命令行下创建虚拟设备avd
  4. Android 获取手机(ios,android)的设备唯一码(mac地址, IMEI)
  5. 不需要任何权限获得Android设备的唯一ID
  6. Android Studio 无设备打包与有设备打包小记
  7. Android官方开发文档Training系列课程中文版:连接无线设备之网络
  8. Android存储设备(U盘,SD卡)状态监测(《Android 2.3 SD卡挂载流程

随机推荐

  1. 使用GROUP BY,ORDER BY进行PDO查询构造
  2. mysql免安装版简单使用步骤
  3. 如何在MySQL中得到两个值的最大值?
  4. mysql replace into 的使用情况
  5. Centos设置开机启动Apache和Mysql[总结]
  6. MySQL添加外键错误1215
  7. 如何在执行bash查询时,获得受影响的行数?
  8. SQL查询结果区分大小写
  9. 关于淘宝的数据库系统
  10. 如何将空值传递给外键字段?