2011-01-25 161 views
50

我用這電話:Secure.ANDROID_ID對每個設備都是唯一的嗎?

Secure.getString(getApplicationContext().getContentResolver(), Secure.ANDROID_ID); 

要獲得該設備的UID。我認爲我從多個設備獲取相同的ID。這應該是可能的嗎?

有問題的ID是:9774d56d682e549c,顯然有與多臺裝置返回這個ID http://code.google.com/p/android/issues/list?cursor=10603&updated=10603&ts=1295993403

+0

你覺得呢?或者你確定嗎? –

+0

在查詢有問題的ID並看到有關它的線索後,我確定。起初,我認爲這可能是該設備返回null,我已經把它作爲默認的地方。但這種情況並非如此。我知道我在多個設備上獲得相同的價值。 – FoamyGuy

+0

我發現完美:http://stackoverflow.com/a/16929647/1318946 –

回答

25

檢入thread,。但是你應該小心,因爲它被記錄爲「可以在工廠重置時更改」。使用需要您自擔風險,並且可以在根深蒂固的手機上輕鬆更改。此外,看起來好像有些製造商的手機出現重複編號thread。根據你想要做什麼,我可能不會使用這個作爲一個UID。

+12

ANDROID_ID的實現太糟糕了!從Google的文檔判斷,這個意圖是一個更持久的ID:'在設備的第一次啓動時隨機生成的一個64位數字(作爲十六進制字符串),並且應該在設備的整個生命週期內保持不變' –

+1

根據這個線程 [鏈接](http://android-developers.blogspot.in/2011/03/identifying-app-installations.html) **另外,至少有一個廣受關注的流行手機中的bug一個主要製造商,其中每個實例都具有相同的ANDROID_ID。「** **最好不要使用它** –

+1

那是2011年Froyo期間。現在它是無關緊要的。 –

5

我讀過有關這幾件事情,不幸的是ANDROID_ID不應爲唯一標識將依賴於一個問題個別設備。

它似乎並沒有在Android的合規性要求被強制執行,而廠商似乎來實現它,他們選擇包括一些使用它更象是一個「模範」 ID等

同樣的方式,要知道,即使是如果製造商已經編寫了一個生成器以使其成爲UUID(例如),則不能保證在出廠重置後仍能繼續。

+3

我認爲這是保證不會通過設計在工廠重置中生存,它在文檔中的某處提到。這是實施它的正確方法。 –

13

所以,如果你想要設備本身獨特的東西,TM.getDeviceId()應該就足夠了。

以下是顯示如何獲取電話管理員ID的代碼。您正在使用的Android設備ID可能會在出廠設置中發生變化,並且一些製造商在提供唯一ID方面也存在問題。

TelephonyManager tm = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE); 

Log.d("ID", "Android ID: " + Secure.getString(getContentResolver(), Secure.ANDROID_ID)); 
Log.d("ID", "Device ID : " + tm.getDeviceId()); 

一定要通過使用

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

是的,使用getDeviceId()也可以。但是你應該非常小心,因爲它可能會返回null。 (在沒有3G /電話調制解調器的設備上) 我使用的解決方案是回退Wifi的mac地址(當然也可能丟失,但通常不在同一臺設備上) – vdstw

+11

需要「READ_PHONE_STATE」權限是可怕。改用'ANDROID_ID'。 – dolmen

+0

是的,它可能會在沒有3G的設備上返回null(市面上有很多它們),那麼您應該使用WiFi - 它的GUID也可能爲空,直到設備重啓後至少打開/關閉它一次。如果沒有wifi ...真正的噩夢,在Windows CE上每個設備都有GUID,生活很美。 – marcinj

1

這裏只是列出一個alternaitve的解決方案,廣告ID要爲TelephonyManager權限:

https://support.google.com/googleplay/android-developer/answer/6048248?hl=en

從鏈接複製上面:

廣告ID是由Google Play服務提供的唯一的用戶可重置廣告ID。它爲用戶提供了更好的控制,併爲開發人員提供了一個簡單,標準的系統,以繼續通過他們的應用程序獲利。它使用戶能夠重置其標識符或在Google Play應用程序中停用個性化廣告(以前稱爲基於興趣的廣告)。

的限制爲:

  1. 谷歌只播放功能的設備。
  2. 隱私政策:https://support.google.com/googleplay/android-developer/answer/113469?hl=en&rd=1#privacy
10

有了Android澳ANDROID_ID的行爲可能會改變。手機上每個用戶的每個應用的ANDROID_ID都不相同。

來自https://android-developers.googleblog.com/2017/04/changes-to-device-identifiers-in.html

的Android ID

在O,Android的ID(Settings.Secure.ANDROID_ID或SSAID)具有用於每個應用程序和不同的值的設備上的每個用戶。開發人員需要設備範圍的標識符,而應該使用可重置的標識符,例如廣告ID,從而爲用戶提供更多的控制。廣告ID還提供面向用戶的設置來限制廣告跟蹤。

此外,在安卓○:

  • 的ANDROID_ID值不會改變包卸載/重新安裝,因爲 只要包名和簽名密鑰是相同的。應用程序可以依靠此值來維護 以在重新安裝時保持狀態。
  • 如果某個應用安裝在運行Android的早期版本 的設備上,則Android ID會在設備 更新爲Android O時保持不變,除非應用已卸載並重新安裝 。
  • 僅當設備出廠時 重置或簽名密鑰在卸載和
    之間旋轉時,Android ID值纔會更改重新安裝事件。
  • 此更改僅適用於通過Google Play服務和廣告ID發送的設備製造商 。其他 設備製造商可能會提供替代的可重置ID或繼續提供ANDROID ID。
相關問題