此篇文章对比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下的POS打印机调用
  2. Android设备Root检测方法
  3. Android(安卓)Camera拍照常见问题小结
  4. Android蓝牙开发浅谈
  5. android,不让edittext一进入页面就获取焦点
  6. 获取Android的Java源代码并在Eclipse中关联查看的最新方法
  7. Android获取手机经纬度
  8. Android(安卓)SharedPreferences详解
  9. android中关于手机屏幕的相关操作(获取屏幕的宽高等操作)

随机推荐

  1. 2011.08.18(2)——— android 自定义组合组
  2. Android(安卓)关于获取摄像头帧数据
  3. Java(Android)线程池
  4. Android(安卓)/ iOS 静态代码扫描工具调
  5. Awesome Android
  6. Android(安卓)使用selector改变按钮状态
  7. 编译Android(安卓)使用 Java5 还是 Java6
  8. Android(安卓)- 像素密度和屏幕适配
  9. socket实现TCP通信_TCP连接android与单片
  10. RecyclerView详解(二):ItemDecoration使用(k