Найти уникальное имя устройства?
Я разрабатываю приложение, которое использует zeroconf (bonjour) для обнаружения устройств - поэтому мне нужно дать каждому устройству Android какое-то имя (не просто набор цифр и букв, а что-то значимое, например, "Устройство Алекса"). В iOS это легко сделать - это возможно в Android?
4 ответа
С устройством может быть связано много аккаунтов. Вы можете использовать AccountManager, чтобы получить их. Например, электронные письма в аккаунтах Google:
AccountManager am = AccountManager.get(this);
Account[] ac = am.getAccountsByType("com.google");
for (Account account : ac) {
Log.d ("Account", ac.name);
}
Кроме того, вы можете использовать android.os.Build.MODEL или аналогичный.
Предполагая, что ваше приложение требует, чтобы устройство имело сетевое соединение, вы можете попробовать использовать MAC-адрес устройства, который должен быть глобально уникальным. Это можно получить с помощью класса WifiInfo:
WifiManager manager = (WifiManager)getSystemService(Context.WIFI_SERVICE);
WifiInfo info = manager.getConnectionInfo();
String macAddress = info.getMacAddress();
Вам также необходимо установить разрешение ACCESS_WIFI_STATE в своем манифесте.
Вы можете получить IMEI телефона Android, он уникален,
Вы можете получить его с помощью метода getDeviceId()
класса TelephonyManager
ПРИМЕЧАНИЕ: вам нужно будет добавить разрешение в манифест: READ_PHONE_STATE
Подробные инструкции о том, как получить уникальный идентификатор для каждого устройства Android, с которого установлено приложение, см. В этом официальном блоге разработчиков Android:
http://android-developers.blogspot.com/2011/03/identifying-app-installations.html
Кажется, лучший способ для вас - сгенерировать себя при установке, а затем прочитать его при перезапуске приложения.
Я лично считаю это приемлемым, но не идеальным. Ни один идентификатор, предоставляемый Android, не работает во всех случаях, поскольку большинство из них зависят от состояния радиосвязи телефона (вкл / выкл wifi, вкл / выкл сотовой связи, вкл / выкл bluetooth). Другие, такие как 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();
}
}