Android開發 - 獲取Android裝置的唯一標識碼(Android 6.0或更高)
阿新 • • 發佈:2018-11-11
在我們的APP開發中,通常需要獲取到裝置的唯一標識。在Android6.0之前,有很多方法我們可以方便獲取到硬體的唯一標識,但是在Android6.0之後,Android系統大幅限制了我們獲取裝置的硬體資訊。
Android6.0之前的方法(已過時)
-
DEVICE_ID
通getSystemService(Context.TELEPHONY_SERVICE).getDeviceId()獲取,但是6.0之後必須申請READ_PHONE_STATE,並且獲取到的這個值在不同的廠商和裝置中並不可靠。 -
MAC地址
這個是無線網絡卡的MAC地址,這個需要ACCESS_WIFI_STATE許可權,並且很多情況下並獲取不到這個值,也並不是十分可靠。 - ANDROID_ID
這個值是當一個新的裝置第一次啟動時,或者恢復出廠設定時,系統會生成一個64位的數字,這個值目前(Android4.0之後)已經非常可靠,但是仍有個別廠商的定製系統的BUG,導致這個值返回null。
獲取裝置唯一標識的正確姿勢
由於ANDROID_ID的值相對穩定和可靠,並且不需要申請許可權,所以我們獲取裝置的唯一標識應該使用這個值,同時我們應該考慮到一些極端情況和安全問題。
- 獲取ANDROID_ID
public static String getAndroidID() { String id = Settings.Secure.getString( Utils.getApp().getContentResolver(), Settings.Secure.ANDROID_ID ); return id == null ? "" : id; }
- 構造UUID,防止直接暴露ANDROID_ID
private static String getDeviceUUid()
{
String androidId = DeviceUtils.getAndroidID();
UUID deviceUuid = new UUID(androidId.hashCode(), ((long)androidId.hashCode() << 32));
return deviceUuid.toString();
}
- 考慮極端情況,我們自己生成一個應用級別的UUID
這種情況我們需要將生成的UUID儲存到SharedPreference中,只要應用不被解除安裝或者清除資料,這個值就不會變。
private static String getAppUUid() {
String uuid = SPUtils.getInstance().getString(PREF_KEY_UUID);
if (TextUtils.isEmpty(uuid)) {
uuid = UUID.randomUUID().toString();
//這裡需要儲存到SharedPreference中
...
}
return uuid;
}
- 將上面的獲取方法封裝到一個方法中
public static String getUUID() {
String uuid = getDeviceUUid();
if (TextUtils.isEmpty(uuid)) {
uuid = getAppUUid();
}
return uuid;
}
總結
這些獲取UUID方法非常簡單,並且在應用的開發中可以滿足99%的需求,不需要動態申請許可權,也非常可靠,但是在使用時需要清楚其生成過程,以便應用到安全性要求非常高的場景中。
如有更多疑問,請參考我的其它Android相關部落格:我的部落格地址