Существует ли уникальный идентификатор устройства Android? - PullRequest
2562 голосов
/ 07 мая 2010

Имеют ли устройства Android уникальный идентификатор, и если да, то какой простой способ получить к нему доступ с помощью Java?

Ответы [ 43 ]

34 голосов
/ 25 января 2011

Следующий код возвращает серийный номер устройства с помощью скрытого API Android. Но этот код не работает на Samsung Galaxy Tab, потому что "ro.serialno" не установлен на этом устройстве.

String serial = null;

try {
    Class<?> c = Class.forName("android.os.SystemProperties");
    Method get = c.getMethod("get", String.class);
    serial = (String) get.invoke(c, "ro.serialno");
}
catch (Exception ignored) {

}
22 голосов
/ 17 мая 2011

Используя приведенный ниже код, вы можете получить уникальный идентификатор устройства на ОС Android в виде строки.

deviceId = Secure.getString(getApplicationContext().getContentResolver(), Secure.ANDROID_ID); 
18 голосов
/ 06 марта 2011
Поле

A Serial было добавлено в класс Build на уровне API 9 (Android 2.3 - Gingerbread). Документация говорит, что это представляет серийный номер оборудования. При этом он должен быть уникальным, если он существует на устройстве.

Я не знаю, поддерживается ли он (= не ноль) всеми устройствами с уровнем API> = 9.

15 голосов
/ 21 марта 2011

Одна вещь, которую я добавлю - у меня одна из этих уникальных ситуаций.

Использование:

deviceId = Secure.getString(this.getContext().getContentResolver(), Secure.ANDROID_ID);

Оказывается, что, хотя мой планшет Viewsonic G сообщает об идентификаторе DeviceID, который неНет, все планшеты G сообщают одно и то же число.

Это делает интересной игру в "Pocket Empires", которая дает вам мгновенный доступ к чьей-либо учетной записи на основе "уникального" идентификатора устройства.

Мое устройство делаетнет сотового радио.

14 голосов
/ 02 августа 2011

Подробные инструкции о том, как получить уникальный идентификатор для каждого устройства Android, с которого установлено приложение, см. В официальном блоге разработчиков Android * Определение установок приложения .

Похоже, что лучший способ для вас - сгенерировать его самостоятельно при установке и впоследствии прочитать его при перезапуске приложения.

Лично я считаю это приемлемым, но не идеальным. Ни один идентификатор, предоставляемый Android, не работает во всех случаях, так как большинство из них зависит от состояния радиосвязи телефона (вкл / выкл Wi-Fi, вкл / выкл сотовой связи, вкл / выкл Bluetooth). Другие, такие как Settings.Secure.ANDROID_ID, должны быть реализованы производителем и не обязательно должны быть уникальными.

Ниже приведен пример записи данных в установочный файл, который будет храниться вместе с любыми другими данными, которые приложение сохраняет локально.

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();
    }
}
10 голосов
/ 27 февраля 2013

Добавить код ниже в файле класса:

final TelephonyManager tm = (TelephonyManager) getBaseContext()
            .getSystemService(SplashActivity.TELEPHONY_SERVICE);
    final String tmDevice, tmSerial, androidId;
    tmDevice = "" + tm.getDeviceId();
    Log.v("DeviceIMEI", "" + tmDevice);
    tmSerial = "" + tm.getSimSerialNumber();
    Log.v("GSM devices Serial Number[simcard] ", "" + tmSerial);
    androidId = "" + android.provider.Settings.Secure.getString(getContentResolver(),
            android.provider.Settings.Secure.ANDROID_ID);
    Log.v("androidId CDMA devices", "" + androidId);
    UUID deviceUuid = new UUID(androidId.hashCode(),
            ((long) tmDevice.hashCode() << 32) | tmSerial.hashCode());
    String deviceId = deviceUuid.toString();
    Log.v("deviceIdUUID universally unique identifier", "" + deviceId);
    String deviceModelName = android.os.Build.MODEL;
    Log.v("Model Name", "" + deviceModelName);
    String deviceUSER = android.os.Build.USER;
    Log.v("Name USER", "" + deviceUSER);
    String devicePRODUCT = android.os.Build.PRODUCT;
    Log.v("PRODUCT", "" + devicePRODUCT);
    String deviceHARDWARE = android.os.Build.HARDWARE;
    Log.v("HARDWARE", "" + deviceHARDWARE);
    String deviceBRAND = android.os.Build.BRAND;
    Log.v("BRAND", "" + deviceBRAND);
    String myVersion = android.os.Build.VERSION.RELEASE;
    Log.v("VERSION.RELEASE", "" + myVersion);
    int sdkVersion = android.os.Build.VERSION.SDK_INT;
    Log.v("VERSION.SDK_INT", "" + sdkVersion);

Добавить в AndroidManifest.xml:

<uses-permission android:name="android.permission.READ_PHONE_STATE" />
9 голосов
/ 13 января 2014

Уникальный идентификатор устройства Android OS как String, используя TelephonyManager и ANDROID_ID, получается:

String deviceId;
final TelephonyManager mTelephony = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
if (mTelephony.getDeviceId() != null) {
    deviceId = mTelephony.getDeviceId();
}
else {
    deviceId = Secure.getString(
                   getApplicationContext().getContentResolver(),
                   Secure.ANDROID_ID);
}

Но я настоятельно рекомендую метод, предложенный Google, см. Определение установок приложения .

8 голосов
/ 18 ноября 2012

Существует много разных подходов к решению этих ANDROID_ID проблем (может быть null, иногда или устройства определенной модели всегда возвращают один и тот же идентификатор) с плюсами и минусами:

  • Реализация собственного алгоритма генерации идентификатора (на основе свойств устройства, которые должны быть статическими и не изменятся -> кто знает)
  • Злоупотребление другими идентификаторами, такими как IMEI , серийный номер, Wi-Fi / Bluetooth-MAC-адрес (они не будут существовать на всех устройствах или требуются дополнительные разрешения)

Я сам предпочитаю использовать существующую реализацию OpenUDID (см. https://github.com/ylechelle/OpenUDID) для Android (см. https://github.com/vieux/OpenUDID).). Простая интеграция и использование ANDROID_ID с запасными вариантами для указанных выше проблем.

7 голосов
/ 27 мая 2013

Вот как я генерирую уникальный идентификатор:

public static String getDeviceId(Context ctx)
{
    TelephonyManager tm = (TelephonyManager) ctx.getSystemService(Context.TELEPHONY_SERVICE);

    String tmDevice = tm.getDeviceId();
    String androidId = Secure.getString(ctx.getContentResolver(), Secure.ANDROID_ID);
    String serial = null;
    if(Build.VERSION.SDK_INT > Build.VERSION_CODES.FROYO) serial = Build.SERIAL;

    if(tmDevice != null) return "01" + tmDevice;
    if(androidId != null) return "02" + androidId;
    if(serial != null) return "03" + serial;
    // other alternatives (i.e. Wi-Fi MAC, Bluetooth MAC, etc.)

    return null;
}
7 голосов
/ 15 июля 2011

Как насчет IMEI . Это уникально для Android или других мобильных устройств.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...