Android是否有唯一的設備ID,如果有的話,該怎樣快速有效獲取?
Settings.Secure#ANDROID_ID 返回Android ID ,是一個64位的16進制字符串
import
android.provider.Settings.Secure;
private
String android_id = Secure.getString(getContext().getContentResolver(),Secure.ANDROID_ID);
關於這個問題有很多的答案,不過其中大部分將只能算是答對了一部分,還不夠好。
根據我在很多設備上的測試(所有的電話,至少有一個是無效的)
所有設備針對 TelephonyManager.getDeviceId() 測試都有返回值
所有GSM設備(都有SIM卡)針對 TelephonyManager.getSimSerialNumber() 測試都有返回值
所有CDMA設備針對 getSimSerialNumber() 測試返回 NULL(預期中的)
所有有谷歌帳戶的設備都返回了 ANDROID_ID 值
所有的CDMA設備針對 ANDROID_ID 和 TelephonyManager.getDeviceId() 都返回相同的值(或派生自同一個值) - 前提是安裝過程中已經添加了谷歌帳戶。
我還沒有機會測試沒有SIM卡的GSM設備,沒有谷歌賬戶的GSM設備,以及任何在飛行模式下的設備。
所以,如果你想要得到設備本身的唯一值, TM.getDeviceId()應該是足夠了。不過顯然的,有些用戶比其他人更加偏執一些,可以將這些標識中的一個或者多個進行hash運算就很有用,生成的字符串仍然可以唯一標識該設備,但是不會明確的標識實際的設備。例如,使用String.hashCode(),再加上一個UUID:
final
TelephonyManager tm = (TelephonyManager) getBaseContext().getSystemService(Context.TELEPHONY_SERVICE);
final
String tmDevice, tmSerial, androidId;
tmDevice
= ""
+ tm.getDeviceId();
tmSerial
= ""
+ tm.getSimSerialNumber();
androidId
= ""
+ android.provider.Settings.Secure.getString(getContentResolver(), android.provider.Settings.Secure.ANDROID_ID);
UUID
deviceUuid = new
UUID(androidId.hashCode(), ((long)tmDevice.hashCode()
<< 32)
| tmSerial.hashCode());
String
deviceId = deviceUuid.toString();
結果可能類似 :00000000-54b3-e7c7-0000-000046bffd97
對我來說這種方式已經足夠了
別忘了增加權限,用於讀取 TelephonyManager properties,在manifest 中增加下面一行:
1
<uses-permission
android:name="android.permission.READ_PHONE_STATE"
/>