2010-12-17 120 views
40

我想要一些Android設備的唯一ID。我用下面的代碼試過它Android設備的唯一ID

String ts = Context.TELEPHONY_SERVICE; 
TelephonyManager telephonyManager = (TelephonyManager) this.getSystemService(ts); 

但是我知道這隻適用於手機。

如果我的應用程序在某些筆記本,上網本或其他類型的設備上運行,該怎麼辦?在這種情況下,我如何獲得唯一的ID?

+2

@Mudassir:所以基本上你想要的東西,是 '一成不變', '硬編碼',這永遠不會改變和100%可靠?英特爾嘗試過...閱讀此schneier.com/essay-187.html – Squonk 2010-12-17 08:00:17

+0

@MisterSquonk我想要的東西。我喜歡「鑲石頭」。 :-) – Mudassir 2010-12-17 08:43:50

+0

@Mudassir:祝你好運,但如果你能找到它,我會感到驚訝。至多我會研究最不可能被改變/被黑客攻擊的東西的原則,或者將其作爲可能的'獨特'的基礎。之後,嘗試編寫代碼以彌補一路上的任何問題。 – Squonk 2010-12-17 09:00:58

回答

11

看看常量 ANDROID_IDandroid.provider.Secure.Settings看看是否有幫助。

我在官方文檔中添加了一些有用的鏈接;

+0

http://developer.android.com/reference/android/provider/Settings.Secure.html#ANDROID_ID – Mudassir 2010-12-17 07:23:16

+0

手機重置爲出廠默認設置時可以更改。請參閱之前評論中的鏈接。 – Mudassir 2010-12-17 07:23:42

+1

@Mudassir:這個問題確實會說「如果我的應用程序在某些筆記本,上網本或其他類型的設備上運行,如何在這種情況下獲得唯一的ID? – 2010-12-17 07:25:57

6

使用MAC address

媒體訪問控制地址(MAC 地址)是分配給網絡接口

連接到網絡的任何裝置被保證有一個唯一的標識符 MAC地址,你可以通過轉到設置>關於手機>狀態在Android上找到它。

您應該能夠使用Bluetooth API獲取藍牙Mac地址。

+0

我不知道Android是否免疫,但MAC地址可能僞造在許多系統上。 – Squonk 2010-12-17 07:23:45

+0

它可用於上網本或平板電腦類設備?我怎樣才能以編程方式獲得它? – Mudassir 2010-12-17 07:28:30

+2

是的任何設備上的MAC(或至少是本地報告)都可以被覆蓋。 – 2010-12-17 07:29:26

2

我不能寫評論現在,所以我寫在這裏。

如果網絡設備(藍牙等)在系統中啓用(打開),您可以獲得MAC地址。但是設備可能有藍牙或Wi-Fi等,或沒有

您可以編寫自己的唯一ID發生器(20個數字或符號隨機爲例)

+0

我想識別唯一的設備。我怎樣才能使用隨機數字發生器? – Mudassir 2010-12-17 08:50:22

+0

這是個大問題,因爲UID應該由設備開發人員實施。 生成ID,保存在SharedPrefference中並用於識別設備 – mysuperass 2010-12-17 09:04:12

30

有三種類型的Android手機上的標識符。

  1. IMEI
  2. IMSI

    String ts = Context.TELEPHONY_SERVICE; 
    TelephonyManager mTelephonyMgr = (TelephonyManager) getSystemService(ts); 
    String imsi = mTelephonyMgr.getSubscriberId(); 
    String imei = mTelephonyMgr.getDeviceId(); 
    
  3. 的Android ID 它是其上的設備的第一引導所生成的64位的十六進制字符串。 一般情況下,除非出廠重置,否則不會更改。

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

已更新3:String unique_id = android.provider.Settings.Secure.getString(getContentResolver(),android.provider.Settings.Secure.ANDROID_ID);參考:http://developer.android。com/reference/android/provider/Settings.Secure.html#ANDROID_ID – 2011-08-04 06:56:54

8

有關如何獲得一個唯一標識您的應用程序是從安裝在每臺Android設備,看到這個官方Android開發者博客中詳細說明:

http://android-developers.blogspot.com/2011/03/identifying-app-installations.html

看來最好的方法是在安裝時生成一個自己的文件,然後在應用程序重新啓動時讀取它。

我個人覺得這可以接受但並不理想。沒有任何一個由Android提供的標識符在所有情況下工作,因爲大多數標識符都依賴於手機的無線電狀態(無線開/關,手機開/關,藍牙開/關)。其他像Settings.Secure.ANDROID_ID必須由製造商實施,並不保證是唯一的。

以下是將數據寫入INSTALLATION文件的示例,該文件可與應用程序在本地保存的任何其他數據一起存儲。

public class Installation { 
    private static String sID = null; 
    private static final String INSTALLATION = "INSTALLATION"; 

