Android provider settings secure

Существует ли уникальный идентификатор устройства Android?

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

Settings.Secure#ANDROID_ID возвращает идентификатор Android как уникальную для каждого пользователя 64-битную шестнадцатеричную строку.

ОБНОВЛЕНИЕ : В последних версиях Android многие проблемы ANDROID_ID были решены, и я считаю, что такой подход больше не нужен. Пожалуйста, взгляните на ответ Энтони .

Полное раскрытие: мое приложение изначально использовало описанный ниже подход, но больше не использует этот подход, и теперь мы используем подход, изложенный в записи блога Android Developer Blog, на которую ссылается ответ emmby (а именно, создание и сохранение a UUID#randomUUID() ).

Есть много ответов на этот вопрос, большинство из которых будет работать только «некоторое время», и, к сожалению, этого недостаточно.

На основании моих тестов устройств (все телефоны, хотя бы один из которых не активирован):

  1. Все протестированные устройства вернули значение для TelephonyManager.getDeviceId()
  2. Все устройства GSM (все протестированные с SIM-картой) вернули значение для TelephonyManager.getSimSerialNumber()
  3. Все устройства CDMA вернули ноль для getSimSerialNumber() (как и ожидалось)
  4. Все устройства с добавленной учетной записью Google вернули значение для ANDROID_ID
  5. Все устройства CDMA возвращали одно и то же значение (или производное одно и то же значение) для обоих ANDROID_ID и TelephonyManager.getDeviceId() — до тех пор, пока учетная запись Google была добавлена ​​во время установки.
  6. У меня еще не было возможности протестировать устройства GSM без SIM-карты, устройство GSM без добавленной учетной записи Google или какое-либо из устройств в режиме полета.

Так что если вы хотите что-то уникальное для самого устройства, TM.getDeviceId() должно быть достаточно. Очевидно, что некоторые пользователи более параноидальны, чем другие, поэтому может быть полезно хешировать 1 или более этих идентификаторов, чтобы строка по-прежнему оставалась практически уникальной для устройства, но явно не идентифицировала фактическое устройство пользователя. Например, используя в String.hashCode() сочетании с UUID:

может привести к чему-то вроде: 00000000-54b3-e7c7-0000-000046bffd97

Это работает достаточно хорошо для меня.

Как упоминает Ричард ниже, не забывайте, что вам нужно разрешение на чтение TelephonyManager свойств, поэтому добавьте это в свой манифест:

Последнее обновление: 02.06.15

После прочтения каждого поста о переполнении стека о создании уникального идентификатора, блога разработчиков Google и документации по Android, я чувствую, что «псевдоидентификация» — лучший вариант

Основная проблема: оборудование против программного обеспечения

аппаратные средства

  • Пользователи могут менять свое оборудование, планшет Android или телефон, поэтому уникальные идентификаторы, основанные на оборудовании, не являются хорошими идеями для отслеживания пользователей
  • За ОТСЛЕЖИВАНИЯ ОБОРУДОВАНИЯ это отличная идея

Програмное обеспечение

  • Пользователи могут стереть / изменить свой ПЗУ, если они рутированы
  • Вы можете отслеживать пользователей на разных платформах (iOS, Android, Windows и Web)
  • Лучшее желание отследить индивидуального пользователя с его согласия — просто попросить его войти (сделайте это без проблем, используя OAuth)
Читайте также:  Target sdk android что это

Общий срыв с Android

— Гарантия уникальности (включая рутированные устройства) для API> = 9/10 (99,5% устройств Android)

— Нет дополнительных разрешений

Спасибо @stansult за публикацию всех наших опций (в этом вопросе о переполнении стека).

Список опций — причины, почему / почему не стоит их использовать:

Электронная почта пользователя — Программное обеспечение

  • Пользователь может изменить адрес электронной почты — очень маловероятно
  • API 5+ или
  • API 14+ ( Как получить основной адрес электронной почты устройства Android )

Номер телефона пользователя — Программное обеспечение

  • Пользователи могут менять номера телефонов — крайне маловероятно

IMEI — Hardware (только телефоны, нужны android.permission.READ_PHONE_STATE )

  • Большинство пользователей ненавидят тот факт, что в разрешении написано «Телефонные звонки». Некоторые пользователи дают плохие оценки, потому что они считают, что вы просто крадете их личную информацию, когда все, что вы действительно хотите сделать, это отслеживать установку устройства. Очевидно, что вы собираете данные.

Идентификатор Android — Аппаратное обеспечение (может быть нулевым, может изменяться после сброса к заводским настройкам, может быть изменено на корневом устройстве)

  • Так как это может быть ‘null’, мы можем проверить ‘null’ и изменить его значение, но это означает, что он больше не будет уникальным.
  • Если у вас есть пользователь с устройством сброса к заводским настройкам, значение может быть изменено или изменено на корневом устройстве, поэтому могут быть дубликаты записей, если вы отслеживаете установки пользователей.

WLAN MAC-адрес — Аппаратное обеспечение (необходимо android.permission.ACCESS_WIFI_STATE )

  • Это может быть второй лучший вариант, но вы все еще собираете и храните уникальный идентификатор, который приходит непосредственно от пользователя. Это очевидно, что вы собираете данные.

Bluetooth MAC Address — Hardware (устройства с Bluetooth, нужны android.permission.BLUETOOTH )

  • Большинство приложений на рынке не используют Bluetooth, и поэтому, если ваше приложение не использует Bluetooth, и вы включаете это, пользователь может заподозрить.

Pseudo-Unique ID — Программное обеспечение (для всех устройств Android)

  • Очень возможно, может содержать столкновения — см. Мой метод, опубликованный ниже!
  • Это позволяет вам иметь «почти уникальный» идентификатор пользователя, не принимая ничего личного. Вы можете создать свой собственный анонимный идентификатор из информации об устройстве.

Я знаю, что не существует «идеального» способа получения уникального идентификатора без использования разрешений; Однако иногда нам действительно нужно отслеживать установку устройства. Когда дело доходит до создания уникального идентификатора, мы можем создать «псевдо уникальный идентификатор», основанный исключительно на информации, которую нам предоставляет API Android без использования дополнительных разрешений. Таким образом, мы можем проявить уважение к пользователю и попытаться предложить хороший пользовательский опыт.

С псевдо-уникальным идентификатором вы действительно сталкиваетесь только с тем фактом, что могут быть дубликаты, основанные на том факте, что существуют подобные устройства. Вы можете настроить комбинированный метод, чтобы сделать его более уникальным; однако, некоторые разработчики должны отслеживать установку устройств, и это будет способствовать достижению цели или производительности на основе аналогичных устройств.

API> = 9:

Если их Android-устройство имеет API 9 или более поздней версии, оно гарантированно будет уникальным из-за поля «Build.SERIAL».

ПОМНИТЕ , технически вы пропускаете только около 0,5% пользователей с API

Новое (для приложений с рекламой и сервисами Google Play):

Из консоли разработчика Google Play:

Начиная с 1 августа 2014 г. в соответствии с политикой программы разработчиков Google Play все новые загрузки и обновления приложений должны использовать рекламный идентификатор вместо любых других постоянных идентификаторов для любых рекламных целей. Учить больше

Реализация :

Читайте также:  Android телевизоры supra stv

Источник / Docs:

Важный:

Предполагается, что рекламный идентификатор полностью заменит существующее использование других идентификаторов в рекламных целях (например, использование ANDROID_ID в Settings.Secure), когда службы Google Play доступны. Случаи, когда Сервисы Google Play недоступны, указываются в исключении GooglePlayServicesNotAvailableException, генерируемом getAdvertisingIdInfo ().

Внимание, пользователи могут сбросить:

Я пытался ссылаться на каждую ссылку, с которой я взял информацию. Если вы пропали без вести и должны быть включены, пожалуйста, прокомментируйте!

Идентификатор экземпляра служб Google Player

Как упоминает Дейв Уэбб, в блоге разработчиков Android есть статья , в . Их предпочтительным решением является отслеживание установок приложений, а не устройств, и это будет хорошо работать в большинстве случаев использования. В блоге будет показан необходимый код для этой работы, и я рекомендую вам проверить его.

Тем не менее, в блоге обсуждаются решения, если вам нужен идентификатор устройства, а не идентификатор установки приложения. Я поговорил с кем-то из Google, чтобы получить дополнительные разъяснения по нескольким пунктам на тот случай, если вам нужно это сделать. Вот что я обнаружил об идентификаторах устройств, которые НЕ упоминаются в вышеупомянутом сообщении в блоге:

  • ANDROID_ID является предпочтительным идентификатором устройства. ANDROID_ID абсолютно надежен в версиях Android = 2.3. Только 2.2 имеет проблемы, упомянутые в посте.
  • На несколько устройств нескольких производителей влияет ошибка ANDROID_ID в 2.2.
  • Насколько я смог определить, все затронутые устройства имеют одинаковый ANDROID_ID , который 9774d56d682e549c . Который также является идентичным идентификатором устройства, сообщаемым эмулятором, кстати.
  • Google считает, что производители исправили проблему для многих или большинства своих устройств, но я смог убедиться, что по крайней мере на начало апреля 2011 года найти устройства с поврежденным ANDROID_ID по-прежнему довольно легко.

Основываясь на рекомендациях Google, я реализовал класс, который будет генерировать уникальный UUID для каждого устройства, используя ANDROID_ID в качестве начального числа, где это необходимо, используя при необходимости TelephonyManager.getDeviceId (), а в случае неудачи прибегая к случайно сгенерированному уникальному UUID. это сохраняется при перезапуске приложения (но не при переустановке приложения).

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

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

Источник

Как включить или отключить GPS программно на Android?

Я знаю, что вопрос о включении / выключении GPS программно на android и было обсуждали много времени, и ответ всегда один:

» вы не можете по соображениям безопасности / конфиденциальности, вы должны переслать на экран настроек местоположения и позволить пользователю включить/отключить его.»

Я понимаю, что, однако я недавно купил Таскер от рынок и, среди многих других вещей, которые вы можете сделать с ним, вы можете установить правила автоматического включения GPS при входе в предопределенные приложения и отключить его при выходе (см. здесь для учебника о том, как это сделать, и это просто работает!) и это приложение не может быть подписано с ключом подписи прошивки, поскольку он работает на многих версиях android и разных устройствах, и вам даже не нужно быть укорененным.

Читайте также:  Gps рулетка для андроид

Я хотел бы сделать это в мое приложение. Конечно, я не хочу взрываться. конфиденциальность пользователей, поэтому я бы сначала спросил пользователя, хочет ли он включить его автоматически с типичным флажком «запомнить мое решение», и если он ответит «да», включите его.

есть ли у кого-нибудь идеи или подсказки о том, как Tasker достигает этого?

13 ответов

GPS можно переключить с помощью эксплуатации ошибка в виджете power manager. смотрите это XDA нить для обсуждения.

вот пример кода, который я использую

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

все эти ответы теперь не допускаются. Вот правильный ответ:

для всех тех, кто все еще ищет ответ:

вот как OLA Cabs и другие такие приложения делают это.

добавьте это в свой onCreate

это имплантированные методы:

Это, чтобы помочь другим ребятам, если они все еще борются:

редактировать: добавление комментария Ирфана раза для получения дополнительной помощи.

этот код работает на корни телефоны если приложение перемещено в /system/aps , и у них есть следующие разрешения в манифесте:

код

начиная с Android версии 4.4, вы не можете включить/отключить gps программно. Если вы попробуете код, предложенный на ответ исключение будет уволен.

вместо использования настроек intent.ACTION_LOCATION_SOURCE_SETTINGS вы можете непосредственно в состоянии показать всплывающее окно в вашем приложении, как Google Map & on Gps по нажатию кнопки ok их нет необходимости перенаправлять на настройку просто вам нужно использовать мой код как

Примечание : эта строка кода автоматически открыть диалоговое окно, если местоположение не дальше. Этот кусок используется в Google Map также

Примечание: эта строка кода автоматически открывает диалоговое окно, если Location не включен. Этот кусок используется в Google Map также

чтобы включить или выключить GPS программно, вам нужен «корневой» доступ и BusyBox установлен. Даже с ними задача не тривиальна.

испытано с андроидами 2.3.5 и 4.1.2.

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

это решение потребует WRITE_SETTINGS и WRITE_SECURE_SETTINGS разрешения.

может быть, с отражением трюков вокруг класса android.server.LocationManagerService .

этот код работает на корневых телефонах:

для выключения GPS вы можете использовать эту команду вместо

вы также можете переключать точность сети, используя следующие команды: для включения используйте:

и для выключения вы можете использовать:

все изменилось с тех пор, как этот вопрос был опубликован, теперь с новым API сервисов Google вы можете предложить пользователям включить GPS:

вам нужно будет запросить разрешение ACCESS_FINE_LOCATION в вашем манифесте:

также смотрите это видео:

Это лучшее решение, предоставленное Google Developers . Просто вызовите этот метод в onResume onCreate после инициализации GoogleApiClient .

Примечание : эта строка кода автоматически открывает диалоговое окно, если Location не на. этот кусок линии используется в Google Map также

вам просто нужно удалить LocationListener С LocationManager

Источник

Оцените статью