我正在開發一個應用程序,它使用zeroconf(bonjour)來發現設備 - 所以我需要爲每個Android設備提供某種名稱(不僅僅是一堆數字和字母,而是像「亞歷克斯的設備」)。在iOS中,它可以很容易地完成 - 這可能在Android?找到設備的唯一名稱?
回答
可以有許多帳戶鏈接到設備。你可以使用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或類似的。
該帳戶名稱不唯一。我可以將兩臺設備鏈接到相同的Google帳戶。 – 2011-06-01 21:32:04
所以你可以有兩個具有相同用戶名的iphones。我正試圖給出更密切地針對這個問題的答案。 – Aleadam 2011-06-01 21:36:05
這不是他問的。「所以我需要給每個Android設備」。每個...設備,而不是每個...用戶。 – 2011-06-03 01:10:46
可以拿到Android手機的IMEI,其獨特之處,
您可以通過使用方法getDeviceId()
之類的TelephonyManager
注意得到它:你將需要添加一個許可,您的清單:READ_PHONE_STATE
並非所有設備都是手機。 – CommonsWare 2011-06-01 21:31:50
這不會在平板電腦上工作 – Aleadam 2011-06-01 21:33:22
我說Android手機,我沒有說平板電腦,我認爲在平板電腦上,有一個標識符,我沒有工作或使用它,只是「我認爲」:) – Houcine 2011-06-01 22:04:13
假設您的應用程序需要設備具有網絡連接,您可以嘗試使用設備的MAC地址,該設備應該是全局唯一的。這可以通過WifiInfo類獲得:
WifiManager manager = (WifiManager)getSystemService(Context.WIFI_SERVICE);
WifiInfo info = manager.getConnectionInfo();
String macAddress = info.getMacAddress();
您還需要在清單中設置ACCESS_WIFI_STATE權限。
有關如何獲得一個唯一標識您的應用程序是從安裝在每臺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();
}
}
- 1. 加速查找連接到Wifi網絡的設備並獲取設備名稱
- 2. Genymotion設備名稱
- 3. 如何找到Android設備的唯一標識符?
- 4. 如何找到沒有名稱或ID的唯一按鈕?
- 5. 找到給定輸入的唯一路徑名稱
- 6. 如何找到nodejs的連接設備名稱?
- 7. 無法在Xamarin中找到具有該名稱的設備
- 8. Android設備的唯一ID
- 9. 翻轉(。)的唯一名稱
- 10. 爲每次發佈,我如何使我的設備名稱爲唯一?
- 11. Twilio試圖爲會議名稱設置一個唯一的名稱
- 12. 唯一識別設備
- 13. 獲取設備唯一ID
- 14. 爲設備查找並分配一個唯一的IP地址
- 15. LINQ:唯一名稱列表
- 16. 唯一事件名稱
- 17. 生成唯一名稱?
- 18. Android設備名稱==「BlueZ」?
- 19. iPhone藍牙設備名稱
- 20. 獲取設備名稱
- 21. ios設備名稱列表
- 22. CoreBluetooth設備名稱更改
- 23. Javascript小書籤點擊一個按鈕找到的唯一名稱
- 24. 重命名設備(硬編碼設備名稱)
- 25. 尋找隊列中名稱的唯一計數
- 26. SQL 2000/2005/2008 - 查找列的唯一約束名稱
- 27. 查找Excel列中的所有唯一名稱
- 28. ios的唯一設備標識
- 29. 外圍BLE設備的唯一標識
@inazaruk我不相信這是一個欺騙:使用64位十六進制字符串或MAC地址不是我所說的*有意義的事情,如「亞歷克斯的設備」)* – Aleadam 2011-06-01 21:32:23
只問用戶通過字段或首選項的名稱。 – CommonsWare 2011-06-01 21:34:34
@CommonsWare這顯然是最好的解決方案,但它總是很好給一些用戶友好的默認值 – Aleadam 2011-06-01 21:37:44