    public synchronized static String id(Context context) { 
     if (sID == null) { 
      File installation = new File(context.getFilesDir(), INSTALLATION); 
      try { 
       if (!installation.exists()) 
        writeInstallationFile(installation); 
       sID = readInstallationFile(installation); 
      } catch (Exception e) { 
       throw new RuntimeException(e); 
      } 
     } 
     return sID; 
    } 

    private static String readInstallationFile(File installation) throws IOException { 
     RandomAccessFile f = new RandomAccessFile(installation, "r"); 
     byte[] bytes = new byte[(int) f.length()]; 
     f.readFully(bytes); 
     f.close(); 
     return new String(bytes); 
    } 

    private static void writeInstallationFile(File installation) throws IOException { 
     FileOutputStream out = new FileOutputStream(installation); 
     String id = UUID.randomUUID().toString(); 
     out.write(id.getBytes()); 
     out.close(); 
    } 
} 
+0

博客說:「對於絕大多數應用程序,要求是識別特定的安裝,而不是物理設備」,但上面的代碼創建的id不是' t可靠,就好像用戶清除應用程序數據一樣,設備ID被移除並且它創建新的設備ID。測試10次,每次創建新的ID。 :( – junto 2012-03-11 18:16:21

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

這不會對所有的設備上工作。

某些android設備出現問題有些設備在我們嘗試獲取設備ID時返回null。解決此問題的唯一方法是生成應該由我們生成的僞設備ID。此功能將生成一個唯一的設備ID。您可以根據需要對此功能進行更改。我也爲解決此問題而苦苦掙扎。

public String getDeviceID() { 

/*String Return_DeviceID = USERNAME_and_PASSWORD.getString(DeviceID_key,"Guest"); 
return Return_DeviceID;*/ 

TelephonyManager TelephonyMgr = (TelephonyManager) getApplicationContext().getApplicationContext().getSystemService(Context.TELEPHONY_SERVICE); 
String m_szImei = TelephonyMgr.getDeviceId(); // Requires 
// READ_PHONE_STATE 

// 2 compute DEVICE ID 
String m_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 
// 3 android ID - unreliable 
String m_szAndroidID = Secure.getString(getContentResolver(),Secure.ANDROID_ID); 
// 4 wifi manager, read MAC address - requires 
// android.permission.ACCESS_WIFI_STATE or comes as null 
WifiManager wm = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE); 
String m_szWLANMAC = wm.getConnectionInfo().getMacAddress(); 
// 5 Bluetooth MAC address android.permission.BLUETOOTH required 
BluetoothAdapter m_BluetoothAdapter = null; // Local Bluetooth adapter 
m_BluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 
String m_szBTMAC = m_BluetoothAdapter.getAddress(); 
System.out.println("m_szBTMAC "+m_szBTMAC); 

// 6 SUM THE IDs 
String m_szLongID = m_szImei + m_szDevIDShort + m_szAndroidID+ m_szWLANMAC + m_szBTMAC; 
System.out.println("m_szLongID "+m_szLongID); 
MessageDigest m = null; 
try { 
m = MessageDigest.getInstance("MD5"); 
} catch (NoSuchAlgorithmException e) { 
e.printStackTrace(); 
       } 
m.update(m_szLongID.getBytes(), 0, m_szLongID.length()); 
byte p_md5Data[] = m.digest(); 

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); 
} 
m_szUniqueID = m_szUniqueID.toUpperCase(); 

Log.i("-------------DeviceID------------", m_szUniqueID); 
Log.d("DeviceIdCheck", "DeviceId that generated MPreferenceActivity:"+m_szUniqueID); 

return m_szUniqueID; 

} 
+0

不錯,謝謝。:) – Mudassir 2012-04-24 08:46:22

+0

如果你把它正確接受答案...高興地幫助你:-) – 2012-04-24 08:49:09

1

Settings.Secure#ANDROID_ID返回Android ID作爲唯一的64位十六進制字符串。

import android.provider.Settings.Secure; 

private String android_id = Secure.getString(getContext().getContentResolver(), 
                 Secure.ANDROID_ID); 
12

對不起碰到一個古老的線程,但這個問題讓我頭疼,我發現有人讀的好文章,這真的幫助了我很多。

有時在Android應用程序開發期間需要獲取基於Android的智能手機設備的唯一ID。當用戶想要跟蹤應用程序的獨特設備安裝時,這是非常必要的。

這對於Android開發人員只想將推送消息發送給少數特定設備的情況也很有用。因此,在這裏,每個設備都需要有一個UDID。

在Android中,有許多設備UDID的替代品。下面列出了在android應用程序中獲取UDID的一些方法,其優點和缺點以及獲取設備ID的任何必要權限。

  • 的IMEI:(國際移動設備身份)
  • Android的ID
  • 的WLAN MAC地址串
  • 藍牙地址串

