Как я могу получить UUID своего телефона Android в приложении?
Я ищу помощь для получения UUID моего телефона Android. Я обыскал сеть и нашел одно потенциальное решение, но оно не работает в эмуляторе.
Вот код:
Class<?> c;
try {
c = Class.forName("android.os.SystemProperties");
Method get = c.getMethod("get", String.class);
serial = (String) get.invoke(c, "ro.serialno");
Log.d("ANDROID UUID",serial);
} catch (Exception e) {
e.printStackTrace();
}
Кто-нибудь знает, почему он не работает, или имеет лучшее решение?
Ответы
Ответ 1
Это работает для меня:
TelephonyManager tManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
String uuid = tManager.getDeviceId();
ИЗМЕНИТЬ:
Вам также нужно android.permission.READ_PHONE_STATE
установить в манифесте. Начиная с Android M, вы должны спросить это разрешение во время выполнения.
Смотрите этот anwser: fooobar.com/questions/132219/...
Ответ 2
Как упоминает Дэйв Уэбб, в Android Developer Blog есть статья, которая охватывает это. Их предпочтительным решением является отслеживание приложений, а не устройств, и это будет хорошо работать для большинства случаев использования. Сообщение в блоге покажет вам необходимый код, чтобы сделать эту работу, и я рекомендую вам проверить его.
Тем не менее, сообщение в блоге продолжает обсуждать решения, если вам нужен идентификатор устройства, а не идентификатор установки приложения. Я поговорил с кем-то в Google, чтобы получить некоторые дополнительные разъяснения по нескольким пунктам в случае, если вам нужно это сделать. Вот что я узнал об идентификаторах устройств, которые НЕ упоминаются в вышеупомянутом сообщении в блоге:
- ANDROID_ID является предпочтительным идентификатором устройства. ANDROID_ID отлично надежен в версиях Android <= 2.1 или >= 2.3. Только 2.2 имеет проблемы, упомянутые в сообщении.
- Несколько устройств нескольких производителей подвержены ошибке ANDROID_ID в версии 2.2.
- Насколько мне удалось определить, все уязвимые устройства те же ANDROID_ID, что 9774d56d682e549c. Это также тот же идентификатор устройства, о котором сообщает эмулятор, кстати.
- Google полагает, что OEM-производители исправили проблему для многих или большинства своих устройств, но я смог проверить, что по состоянию на начало апреля 2011 года, по крайней мере, до сих пор довольно легко найти устройства с разбитым ANDROID_ID.
- Когда устройство имеет несколько пользователей (доступно на некоторых устройствах под управлением Android 4.2 или выше), каждый пользователь отображается как полностью отдельное устройство, поэтому значение ANDROID_ID уникально для каждого пользователя.
Основываясь на рекомендациях Google, я внедрил класс, который будет генерировать уникальный UUID для каждого устройства, используя ANDROID_ID в качестве семени, где это необходимо, при необходимости возвращаться к TelephonyManager.getDeviceId(), и если это не удается, прибегая к случайному сгенерированный уникальный UUID, который сохраняется через перезагрузки приложений (но не для повторной установки приложения).
Обратите внимание, что для устройств, которые должны отступать от идентификатора устройства, уникальный идентификатор WILL сохраняется в factory сбрасывается. Это то, о чем нужно знать. Если вам нужно убедиться, что factory reset будет reset вашим уникальным идентификатором, вы можете захотеть вернуться обратно к случайному UUID вместо идентификатора устройства.
Опять же, этот код предназначен для идентификатора устройства, а не для идентификатора установки приложения. В большинстве случаев идентификатор установки приложения, вероятно, является тем, что вы ищете. Но если вам нужен идентификатор устройства, то для вас, вероятно, будет работать следующий код.
import android.content.Context;
import android.content.SharedPreferences;
import android.provider.Settings.Secure;
import android.telephony.TelephonyManager;
import java.io.UnsupportedEncodingException;
import java.util.UUID;
public class DeviceUuidFactory {
protected static final String PREFS_FILE = "device_id.xml";
protected static final String PREFS_DEVICE_ID = "device_id";
protected static UUID uuid;
public DeviceUuidFactory(Context context) {
if( uuid ==null ) {
synchronized (DeviceUuidFactory.class) {
if( uuid == null) {
final SharedPreferences prefs = context.getSharedPreferences( PREFS_FILE, 0);
final String id = prefs.getString(PREFS_DEVICE_ID, null );
if (id != null) {
// Use the ids previously computed and stored in the prefs file
uuid = UUID.fromString(id);
} else {
final String androidId = Secure.getString(context.getContentResolver(), Secure.ANDROID_ID);
// Use the Android ID unless it broken, in which case fallback on deviceId,
// unless it not available, then fallback on a random number which we store
// to a prefs file
try {
if (!"9774d56d682e549c".equals(androidId)) {
uuid = UUID.nameUUIDFromBytes(androidId.getBytes("utf8"));
} else {
final String deviceId = ((TelephonyManager) context.getSystemService( Context.TELEPHONY_SERVICE )).getDeviceId();
uuid = deviceId!=null ? UUID.nameUUIDFromBytes(deviceId.getBytes("utf8")) : UUID.randomUUID();
}
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
// Write the value out to the prefs file
prefs.edit().putString(PREFS_DEVICE_ID, uuid.toString() ).commit();
}
}
}
}
}
/**
* Returns a unique UUID for the current android device. As with all UUIDs, this unique ID is "very highly likely"
* to be unique across all Android devices. Much more so than ANDROID_ID is.
*
* The UUID is generated by using ANDROID_ID as the base key if appropriate, falling back on
* TelephonyManager.getDeviceID() if ANDROID_ID is known to be incorrect, and finally falling back
* on a random UUID that persisted to SharedPreferences if getDeviceID() does not return a
* usable value.
*
* In some rare circumstances, this ID may change. In particular, if the device is factory reset a new device ID
* may be generated. In addition, if a user upgrades their phone from certain buggy implementations of Android 2.2
* to a newer, non-buggy version of Android, the device ID may change. Or, if a user uninstalls your app on
* a device that has neither a proper Android ID nor a Device ID, this ID may change on reinstallation.
*
* Note that if the code falls back on using TelephonyManager.getDeviceId(), the resulting ID will NOT
* change after a factory reset. Something to be aware of.
*
* Works around a bug in Android 2.2 for many devices when using ANDROID_ID directly.
*
* @see http://code.google.com/p/android/issues/detail?id=10603
*
* @return a UUID that may be used to uniquely identify your device for most purposes.
*/
public UUID getDeviceUuid() {
return uuid;
}
}
Ответ 3
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
Ответ 4
Вместо того, чтобы IMEI из TelephonyManager использовал ANDROID_ID.
Settings.Secure.ANDROID_ID
Это работает для каждого устройства Android независимо от наличия телефонии.
Ответ 5
String id = UUID.randomUUID().toString();
См. статья блога Android Developer для использования класса UUID для получения uuid
Ответ 6
Добавить
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
Метод
String getUUID(){
TelephonyManager teleManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
String tmSerial = teleManager.getSimSerialNumber();
String tmDeviceId = teleManager.getDeviceId();
String androidId = android.provider.Settings.Secure.getString(getContentResolver(), android.provider.Settings.Secure.ANDROID_ID);
if (tmSerial == null) tmSerial = "1";
if (tmDeviceId== null) tmDeviceId = "1";
if (androidId == null) androidId = "1";
UUID deviceUuid = new UUID(androidId.hashCode(), ((long)tmDeviceId.hashCode() << 32) | tmSerial.hashCode());
String uniqueId = deviceUuid.toString();
return uniqueId;
}
Ответ 7
Начиная с API 26, getDeviceId() устарел. Если вам нужно получить IMEI устройства, используйте следующее:
String deviceId = "";
if (Build.VERSION.SDK_INT >= 26) {
deviceId = getSystemService(TelephonyManager.class).getImei();
}else{
deviceId = getSystemService(TelephonyManager.class).getDeviceId();
}