2014-03-30 173 views
5

我需要唯一標識一個Android設備。我讀了ANDROID_ID,但它似乎有問題與Android 2.2。然後還有其他與TelephonyManager相關的標識符,但我認爲它們不適用於平板電腦。
因此,尋找在每個設備上工作的東西,我偶然發現了GSF ID KEY(谷歌服務框架ID)。你們認爲這是一個可靠且始終有效的解決方案嗎? 這是我發現檢索GSF ID KEY代碼:GSF ID KEY(谷歌服務框架ID)作爲Android設備唯一標識符

private static String getGsfAndroidId(Context context) 
{ 
    Uri URI = Uri.parse("content://com.google.android.gsf.gservices"); 
    String ID_KEY = "android_id"; 
    String params[] = {ID_KEY}; 
    Cursor c = context.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; 
    } 
} 
+0

這段代碼中的URI是什麼? – aasha

+0

抱歉,我忘了將它放在代碼片段中,現在沒關係 – user2461515

回答

5

萬一人,如果這種方法可行的答案是肯定的,我想它(在一個應用程序,我把在Android中使用它知道市場上有成千上萬的下載),它的工作原理。請注意:每當用戶重新設置出廠設置或使用Google服務時,GSF ID KEY都會發生變化,但對於我的目的而言,這足夠好了。

+0

您是否必須添加'com.google.android.providers.gsf.permission.READ_GSERVICES'權限? – cprcrack

+0

不,它不需要任何權限 – user2461515

+0

那麼,我不得不在我的情況下(Nexus 5與Android 5.0),否則會引發異常。您可以使用搭配Android 5.0的Nexus 5驗證它是否適合您的用戶嗎? – cprcrack

0

不能談論生產測試,但我注意到在我的Nexus 5與Android 5.0,我不得不添加以下權限:com.google.android.providers.gsf.permission.READ_GSERVICES。否則在使用您的代碼時會引發異常。

1

使用Android Studio,我從lint獲得自動推薦。這裏是修改後的代碼。它可以解決異常報告的問題https://stackoverflow.com/users/423171/cprcrack

private static String getGsfAndroidId(Context context) 
{ 
    Uri URI = Uri.parse("content://com.google.android.gsf.gservices"); 
    String ID_KEY = "android_id"; 
    String params[] = {ID_KEY}; 
    Cursor c = context.getContentResolver().query(URI, null, null, params, null); 
    if (c != null && (!c.moveToFirst() || c.getColumnCount() < 2)){ 
     if(!c.isClosed()) 
      c.close(); 
     return null; 
    } 

    try { 
     if (c != null) { 
      String result = Long.toHexString(Long.parseLong(c.getString(1))); 
      if(!c.isClosed()) 
       c.close(); 
      return result; 
     }else { 
      return null; 
     } 
    } catch (NumberFormatException e) { 
     if(!c.isClosed()) 
      c.close(); 
     return null; 
    } 
}