最近做的一个项目中需要用到Android设备唯一码(UUID)来标识一台设备,

Android中设备唯一码有很多,如:MAC地址、IMEI号(DeviceId)、IMSI号、ANDROID_ID、序列号(SerialNumber)等,

但并不是所有设备上都能稳定获取到这些值。

 

最后项目中采用的是MAC地址。

先总结一些搜索得知的各种值的缺点,再说说最后采用MAC地址的解决方案吧。

 

1.MAC地址:

获取MAC地址的方法有两种:

(1). 通过Linux命令查询

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 public String getMacAddress() {      String macAddress = null ;      String str = "" ;      try {          //linux下查询网卡mac地址的命令          Process 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 ) {                  macAddress = str.trim(); // 去空格                  break ;              }          }      } catch (IOException ex) {          ex.printStackTrace();      }      return macAddress; }

缺点:

在当前没打开WiFi的情况下获取得到的MAC地址值为空,即使在执行这段代码前是有打开过WiFi,而执行这段代码时WiFi状态是关闭的,也不能获取到MAC地址。

 

(2). 通过Android官方的WifiManager类获取

1 2 3 4 5 6 7 8 9 10 11 public String getMacAddress() {        String macAddress = null ;                WifiManager wifiManager =          (WifiManager)MyApplication.getContext().getSystemService(Context.WIFI_SERVICE);      WifiInfo info = ( null == wifiManager ? null : wifiManager.getConnectionInfo());                macAddress = info.getMacAddress();      return macAddress; }

需要加入权限

1 < uses-permission android:name = "android.permission.ACCESS_WIFI_STATE" />

缺点:

这种方法虽然能在当前Wifi状态为关闭的情况下获取到MAC地址,但前提是在手机开机后要打开过一次Wifi,如果在某次开机后没打开过Wifi就调用这段代码,获取地址也是为空。

网上给出的解释是:WiFi的Mac address是一个被动资讯。一般在开机后,不会主动上报到系统裡。要待WiFi硬件启动后,才会把有关Mac address资料记载入系统去。

 

2.IMEI号(DeviceId)、IMSI号:

1 2 3 TelephonyManager mTelephonyMgr = (TelephonyManager) getSystemServic(Context.TELEPHONY_SERVICE); String imsi = mTelephonyMgr.getSubscriberId();  //获取IMSI号 String imei = mTelephonyMgr.getDeviceId();  //获取IMEI号

需要加入权限

1 < uses-permission android:name = "android.permission.READ_PHONE_STATE" />

缺点:

IMEI号(国际移动设备身份码)、IMSI号(国际移动设备识别码)这两个是有电话功能的移动设备才具有,也就是说某些没有电话功能的平板是获取不到IMEI和IMSI号的。且在某些设备上getDeviceId()返回垃圾数据。

 

3.ANDROID_ID:

ANDROID_ID 是设备首次启动时由系统随机生成的一串64位的十六进制数字。

1 String ANDROID_ID = Settings.System.getString(getContentResolver(), Settings.System.ANDROID_ID);

缺点:

①.设备刷机wipe数据或恢复出厂设置时ANDROID_ID值会被重置。

②.现在网上已有修改设备ANDROID_ID值的APP应用。

③.某些厂商定制的系统可能会导致不同的设备产生相同的ANDROID_ID。

④.某些厂商定制的系统可能导致设备返回ANDROID_ID值为空。

⑤.CDMA设备,ANDROID_ID和DeviceId返回的值相同

 

4.序列号SerialNumber:

从Android 2.3开始,通过android.os.Build.SERIAL方法可获取到一个序列号。没有电话功能的设备也都需要上给出此唯一的序列号。

1 String SerialNumber = android.os.Build.SERIAL;

缺点:

在某些设备上此方法会返回垃圾数据。

 

解决方案:

一种比较折衷的办法,在获取MAC地址之前先判断当前WiFi状态,若开启了Wifi,则直接获取MAC地址,若没开启Wifi,则用代码开启Wifi,然后马上关闭,再获取MAC地址。

目前此方法测试成功,无论在哪种状态下都能正确取得设备的MAC地址(包括开机后未启动过Wifi的状态下),且在未开启Wifi的状态下,用代码开启Wifi并马上关闭,过程极短,不会影响到用户操作。

代码如下:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 public String getMacAddress() {        String macAddress = null ;      WifiManager wifiManager =          (WifiManager)MyApplication.getContext().getSystemService(Context.WIFI_SERVICE);      WifiInfo info = ( null == wifiManager ? null : wifiManager.getConnectionInfo());                if (!wifiManager.isWifiEnabled())      {          //必须先打开,才能获取到MAC地址          wifiManager.setWifiEnabled( true );          wifiManager.setWifiEnabled( false );      }      if ( null != info) {          macAddress = info.getMacAddress();      }      return macAddress; }

需要加入如下权限

1 2 3 < uses-permission android:name = "android.permission.ACCESS_WIFI_STATE" > uses-permission > < uses-permission android:name = "android.permission.CHANGE_WIFI_STATE" > uses-permission > < uses-permission android:name = "android.permission.WAKE_LOCK" > uses-permission >

 

来自:http://www.goteny.com/develop/android/201412/452.html

更多相关文章

  1. Android Studio 官方下载地址
  2. Android 蓝牙设备的开启与关闭功能的实现
  3. js判断用户设备的类型(iOS,Android,pc等)
  4. Android中蓝牙设备搜索
  5. 在线安装eclipse cdt的地址
  6. android在线源码地址
  7. 通过UserAgent判断智能手机(设备,Android,IOS)
  8. android 获取wifi mac 地址的代码
  9. 如何获取Android IP地址

随机推荐

  1. Android工具包
  2. Error:Execution failed for task ':app:
  3. Android am/pm命令用法
  4. adb连接不上模拟器的问题
  5. Android自定义View之一:初探实例
  6. Android 后台保活设计2019,最新版本
  7. Android 读取正在运行非系统的程序
  8. 【Android】获取apk的版本及包名等信息
  9. Android http HttpURLConnection
  10. Android通过Uri获取文件的路径的方法