Ответ 1
Посмотрите на константу
ANDROID_ID в android.provider.Secure.Settings
, чтобы узнать, помогает ли это.
Я добавляю несколько полезных ссылок из официальных документов;
Мне нужен уникальный идентификатор устройства Android. Я пробовал его со следующим кодом
String ts = Context.TELEPHONY_SERVICE;
TelephonyManager telephonyManager = (TelephonyManager) this.getSystemService(ts);
Однако я знаю, что это работает только для телефонов.
Что делать, если мое приложение работает на ноутбуке, нетбуке или другом устройстве? Как получить уникальный идентификатор в этом случае?
Посмотрите на константу
ANDROID_ID в android.provider.Secure.Settings
, чтобы узнать, помогает ли это.
Я добавляю несколько полезных ссылок из официальных документов;
На телефоне Android есть три типа идентификаторов.
IMSI
String ts = Context.TELEPHONY_SERVICE;
TelephonyManager mTelephonyMgr = (TelephonyManager) getSystemService(ts);
String imsi = mTelephonyMgr.getSubscriberId();
String imei = mTelephonyMgr.getDeviceId();
Идентификатор Android Это 64-разрядная шестнадцатеричная строка, которая генерируется при первой загрузке устройства. Как правило, он не будет изменен, если не будет factory reset.
Secure.getString(getContentResolver(), Secure.ANDROID_ID);
Secure.getString(getContentResolver(), Secure.ANDROID_ID);
Это не будет работать для всех устройств.
Некоторые из устройств Android имеют проблемы. Некоторые устройства возвращают значение null, когда мы пытаемся получить идентификатор устройства. Единственный способ решить эту проблему - сделать pseudodeviceID, который должен быть создан самим. Эта функция создаст уникальное устройство ID для вас. Вы можете вносить изменения в эту функцию по мере необходимости. Я слишком много боролся за решение этой проблемы.
public String getDeviceID() {
/*String Return_DeviceID = USERNAME_and_PASSWORD.getString(DeviceID_key,"Guest");
return Return_DeviceID;*/
TelephonyManager TelephonyMgr = (TelephonyManager) getApplicationContext().getApplicationContext().getSystemService(Context.TELEPHONY_SERVICE);
String m_szImei = TelephonyMgr.getDeviceId(); // Requires
// READ_PHONE_STATE
// 2 compute DEVICE ID
String m_szDevIDShort = "35"
+ // we make this look like a valid IMEI
Build.BOARD.length() % 10 + Build.BRAND.length() % 10
+ Build.CPU_ABI.length() % 10 + Build.DEVICE.length() % 10
+ Build.DISPLAY.length() % 10 + Build.HOST.length() % 10
+ Build.ID.length() % 10 + Build.MANUFACTURER.length() % 10
+ Build.MODEL.length() % 10 + Build.PRODUCT.length() % 10
+ Build.TAGS.length() % 10 + Build.TYPE.length() % 10
+ Build.USER.length() % 10; // 13 digits
// 3 android ID - unreliable
String m_szAndroidID = Secure.getString(getContentResolver(),Secure.ANDROID_ID);
// 4 wifi manager, read MAC address - requires
// android.permission.ACCESS_WIFI_STATE or comes as null
WifiManager wm = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
String m_szWLANMAC = wm.getConnectionInfo().getMacAddress();
// 5 Bluetooth MAC address android.permission.BLUETOOTH required
BluetoothAdapter m_BluetoothAdapter = null; // Local Bluetooth adapter
m_BluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
String m_szBTMAC = m_BluetoothAdapter.getAddress();
System.out.println("m_szBTMAC "+m_szBTMAC);
// 6 SUM THE IDs
String m_szLongID = m_szImei + m_szDevIDShort + m_szAndroidID+ m_szWLANMAC + m_szBTMAC;
System.out.println("m_szLongID "+m_szLongID);
MessageDigest m = null;
try {
m = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
m.update(m_szLongID.getBytes(), 0, m_szLongID.length());
byte p_md5Data[] = m.digest();
String m_szUniqueID = new String();
for (int i = 0; i < p_md5Data.length; i++) {
int b = (0xFF & p_md5Data[i]);
// if it is a single digit, make sure it have 0 in front (proper
// padding)
if (b <= 0xF)
m_szUniqueID += "0";
// add number to string
m_szUniqueID += Integer.toHexString(b);
}
m_szUniqueID = m_szUniqueID.toUpperCase();
Log.i("-------------DeviceID------------", m_szUniqueID);
Log.d("DeviceIdCheck", "DeviceId that generated MPreferenceActivity:"+m_szUniqueID);
return m_szUniqueID;
}
Извините, что ударил старый поток, но эта проблема дает мне головную боль, я нашел хорошую статью для кого-то, чтобы читать, и это очень помогает мне.
Иногда во время разработки приложений Android требуется уникальный идентификатор смартфона на базе Android. Это необходимо в тех случаях, когда пользователь хочет отслеживать уникальные установки устройства в приложении.
Это также полезно в тех случаях, когда разработчик Android хочет отправлять Push-сообщения только нескольким конкретным устройствам. Поэтому здесь необходимо иметь UDID для каждого устройства.
В Android существует много альтернатив UDID устройства. Некоторые из методов получения UDID в приложении android перечислены ниже с его преимуществами и недостатками и любыми необходимыми разрешениями для получения идентификатора устройства.
1) IMEI: (Международная идентификация мобильного оборудования)
Номер IMEI - очень хороший и первичный источник для получения идентификатора устройства. Он уникален для каждого устройства и зависит от устройства. Таким образом, он также уникален для каждого устройства и является постоянным до срока службы устройства.
Фрагмент кода для получения IMEI устройства приведен ниже:
TelephonyManager TelephonyMgr = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
String m_deviceId = TelephonyMgr.getDeviceId();
Для этого вашему приложению потребуется разрешение "android.permission.READ_PHONE_STATE", указанное в файле манифеста.
Преимущества использования IMEI в качестве идентификатора устройства:
IMEI уникален для каждого устройства. Он остается уникальным для устройства, даже если приложение переустановлено или если устройство коренится или factory reset.
Недостатки использования IMEI в качестве идентификатора устройства:
IMEI зависит от слота Simcard устройства, поэтому невозможно получить IMEI для устройств, которые не используют SIM-карту. В Dual sim устройствах мы получаем 2 разных IMEI для одного и того же устройства, так как у него есть 2 слота для simcard.
2) Идентификатор Android
Android_ID - это уникальный 64-разрядный номер, который генерируется и сохраняется при первом загрузке устройства. Android_ID уничтожается, когда устройство factory reset, и новый генерируется.
Код для получения Android_ID показан ниже,
String m_androidId = Secure.getString(getContentResolver(), Secure.ANDROID_ID);
Преимущества использования Android_ID как идентификатора устройства:
Это уникальный идентификатор для всех типов устройств (смартфонов и планшетов). Нет необходимости в каких-либо разрешениях.
Он останется уникальным во всех устройствах и работает на телефонах без слота Simcard.
Недостатки использования Android_ID в качестве идентификатора устройства:
Если версия ОС Android обновляется пользователем, это может измениться. Идентификатор изменяется, если устройство коренится или factory reset выполняется на устройстве. Также существует известная проблема с китайским производителем Android-устройства, что некоторые устройства имеют тот же Android_ID.
3) Строка MAC-адреса WLAN
Мы можем получить уникальный идентификатор для телефонов android, используя MAC-адрес WLAN. MAC-адрес уникален для всех устройств и работает для всех видов устройств.
Фрагмент кода для получения MAC-адреса WLAN для устройства приведен ниже:
WifiManager m_wm = (WifiManager)getSystemService(Context.WIFI_SERVICE);
String m_wlanMacAdd = m_wm.getConnectionInfo().getMacAddress();
Для вашего приложения потребуется разрешение "android.permission.ACCESS_WIFI_STATE", указанное в файле манифеста.
Преимущества использования MAC-адреса WLAN в качестве идентификатора устройства:
Это уникальный идентификатор для всех типов устройств (смартфонов и планшетов). Он остается уникальным, если приложение переустановлено.
Недостатки использования MAC-адреса WLAN в качестве идентификатора устройства:
Если устройство не имеет wifi-оборудования, тогда вы получаете нулевой MAC-адрес, но обычно видно, что большинство устройств Android имеют wifi-аппаратное обеспечение, и на рынке почти нет устройств без оборудования Wi-Fi.
4) Строка адреса Bluetooth
Мы также можем получить уникальный идентификатор для телефонов Android с помощью устройства Bluetooth. Адрес устройства Bluetooth уникален для каждого устройства, имеющего оборудование Bluetooth.
Фрагмент кода для получения адреса устройства Bluetooth приведен ниже,
BluetoothAdapter m_BluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
String m_bluetoothAdd = m_BluetoothAdapter.getAddress();
Чтобы получить вышеуказанный код, вашему приложению требуется разрешение "android.permission.BLUETOOTH", указанное в файле манифеста.
Преимущества использования адреса устройства Bluetooth в качестве идентификатора устройства: Это уникальный идентификатор для всех типов устройств (смартфонов и планшетов). Как правило, на всех устройствах имеется одно Bluetooth-оборудование, и оно не изменяется.
Недостатки использования адреса устройства Bluetooth в качестве идентификатора устройства: Если устройство не имеет Bluetooth-оборудования, тогда вы получите нуль.
Как мне кажется, это несколько из лучших способов получить уникальный идентификатор устройства для смартфона Android и его плюсы и минусы использования. Теперь вам решать, какой метод использовать на основе требований к разработке приложений для Android.
Если есть какие-либо другие методы для получения UDID, и это покрывает недостатки вышеописанных методов, я бы с удовольствием исследовал их в своем приложении для Android. Pl. обмениваться данными в поле комментариев, а также при любых предложениях или запросах.
Подробные инструкции о том, как получить уникальный идентификатор для каждого Android-устройства, на котором установлено ваше приложение, см. в этом официальном блоге разработчиков Android:
http://android-developers.blogspot.com/2011/03/identifying-app-installations.html
Кажется, что лучше всего создать для себя один из них при установке, а затем прочитать его при повторном запуске приложения.
Я лично считаю это приемлемым, но не идеальным. Ни один идентификатор, предоставляемый Android, работает во всех случаях, поскольку большинство из них зависит от состояний радиотелефона (включение/выключение Wi-Fi, включение/выключение соты, включение/выключение 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();
}
}
Используйте MAC-адрес:
Адрес управления доступом к среде передачи (MAC адрес) является уникальным идентификатором назначенные сетевым интерфейсам
У любого устройства, подключенного к сети, гарантированно есть MAC-адрес, и вы можете найти его на Android, выбрав "Настройки" > "О телефоне" > "Состояние".
Вы можете получить адрес Bluetooth Bluetooth с помощью API Bluetooth.
Я не могу писать комментарии сейчас, поэтому пишу здесь.
Вы можете получить MAC-адрес, если сетевое устройство (Bluetooth и т.д.) включено в системе (включено). Но устройство может иметь bluetooth или wi-fi и т.д. Или ничего
Вы можете написать свой собственный уникальный генератор Id (например, с 20 номерами или символами)
Settings.Secure # ANDROID_ID возвращает идентификатор Android в качестве уникальной 64-разрядной шестнадцатеричной строки.
import android.provider.Settings.Secure;
private String android_id = Secure.getString(getContext().getContentResolver(),
Secure.ANDROID_ID);
final TelephonyManager tm = (TelephonyManager) getBaseContext().getSystemService(Context.TELEPHONY_SERVICE);
final String tmDevice, tmSerial, tmPhone, androidId;
tmDevice = "" + tm.getDeviceId();
tmSerial = "" + tm.getSimSerialNumber();
androidId = "" + android.provider.Settings.Secure.getString(getContentResolver(), android.provider.Settings.Secure.ANDROID_ID);
UUID deviceUuid = new UUID(androidId.hashCode(), ((<span id="IL_AD3" class="IL_AD">long</span>)tmDevice.hashCode() << 32) | tmSerial.hashCode());
String deviceId = deviceUuid.toString();
Вы можете попробовать следующее:
String deviceId = Secure.getString(this.getContentResolver(),
Secure.ANDROID_ID);
TextView textAndroidId = (TextView)findViewById(R.id.androidid);
String AndroidId = Settings.Secure.getString(getContentResolver(), Settings.Secure.ANDROID_ID);
textAndroidId.setText("My ID is: " + AndroidId);