有很多场景和需求你需要用到手机设备的唯一标识符。例如,略。
Android中,有以下几种方法获取这样的ID。

1. The IMEI: 仅仅只对Android手机有效:

TelephonyManagerTelephonyMgr=(TelephonyManager)getSystemService(TELEPHONY_SERVICE);
StringszImei=TelephonyMgr.getDeviceId();//RequiresREAD_PHONE_STATE

采用此种方法,需要在AndroidManifest.xml中加入一个许可:android.permission.READ_PHONE_STATE,并且用户应当允许安装此应用。作为手机来讲,IMEI是唯一的,它应该类似于 359881030314356(除非你有一个没有量产的手机(水货)它可能有无效的IMEI,如:0000000000000)。

2. Pseudo-Unique ID, 这个在任何Android手机中都有效
有一些特殊的情况,一些如平板电脑的设置没有通话功能,或者你不愿加入READ_PHONE_STATE许可。而你仍然想获得唯一序列号之类的东西。这时你可以通过取出ROM版本、制造商、CPU型号、以及其他硬件信息来实现这一点。这样计算出来的ID不是唯一的(因为如果两个手机应用了同样的硬件以及Rom 镜像)。但应当明白的是,出现类似情况的可能性基本可以忽略。要实现这一点,你可以使用Build类:

Stringm_szDevIDShort ="35"+//we make this look like a valid IMEI

Build.BOARD.length()%10+ Build.BRAND.length()%10+ Build.CPU_ABI.length()%10+ Build.DEVICE.length()%10+ Build.DISPLAY.length()%10+ Build.HOST.length()%10+ Build.ID.length()%10+ Build.MANUFACTURER.length()%10+ Build.MODEL.length()%10+ Build.PRODUCT.length()%10+ Build.TAGS.length()%10+ Build.TYPE.length()%10+ Build.USER.length()%10;//13 digits

大多数的Build成员都是字符串形式的,我们只取他们的长度信息。我们取到13个数字,并在前面加上“35”。这样这个ID看起来就和15位IMEI一样了。

3. The Android ID, 通常被认为不可信,因为它有时为null。开发文档中说明了:这个ID会改变如果进行了出厂设置。并且,如果某个Andorid手机被Root过的话,这个ID也可以被任意改变。

Stringm_szAndroidID=Secure.getString(getContentResolver(),Secure.ANDROID_ID);

Returns: 9774d56d682e549c . 无需任何许可。

4. The WLAN MAC Address string, 是另一个唯一ID。但是你需要为你的工程加入android.permission.ACCESS_WIFI_STATE权限,否则这个地址会为null。

WifiManagerwm=(WifiManager)getSystemService(Context.WIFI_SERVICE);
Stringm_szWLANMAC=wm.getConnectionInfo().getMacAddress();

Returns: 00:11:22:33:44:55 (这不是一个真实的地址。而且这个地址能轻易地被伪造。).WLan不必打开,就可读取些值。

5. The BT MAC Address string, 只在有蓝牙的设备上运行。并且要加入android.permission.BLUETOOTH权限.

BluetoothAdapterm_BluetoothAdapter=null;//LocalBluetoothadapter
m_BluetoothAdapter=BluetoothAdapter.getDefaultAdapter();
Stringm_szBTMAC=m_BluetoothAdapter.getAddress();

Returns: 43:25:78:50:93:38 . 蓝牙没有必要打开,也能读取。

Combined Device ID
综上所述,我们一共有五种方式取得设备的唯一标识。它们中的一些可能会返回null,或者由于硬件缺失、权限问题等获取失败。
但你总能获得至少一个能用。所以,最好的方法就是通过拼接,或者拼接后的计算出的MD5值来产生一个结果。

Stringm_szLongID=m_szImei+m_szDevIDShort
 + m_szAndroidID+ m_szWLANMAC + m_szBTMAC;   
// compute md5
MessageDigest m = null;
try {
m = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}

m.update(m_szLongID.getBytes(),0,m_szLongID.length());
// get md5 bytes

byte p_md5Data[] = m.digest();
// create a hex string
String m_szUniqueID = new String();
for
(int i=0;i<p_md5Data.length;i++) {
int b = (0xFF & p_md5Data[i]);
// if it is a single digit, make sure it have 0 in front (proper padding)
if (b <= 0xF)
m_szUniqueID+="0";
// add number to string

m_szUniqueID+=Integer.toHexString(b);
} // hex string to uppercase
m_szUniqueID = m_szUniqueID.toUpperCase();


更多相关文章

  1. android 开机直接运行app并当做手机桌面
  2. Android获取设备唯一标识完美解决方案
  3. android手机客户端上传文件,java servlet服务器端接收并保存到服
  4. Android(安卓)SDK自带教程之BluetoothChat
  5. 你真的了解你手机的状态栏吗?
  6. Android(安卓)手机配office365邮箱
  7. 华为手机Android(安卓)Studio开发不显示Logcat解决办法
  8. Android(安卓)重力感应获取手机运动方向和角度
  9. Android(安卓)获取手机本地图片所在的位置

随机推荐

  1. Android应用程序与SurfaceFlinger服务的
  2. android view滑动助手类OverScroller
  3. Android(安卓)之 AsyncTask 异步任务
  4. Chris:怎样成为一名Android应用开发
  5. Android声音管理AudioManager使用
  6. Android软键盘的隐藏显示研究
  7. Android中ListView分页加载数据
  8. Android实现录屏直播+远程控制之MediaCod
  9. android camera HAL v3.0概述
  10. 向android进发 :(一)android开发环境配置