Найти уникальное имя устройства?

Я разрабатываю приложение, которое использует 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();
    }
}
Другие вопросы по тегам