2011-06-01 100 views
0

我正在開發一個應用程序,它使用zeroconf(bonjour)來發現設備 - 所以我需要爲每個Android設備提供某種名稱(不僅僅是一堆數字和字母,而是像「亞歷克斯的設備」)。在iOS中,它可以很容易地完成 - 這可能在Android?找到設備的唯一名稱?

+0

@inazaruk我不相信這是一個欺騙:使用64位十六進制字符串或MAC地址不是我所說的*有意義的事情,如「亞歷克斯的設備」)* – Aleadam 2011-06-01 21:32:23

+1

只問用戶通過字段或首選項的名稱。 – CommonsWare 2011-06-01 21:34:34

+1

@CommonsWare這顯然是最好的解決方案,但它總是很好給一些用戶友好的默認值 – Aleadam 2011-06-01 21:37:44

回答

1

可以有許多帳戶鏈接到設備。你可以使用AccountManager來獲取它們。例如,谷歌帳戶上的電子郵件:

AccountManager am = AccountManager.get(this); 

Account[] ac = am.getAccountsByType("com.google"); 

for (Account account : ac) { 
    Log.d ("Account", ac.name); 
} 

或者,您可以使用android.os.Build.MODEL或類似的。

+0

該帳戶名稱不唯一。我可以將兩臺設備鏈接到相同的Google帳戶。 – 2011-06-01 21:32:04

+0

所以你可以有兩個具有相同用戶名的iphones。我正試圖給出更密切地針對這個問題的答案。 – Aleadam 2011-06-01 21:36:05

+0

這不是他問的。「所以我需要給每個Android設備」。每個...設備,而不是每個...用戶。 – 2011-06-03 01:10:46

0

可以拿到Android手機的IMEI,其獨特之處,

您可以通過使用方法getDeviceId()之類的TelephonyManager

注意得到它:你將需要添加一個許可,您的清單:READ_PHONE_STATE

+1

並非所有設備都是手機。 – CommonsWare 2011-06-01 21:31:50

+0

這不會在平板電腦上工作 – Aleadam 2011-06-01 21:33:22

+0

我說Android手機,我沒有說平板電腦,我認爲在平板電腦上,有一個標識符,我沒有工作或使用它,只是「我認爲」:) – Houcine 2011-06-01 22:04:13

1

假設您的應用程序需要設備具有網絡連接,您可以嘗試使用設備的MAC地址,該設備應該是全局唯一的。這可以通過WifiInfo類獲得:

WifiManager manager = (WifiManager)getSystemService(Context.WIFI_SERVICE); 
WifiInfo info = manager.getConnectionInfo(); 
String macAddress = info.getMacAddress(); 

您還需要在清單中設置ACCESS_WIFI_STATE權限。

0

有關如何獲得一個唯一標識您的應用程序是從安裝在每臺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(); 
    } 
}