1)IMEI:(國際移動設備標識)

IMEI號碼是一個很好的並獲取設備ID的主要來源。它對於每個設備都是獨一無二的,並且依賴於設備硬件。所以它對於每一個設備都是獨一無二的,它在設備的使用壽命中是永久的。

的代碼片段來獲得設備IMEI是如下,

TelephonyManager TelephonyMgr = (TelephonyManager)getSystemService(TELEPHONY_SERVICE); 
String m_deviceId = TelephonyMgr.getDeviceId(); 

對於這個應用程序將需要在清單文件中給出的許可「android.permission.READ_PHONE_STATE」。使用IMEI作爲設備ID的

優點:

該IMEI是爲每個設備是唯一的。 即使應用程序已重新安裝,或者設備已植根或出廠重置,它仍然是唯一的設備。使用IMEI作爲設備ID的

缺點:

IMEI是依賴於裝置的simcard的狹槽,因此,不可能得到用於IMEI不使用simcard的設備。 在Dual sim設備中,我們爲同一設備獲得2個不同的IMEI,因爲它有2個SIM卡插槽。

2)的Android ID

的Android_ID是生成並當設備首次引導存儲一個唯一的64位數字。設備出廠重置並生成新設備時,Android_ID將被清除。

的代碼即可獲得Android_ID如下所示,使用作爲Android_ID設備ID的

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

優點:

它是所有類型的設備的唯一標識符(智能手機和片劑)。 不需要任何許可。

它將在所有設備中保持唯一性,並且適用於沒有SIM卡插槽的手機。

缺點使用Android_ID設備ID的:

如果Android操作系統版本用戶升級那麼這可能會改變。 如果設備在設備上進行了根或出廠重置,則ID將被更改。 另外還有一箇中國的Android設備製造商的一個已知的問題,一些設備具有相同的Android_ID。

3)WLAN MAC地址字符串

我們可以得到使用WLAN MAC地址也是Android手機的唯一ID。 MAC地址對所有設備都是唯一的,適用於各種設備。

的代碼片段來獲得WLAN MAC地址的裝置如下所示,

WifiManager m_wm = (WifiManager)getSystemService(Context.WIFI_SERVICE); 
String m_wlanMacAdd = m_wm.getConnectionInfo().getMacAddress(); 

你的應用程序將需要在清單文件給出的許可「android.permission.ACCESS_WIFI_STATE」。

優點使用WLAN MAC地址作爲設備ID的:

它是所有類型的設備的唯一標識符(智能手機和片劑)。 如果應用程序重新安裝,它仍然是唯一的。

使用WLAN MAC地址作爲設備ID的缺點:

如果設備不具備WiFi硬件,那麼你得到空的MAC地址,但通常可以看出,大多數的Android設備有wifi硬件和有沒有WiFi硬件的市場上的設備幾乎沒有。

4)藍牙地址字符串

我們可以得到使用藍牙設備還Android手機的唯一ID。藍牙設備地址對於具有藍牙硬件的每個設備是唯一的。

的代碼片段,以獲得藍牙設備地址是如下,

BluetoothAdapter m_BluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 
String m_bluetoothAdd = m_BluetoothAdapter.getAddress(); 

要得到上面的代碼,你的應用程序需要在清單文件中給出的許可「android.permission.BLUETOOTH」。

使用藍牙設備地址作爲設備ID的優點設備ID: 它是所有類型設備(智能手機和平板電腦)的唯一標識符。 所有設備中通常都有一個藍牙硬件,它不會被更改。

使用藍牙設備地址作爲設備ID的缺點設備ID: 如果設備沒有藍牙硬件,那麼您將得到空。

正如我所知,這些都是獲得Android智能手機設備唯一設備ID和使用它的優點和缺點的最佳方式。現在,您可以根據Android應用程序開發需求決定使用哪種方法。

如果還有其他的方法來獲取UDID,並且掩蓋了上述方法的缺點,那麼我很樂意在我的Android應用程序中探索這些方法。 PL。分享評論框中的內容以及任何建議或疑問。

Here's the article

0
TextView textAndroidId = (TextView)findViewById(R.id.androidid); 
String AndroidId = Settings.Secure.getString(getContentResolver(), Settings.Secure.ANDROID_ID); 
textAndroidId.setText("My ID is: " + AndroidId); 
1
final TelephonyManager tm = (TelephonyManager) getBaseContext().getSystemService(Context.TELEPHONY_SERVICE); 

    final String tmDevice, tmSerial, tmPhone, 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(), ((<span id="IL_AD3" class="IL_AD">long</span>)tmDevice.hashCode() << 32) | tmSerial.hashCode()); 
    String deviceId = deviceUuid.toString(); 
1

你可以試試這個:

String deviceId = Secure.getString(this.getContentResolver(), 
       Secure.ANDROID_ID);