2012-12-06 34 views
38

如果我撥號 * * * * ,我讓我的Android設備ID與android-35c2acdd...機器人設備ID混亂

sourcesource

開始。如果我使用Settings.Secure.getString(getContentResolver(), Settings.Secure.ANDROID_ID)結果與a96b4b27...

開始

如果我使用((TelephonyManager) Context.getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId()結果與3538330...

是什麼,這些ID-S之間的差開始變?我怎樣才能獲得

* * #的結果 * * 撥號?

回答

69

IMEI

的IMEI是 'MAC' 的電話模塊 - 唯一的電話使用時,ID它通過GSM/GPRS/HSPDA /等連接。 GSM網絡使用它將來自GSM網絡的電話和數據的呼叫和數據直接路由到互聯網(這是一個IP網絡)。

電話模塊是處理電話網絡(GSM或CMDA)的芯片或電路板,並且通常具有用於可移動SIM卡的插槽。某些電話具有多個電話模塊(有源雙SIM卡或多SIM卡電話)。每個電話模塊都有自己的IMEI。

製造商在製造過程中爲每部手機(嚴格來說是電話模塊)提供一個獨特的IMEI。但是,如果您擁有合適的軟件,則通常可以重新編寫該編號。這通常是在手機被盜後給手機一個新的身份和bipass被盜手機阻塞系統。

IMEI可以通過使用TelephonyManager.getDeviceId() API以編程方式獲得。

CDMA手機有一個ESN或MEIDdifferent lengths and formats,即使它使用相同的API檢索。

沒有電話模塊的Android設備 - 例如很多平板電腦和電視設備 - 沒有IMEI。由於Schlangi評論說,一些設備沒有電話模塊假冒 IMEI,所以IMEI的存在不(總是)保證設備具有電話模塊。

ANDROID_ID

的ANDROID_ID是手機上的另一個唯一的數字 - 這是因爲它首次啓動時操作系統自動生成(做這種方式使得它容易爲製造商通過從生產線上移除一個步驟)。

的ANDROID_ID可以(並且不會)改變,例如:

它主要用於通過開發人員(例如識別並使用adb連接到設備)

ANDROID_ID可用於識別Android設備鑑於上面的注意事項,實際上它意味着它在器件生命週期的重要部分唯一標識器件,但不能依賴。

另外請注意,在Froyo有一個錯誤,許多設備給自己相同的 ANDROID_ID。這是bug

其他標識符

有許多的,可用於識別裝置中的其他事情:

  • WiFi模塊的MAC地址:WifiManager.getConnectionInfo() - >WifiInfo.getMacAddress()。這通常可以在軟件中改變,但是通常在設備壽命期間是恆定的。此外,只有在WiFi模塊打開的情況下才能讀取。
  • 藍牙模塊的MAC地址:BluetoothAdaptor.getAddress()。與WiFi MAC一樣,這通常可以在軟件中更改,並且可以在您需要時關閉。
  • 訂戶的電話號碼。如果用戶從電信公司請求新號碼,或者用戶切換SIM卡,這可能會改變。它從TelephonyManager.getLine1Number()獲得。這僅適用於安裝了當前SIM的Android手機設備和帶電話的付費服務。
  • SIM卡包含自己的識別號碼(IMSI)。這是從TelephonyManager.getSubscriberId() API獲得的。顯然,SIM卡可能不會在任何特定時間出現,並且在SIM卡更換時發生變化 - 用戶可以在保持相同號碼的情況下升級/更換SIM卡,因此您不能說這是一對一的一個特定的電話或用戶。
  • 與IMSI相關的是MSISDN。這用作訂購(您與您的移動提供商之間的特定電話號碼的合同)的標識,並因此爲設備提供其電話號碼。 MSISDN可能與多個SIM卡相關聯,因此可能與多個手機關聯。它附帶了閱讀上述SIM卡的所有注意事項。這可以通過TelephonyManager.getSimSerialNumber()檢索。謝謝Schlangi更正和增加
  • 薑餅和更高版本有android.os.Build.SERIAL許多製造商設置(但不是所有。臭蟲)。

其他說明

你需要特定的權限來訪問每個API,因此,如果您嘗試爲所有的人,你的應用程序在谷歌權限Play商店看起來相當寬容。

我認爲這個鏈接解釋了所有其他可用選項還https://android-developers.googleblog.com/2011/03/identifying-app-installations.html

+1

很好的答案+1 –

+1

雖然你說得對,沒有電話模塊的設備沒有IMEI,但也有製造商給他們的設備僞造IMEI。其中一個例子就是Odys命名爲Loox plus的低成本設備 - 所以如果您嘗試以特殊方式處理這些設備,請不要指望在調用TelephonyManager.getDeviceId()時獲取null或空字符串! – Schlangi

+1

我在你的解釋中發現了一個小錯誤:IMSI由TelephonyManager.getSubscriberId()報告,SIM卡的序列號是不同的東西:可以製作SIM卡的多個副本,全部使用相同的IMSI但不同的序列號。其結果是SIM卡,可用於不同的電話具有相同的電話號碼(例如智能手機和汽車電話),但一次只能使用一個。在移動網絡可以同時處理每個電話號碼的多個IMSI之前,這是一個常見的使用案例。 – Schlangi

3

IMEI

有由標準化機構的強制性要求,對於公共網絡的移動設備可以通過IMEI號

被唯一標識,它是製造商的責任設置IMEI。在實踐中,開發人員有時會看到IMEI號,像000000 ...或... 123456有時具有相同IMEI的手機去生產,這當然是應該被修正了一個錯誤......

ANDROID_ID

設備第一次啓動時隨機生成的64位數字(作爲十六進制字符串),並應在設備的生命週期內保持不變。(如果在設備上執行出廠重置,則該值可能會更改。)

看起來Android不信任製造商並提供了替代唯一ID。

編輯:

這是我和Android設備是在手機上得到(而不是IMEI):

$ adb shell dumpsys iphonesubinfo 
Phone Subscriber Info: 
    Phone Type = GSM 
    Device ID = null 
+0

我怎樣才能得到'*#*#8255#*#*'錶盤的結果? –

8

在網上找到了:

private static final Uri URI = Uri.parse("content://com.google.android.gsf.gservices"); 
private static final String ID_KEY = "android_id"; 

String getAndroidId(Context ctx) { 
    String[] params = { ID_KEY }; 
    Cursor c = ctx.getContentResolver() 
      .query(URI, null, null, params, null); 

    if (!c.moveToFirst() || c.getColumnCount() < 2) 
     return null; 

    try { 
     return Long.toHexString(Long.parseLong(c.getString(1))); 
    } catch (NumberFormatException e) { 
     return null; 
    } 
} 

添加權限:

<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/> 

但是,我懷疑這是一個有記錄的ID,我會很小心,因爲如果GTalk得到更新,這可能無法正常工作。

來源:http://blog.codepainters.com/2012/01/17/how-to-obtain-gtalk-android-id/

也值得擁有一看:http://www.toxicbakery.com/android-development/getting-google-auth-sub-tokens-in-your-android-applications/

+0

這是手機上特定於Google服務的ID。當您爲設備設置第一個(主要)Google帳戶時會生成該帳戶。它只是一個很長的(64位)數字,用於所有Google服務,包括Android Market。除非您嘗試編寫訪問Google服務的應用程序,否則通常不需要它(參見上面的第二個鏈接)。 –

1

我認爲,以上所提供的所有信息是不夠好理解的代碼。

但是我覺得你還是「無法看到#8255#錶盤的結果」(PLZ藉口,如果我什麼地方出了錯理解本)

我假設的原因在這之後是針對Android中的USSD代碼的最新錯誤修復之一。 (你可以閱讀更多關於這一點,並檢查您的設備是否在名單上。它的所有網站上)

最後,如果你只是想獲取Android ID通俗易懂,我建議你使用這個APP-

https://play.google.com/store/apps/details?id=com.redphx.deviceid&hl=en

4

有一些方法可以在android手機上獲得唯一標識符。

  1. 的Android ID 它是其上的設備的第一引導所生成的64位的十六進制字符串。 一般情況下,除非出廠重置,否則不會更改。

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

Android ID被認爲不可靠,因爲它有時可能爲空。 該文檔指出它「可以在出廠重置時更改」。 該字符串也可以在固定電話上進行更改。

String m_szAndroidID = Secure.getString(getContentResolver(), Secure.ANDROID_ID); 

Returns: 9774d56d682e549c . No special permissions required. 

2. WLAN MAC地址字符串是另一個可用作設備ID的唯一標識符。 在您閱讀之前,您需要確保您的項目具有android.permission.ACCESS_WIFI_STATE 權限,否則無線局域網MAC地址將爲空。

WifiManager wm = (WifiManager)getSystemService(Context.WIFI_SERVICE); 
String m_szWLANMAC = wm.getConnectionInfo().getMacAddress(); 
Returns: 00:11:22:33:44:55 (not a real address since this is a custom ROM , as you can see the MAC address can easily be faked). 
WLAN doesn't have to be on, to read this value. 

3. BT MAC地址字符串,與藍牙Android設備,可如果你的項目有android.permission.BLUETOOTH權限讀取。

BluetoothAdapter m_BluetoothAdapter = null; // Local Bluetooth adapter 
    m_BluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 
    String m_szBTMAC = m_BluetoothAdapter.getAddress(); 

返回:43:25:78:50:93:38。英國電信不一定要開啓,閱讀它。僅適用於手機使用Android設備 4 IMEI:

TelephonyManager TelephonyMgr = (TelephonyManager)getSystemService(TELEPHONY_SERVICE); 
String szImei = TelephonyMgr.getDeviceId(); // Requires READ_PHONE_STATE 

這需要在AndroidManifest.xml中添加權限,用戶將在安裝 軟件通知:android.permission.READ_PHONE_STATE。 IMEI對於您的手機 而言是唯一的,它看起來像這樣:359881030314356(除非您有一臺預製作設備,其中包含像0000000000000這樣的無效IMEI)。 欲瞭解更多信息,請聯繫refer此鏈接。