Это происходит потому, что вы переопределяете неправильный метод. Если вы переопределяете
public void init(ServletConfig config) throws ServletException {
super.init(config);
ServletContext sc = getServletContext();
}
Вместо переопределения init(ServletConfig)
просто переопределите метод ниже, и он будет вызываться GenericServlet.init(ServletConfig config)
public void init() throws ServletException {
ServletContext sc = getServletContext();
}
Settings.Secure#ANDROID_ID
возвращает Android ID как уникальную для каждого пользователя 64-битную шестнадцатеричную строку.
import android.provider.Settings.Secure;
private String android_id = Secure.getString(getContext().getContentResolver(),
Secure.ANDROID_ID);
Да, Каждое устройство на базе Android имеют уникальные порядковые номера, от которых Вы можете способный получить его ниже кода. Сборка. ПОСЛЕДОВАТЕЛЬНЫЙ, Но примечание, что это было только добавлено на уровне API 9, и это не может присутствовать на всех устройствах. Для получения уникального идентификатора на более ранних платформах необходимо будет считать что-то как MAC-адрес или IMEI.
ОБНОВЛЕНИЕ : в последних версиях Android многие проблемы с ANDROID_ID
были решены, и я считаю, что в таком подходе больше нет необходимости. Взгляните на ответ Энтони .
Полное раскрытие: в моем приложении изначально использовался описанный ниже подход, но он больше не используется, и теперь мы используем подход, описанный в блоге разработчиков Android , в котором ответ emmby ссылается на (а именно, создание и сохранение UUID # randomUUID ()
).
На этот вопрос есть много ответов, большинство из которых сработает лишь «иногда», и, к сожалению, этого недостаточно.
На основе моих тестов устройств (все телефоны, хотя бы один из которых не активирован):
TelephonyManager.getDeviceId ()
TelephonyManager.getSimSerialNumber ()
getSimSerialNumber ()
(как и ожидалось) ANDROID_ID
ANDROID_ID
и TelephonyManager.getDeviceId ()
- если учетная запись Google была добавлена во время настройки. Итак, если вам нужно что-то уникальное для самого устройства, TM.getDeviceId ()
должно быть достаточно . Очевидно, что некоторые пользователи более параноики, чем другие, поэтому может быть полезно хешировать 1 или несколько из этих идентификаторов, чтобы строка по-прежнему была фактически уникальной для устройства, но не определяла явным образом фактическое устройство пользователя. Например, использование String.hashCode ()
в сочетании с UUID:
final TelephonyManager tm = (TelephonyManager) getBaseContext().getSystemService(Context.TELEPHONY_SERVICE);
final String tmDevice, tmSerial, 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(), ((long)tmDevice.hashCode() << 32) | tmSerial.hashCode());
String deviceId = deviceUuid.toString();
может привести к примерно так: 00000000-54b3-e7c7-0000-000046bffd97
Он работает достаточно хорошо для меня.
Как Ричард упоминает ниже, не забывайте, что вам нужно разрешение на чтение свойств TelephonyManager
, поэтому добавьте это в свой манифест:
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
import libs
import android.content.Context;
import android.telephony.TelephonyManager;
import android.view.View;
Также вы можете рассмотреть MAC-адрес адаптера Wi-Fi. Получено таким образом:
WifiManager wm = (WifiManager)Ctxt.getSystemService(Context.WIFI_SERVICE);
return wm.getConnectionInfo().getMacAddress();
Требуется разрешение android.permission.ACCESS_WIFI_STATE
в манифесте.
Доступно, даже если Wi-Fi не подключен. Если бы Джо из приведенного выше ответа попробовал это на своих многочисленных устройствах, это было бы хорошо.
На некоторых устройствах он недоступен, когда Wi-Fi отключен.
ПРИМЕЧАНИЕ. Из Android 6.x он возвращает согласованный поддельный MAC-адрес: 02: 00: 00: 00: 00: 00
Для получения идентификатора пользователя, можно использовать Google Play Licensing Library.
Для загрузки этой библиотеки открывают SDK Manager => SDK Tools. Путь к загруженным файлам библиотеки:
path_to_android_sdk_on_your_pc/extras/google/market_licensing/library
Включает библиотеку в Ваш проект (можно просто скопировать его файлы).
Следующий Вам нужна некоторая реализация Policy
интерфейс (можно просто использовать один из двух файлов из библиотеки: ServerManagedPolicy
или StrictPolicy
).
идентификатор пользователя будет предоставлен Вам в processServerResponse()
функция:
public void processServerResponse(int response, ResponseData rawData) {
if(rawData != null) {
String userId = rawData.userId
// use/save the value
}
// ...
}
Следующий необходимо создать LicenseChecker
с политикой и вызовом checkAccess()
функция. Используйте MainActivity.java
в качестве примера того, как сделать это. MainActivity.java
расположен в этой папке:
[1 120] не забывают добавлять разрешение CHECK_LICENSE к Вашему AndroidManifest.xml.path_to_android_sdk_on_your_pc/extras/google/market_licensing/sample/src/com/example/android/market/licensing
[еще 1121] о Лицензировании Библиотеки: https://developer.android.com/google/play/licensing
android.telephony.TelephonyManager.getDeviceId()
Это возвратится, любая строка однозначно определяет устройство (IMEI на GSM, MEID для CDMA).
Вам будет нужно следующее разрешение в Вашем AndroidManifest.xml:
<uses-permission android:name="android.permission.READ_PHONE_STATE" />