Когда мне нужны android.hardware.location.gps и android.hardware.location.network?

Google сообщает по электронной почте об изменениях в разрешениях на местоположение Android:

15 октября 2016 г. мы вносим изменения, которые коснутся приложений с таргетингом на API версии 21 (Android 5.0, Lollipop) или более поздней версии, которые используют ACCESS_FINE_LOCATION, но не имеют явной функции uses-feature android.hardware.location.gps. В будущем эти приложения будут доступны для установки на устройства, не оснащенные оборудованием GPS. В большинстве случаев это не будет проблемой, поскольку определение местоположения на основе Wi-Fi и Cell-ID обеспечивает достаточно высокую точность для типичной работы этих приложений. Однако любые приложения, которым требуется оборудование GPS, например GPS-навигаторы, должны явно добавлять в свой манифест функцию android.hardware.location.gps uses-feature.

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

Кроме того, если вы используете объединенный поставщик местоположения и хотите получать наиболее точные образцы местоположения от GPS (например, с PRIORITY_HIGH_ACCURACY), вы должны включить функцию android.hardware.location.gps в манифест вашего приложения, чтобы гарантировать, что только Google Play распространяет ваше приложение на устройства с датчиками GPS.

Подробнее об этом изменении можно узнать в Справочном центре для разработчиков Android. .

Из Справочного центра для разработчиков Android.

Чтобы получать обновления местоположения от NETWORK_PROVIDER или GPS_PROVIDER, вы должны запросить разрешение пользователя, объявив разрешение ACCESS_COARSE_LOCATION или ACCESS_FINE_LOCATION соответственно в файле манифеста Android. Без этих разрешений ваше приложение завершится ошибкой во время выполнения при запросе обновлений местоположения.

Если вы используете как NETWORK_PROVIDER, так и GPS_PROVIDER, вам нужно запросить только разрешение ACCESS_FINE_LOCATION, поскольку оно включает разрешение для обоих поставщиков. Разрешение для ACCESS_COARSE_LOCATION разрешает доступ только к NETWORK_PROVIDER.

Внимание! Если ваше приложение нацелено на Android 5.0 (уровень API 21) или выше, вы должны объявить, что ваше приложение использует аппаратную функцию android.hardware.location.network или android.hardware.location.gps в файле манифеста, в зависимости от того, используете ли вы приложение получает обновления местоположения от NETWORK_PROVIDER или от GPS_PROVIDER. Если ваше приложение получает информацию о местоположении из любого из этих источников поставщика местоположения, вам необходимо объявить, что приложение использует эти аппаратные функции в манифесте вашего приложения. На устройствах под управлением версий до Android 5.0 (API 21) запрос разрешения ACCESS_FINE_LOCATION или ACCESS_COARSE_LOCATION включает подразумеваемый запрос на аппаратные функции определения местоположения. Однако при запросе этих разрешений автоматически не запрашиваются аппаратные функции определения местоположения в Android 5.0 (уровень API 21) и выше.

Я использую объединенный поставщик местоположения, ориентируясь на API 21 и использую ACCESS_FINE_LOCATION. Меня особо не волнует, доступен ли GPS, только то, что сообщается самое точное местоположение.

  • Исходя из первой цитаты, я думаю, что мне не нужно вносить никаких изменений.
  • Судя по второй цитате, я думаю, что мне нужны и android.hardware.location.gps, и android.hardware.location.network. Или это только для LocationManager, а не слитного локации?

Мне нужны android.hardware.location.gps и android.hardware.location.network или нет?


person mattm    schedule 20.09.2016    source источник
comment
Внимательно прочтите предупреждение: если ваше приложение нацелено на Android 5.0 или выше, вы ДОЛЖНЫ заявить, что ваше приложение использует аппаратную функцию в файле манифеста. На уровнях API до 21 подразумевался запрос на аппаратные функции определения местоположения, но теперь это не так. Помните, что если ваше приложение может работать без служб определения местоположения, вы можете сделать объявление, установив для атрибута android: required значение False.   -  person Yves Rochon    schedule 22.09.2016
comment
@YvesRochon Если мое приложение вообще не использует GPS на некоторых страницах, то что мне делать, оставьте обязательный атрибут false или true   -  person Pawan asati    schedule 05.10.2016
comment
@Pawan asati Это зависит от того, если функциональность вашего приложения требует, чтобы службы определения местоположения работали на любой странице, тогда вы можете установить required в true, если на всех страницах функциональность может использоваться, но не является обязательной на 100%, вы можете установить ее на ложный.   -  person Yves Rochon    schedule 05.10.2016


Ответы (6)


Вторая цитата говорит вам, что вам нужен либо android.hardware.location.network, либо android.hardware.location.gps, если вам конкретно нужен тот или другой провайдер местоположения.

Если вы хотите получать обновления через GPS, вам понадобится android.hardware.location.gps. Если вам нужны обновления через Wi-Fi и сотовые сети, вам понадобится android.hardware.location.network.

Если вы хотите получать обновления как по сети, так и от GPS, вы должны включить оба элемента <uses-feature>.

Если вы не укажете ни того, ни другого, ваше устройство может быть установлено на устройствах без этого провайдера. Например, его можно установить на устройстве без GPS, сотовой сети или чипа Wi-Fi.

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

API 21 против 20 и ниже

Обратите внимание, что вышесказанное верно только для API 21 и выше. До API 21 запрос разрешения ACCESS_COARSE_LOCATION подразумевал функцию location.network, тогда как запрос ACCESS_FINE_LOCATION подразумевал функцию location.gps (см. _ 10_).

Единственное изменение на данный момент состоит в том, что для API 21+ любое приложение, запрашивающее ACCESS_FINE_LOCATION, скоро будет доступно для установки на устройствах без GPS. Если ваше приложение ранее предполагало, что GPS доступен (и ему нужен GPS), вам необходимо убедиться, что у вас есть явный запрос на android.hardware.location.gps.

Google говорит, что провайдеры сетевого местоположения теперь достаточно хороши для точного определения местоположения, поэтому изменения.

person Bryan Herbst    schedule 20.09.2016
comment
Уважаемый, отрицательный голос! Буду признателен за ваш отзыв, чтобы я мог улучшить этот ответ, если он будет неполным или неправильным. - person Bryan Herbst; 20.09.2016
comment
Мне очень жаль, что на публикацию отзыва ушло так много времени, что я заканчивал писать свой ответ. Я проголосовал против, потому что, насколько я понимаю, ваш ответ неверен. uses-feature - это только фильтр на устройствах, на которых ваше приложение потенциально может быть установлено, и, согласно вопросу OP, ему нужно только какое-то местоположение, и не обязательно то, которое поступает от GPS. В своем ответе я защищаю и дополнительно объясняю этот момент, и я приветствую вас в комментариях, контраргументах и ​​т. Д. - person Budius; 20.09.2016
comment
@Budius, похоже, мы говорим одно и то же, но по-разному. Я отредактировал свой ответ, чтобы прояснить свою точку зрения. - person Bryan Herbst; 21.09.2016
comment
Отказано и изменено на вверх - person Budius; 21.09.2016
comment
@ Tanis.7x Я не в теме. Но можете ли вы мне сказать, должны ли мы спрашивать разрешения у запускаемого приложения? Благодарить - person K.Sopheak; 22.09.2016
comment
@ K.Sopheak, это полностью зависит от вас. Google рекомендует запрашивать в контексте (например, когда пользователь открывает карту или что-то еще), чтобы предоставить четкое значение для предоставления разрешения, но если вашему приложению все равно явно требуется местоположение (например, приложение для навигации), запрос заранее может быть нормальным. - person Bryan Herbst; 22.09.2016
comment
@ Tanis.7x Спасибо за комментарий и предложение. - person K.Sopheak; 23.09.2016
comment
@ Tanis.7x Я исправил ACCESS_COURSE_LOCATION на ACCESS_COARSE_LOCATION. Мне также нужно было добавить пару запятых, чтобы было выполнено минимум 6 изменений символов. Извините за это и спасибо за ответ. - person da Rocha Pires; 27.09.2016
comment
@ Tanis.7x & Budius - У меня такой же вопрос, что я предполагаю использовать - android.hardware.location.gps или android.hardware.location.network Или обе функции в моем приложении. (Нужна помощь в том, что использовать) Я использую ‹uses-permission android: name = android.permission.ACCESS_FINE_LOCATION /› это разрешение. Примечание. Я не использовал слитное местоположение в своем приложении. - person umesh; 28.09.2016
comment
@umesh Если вы не используете местоположение, вам это тоже не нужно. Если вы используете определение местоположения, включите .gps, если вы хотите получать обновления через GPS, .network, если вы не против получать обновления местоположения только из сетей Wi-Fi / сотовой связи, или и то, и другое, если хотите и то, и другое. - person Bryan Herbst; 28.09.2016
comment
@ Tanis.7x спасибо за ответ. Я использую API 19 (4.4.2) для своего приложения, а в моем файле манифеста я нацелен на API 21, и у меня есть следующие строки: <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>. Мне нужно обновить Манифест? - person smartmouse; 29.12.2016
comment
@smartmouse, вы не должны замечать никаких изменений в том, что у вас сейчас есть. Единственная разница в том, что ваше приложение может быть установлено на устройствах без GPS. Если это проблема, вам необходимо явно заявить, что вы используете функцию GPS. - person Bryan Herbst; 29.12.2016
comment
Я не согласен с тем, что для определения местоположения требуется либо функция определения местоположения в сети, либо функция GPS. Если вы не заявите, что вашему приложению нужен тот или иной вариант, вы можете вообще не получать обновления местоположения. Я думаю, что использование только разрешений ACCESS_COARSE_LOCATION или ACCESS_FINE_LOCATION приведет к неявной функции android.hardware.location uses, и это предотвратит установку на устройство, на котором нет ни того, ни другого. Я попытался описать это в своем ответе. - person mattm; 05.01.2017

TL; DR: нет, вам не нужно добавлять uses-feature в свой манифест, но, в зависимости от того, можете.

полный ответ:

uses-feature манифеста предназначен только для того, чтобы Google Play мог отфильтровать устройства, не содержащие функции, необходимой для правильного выполнения приложения. (Примерами являются GPS для приложения для пошаговой навигации или Camera для приложения для камеры).

Прочтите внимательно эту цитату:

любые приложения, для которых требуется оборудование GPS, например GPS-навигаторы, должны явно добавлять в свой манифест функцию android.hardware.location.gps uses-feature.

(...)

и хотите получать самые точные данные о местоположении от GPS

Как вы упомянули, вас беспокоит только то, что FusedLocationProvider дает вам наилучшее местоположение, доступное для установки устройства. Это означает, что даже если вы запрашиваете PRIORITY_HIGH_ACCURACY, ваше приложение может быть установлено на устройствах, которые не содержат GPS, и никогда не будет определять местоположение с такой же точностью, как GPS, или, может быть, даже (в очень редких странных случаях), быть установленным на устройство, не содержащее поставщика данных о местоположении.

изменить:

Основываясь на второй цитате, я думаю, мне нужны как android.hardware.location.gps, так и android.hardware.location.network. Или это только для LocationManager, а не для объединенного местоположения?

Я просто покопался в документации https://developer.android.com/guide/topics/manifest/uses-feature-element.html#hw-features и нашел его очень интересным, есть 3 возможности:

  • android.hardware.location
  • android.hardware.location.gps
  • android.hardware.location.network

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

person Budius    schedule 20.09.2016
comment
кроме того, все приложение, которое я работаю, использует местоположение, но это не основная функциональность, и приложение может полностью работать без какого-либо местоположения, и мы ничего из этого не объявляем, никогда не делали, и оно отлично работает - person Budius; 20.09.2016
comment
Если вашему приложению не требуется местоположение, вы все равно должны включить элемент <uses-feature>, но с required, установленным в значение false. Запрашивая разрешение на определение местоположения, вы подразумеваете, что вам требуется функция определения местоположения, и ваше приложение может быть недоступно для устройств без каких-либо функций определения местоположения. - person Bryan Herbst; 21.09.2016
comment
Что мне тогда следует использовать ‹uses-feature› gps или сеть в моем приложении? Повлияет ли на мое приложение, если я ничего не буду использовать? - person umesh; 28.09.2016

Быстрое и простое решение:

Приложение должно обновляться через GPS, используя android.hardware.location.gps. Если вам нужны обновления через Wi-Fi и сотовые сети, вам понадобится android.hardware.location.network.

Добавьте следующие строки в свой файл манифестов в зависимости от требований к данным о вашем местоположении:

<uses-feature android:name="android.hardware.location.network" android:required="false" />
<uses-feature android:name="android.hardware.location.gps" android:required="false" />

Надеюсь это поможет..

person Jatin    schedule 22.09.2016
comment
Я считаю, что вы хотите, чтобы первым был android.hardware.location.network - person zgc7009; 22.09.2016
comment
Этот ответ не дает указаний относительно того, когда должны присутствовать элементы uses-feature или почему для них установлено значение required = false. В моем конкретном случае я определенно не хочу, чтобы устройства без возможности определения местоположения устанавливали мое приложение. - person mattm; 26.09.2016
comment
Это ответ для меня, хотя я согласен с Мэттом в том, что это требует некоторой квалификации. Я искал правильные предложения uses-feature, чтобы разрешить функции определения местоположения на основе GPS и / или сети, но не требовать их для установки. Мое приложение может работать без функций определения местоположения, поэтому его следует устанавливать на устройствах без GPS или возможности определения местоположения в сети, НО если на устройстве доступен какой-либо тип местоположения, я хочу, чтобы приложение имело доступ к нему для лучшего взаимодействия с пользователем. (похоже, что android.hardware.location.network требуется в первом предложении, однако, как говорит zgc7009) - person Fat Monk; 24.10.2016

Насколько я понимаю, достаточно прочитать документацию по использованию -feature element, чтобы понять, как приложения фильтруются в Google Play на основе неявных и явных записей uses-feature:

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

Чтобы определить совместимость функций приложения с устройством данного пользователя, Google Play сравнивает:

Функции, необходимые для приложения - приложение объявляет функции в элементах в своем манифесте с ... Функции, доступные на устройстве, в аппаратном или программном обеспечении - устройство сообщает о поддерживаемых функциях как о системных свойствах, доступных только для чтения.

...

Если функция явно объявлена ​​необходимой, Google Play добавляет ее в список требуемых функций для приложения. Затем он отфильтровывает приложение от пользователей на устройствах, которые не поддерживают эту функцию.

Если функция явно заявлена ​​как не обязательная, Google Play не добавляет ее в список требуемых. По этой причине явно объявленная необязательная функция никогда не учитывается при фильтрации приложения. Даже если устройство не поддерживает заявленную функцию, Google Play все равно будет считать приложение совместимым с устройством и покажет его пользователю, если не применяются другие правила фильтрации.


Неявные uses-feature элементы для разрешений на местоположение:

ACCESS_COARSE_LOCATION

  • android.hardware.location
  • android.hardware.location.network (Только когда целевой уровень API 20 или ниже.)

ACCESS_FINE_LOCATION

  • android.hardware.location
  • android.hardware.location.gps (Только когда целевой уровень API 20 или ниже.)

Изменение, описанное в электронном сообщении Google, заключается в том, что неявные элементы uses-feature для android.hardware.location.gps не будут присутствовать в API 21+ с ACCESS_FINE_LOCATION. Аналогичная ситуация кажется верной для ACCESS_COARSE_LOCATION и android.hardware.location.network.

Google поощряет явное перечисление всех uses-feature записей, но по-прежнему предоставляет неявные записи на основе разрешений. Из следующего отрывка документации я думаю, что нет никакой разницы между опусканием uses-feature и объявлением его необязательным, если только не существует неявной записи uses-feature.

Если функция явно заявлена ​​как не обязательная, Google Play не добавляет ее в список требуемых.


Вариант использования вашего приложения определяет, какие uses-feature записи должны присутствовать. Вот несколько примеров использования, где требуются все uses-feature записей, если не указано иное:

  1. Приложение использует GPS явно из LocationManager, или приложению требуется высокая точность GPS. Это пример, приведенный в электронном письме Google.

    • ACCESS_FINE_LOCATION
    • android.hardware.location (неявный)
    • android.hardware.location.gps (неявно до API 20)
  2. Явно использует сетевое местоположение

    • ACCESS_COARSE_LOCATION
    • android.hardware.location (неявный)
    • android.hardware.location.network (неявно до API 20)
  3. Использует как GPS, так и сеть

    • ACCESS_FINE_LOCATION
    • android.hardware.location (неявный)
    • android.hardware.location.gps (неявно до API 20)
    • android.hardware.location.network
  4. Использует хотя бы один из GPS и сети. Это мой случай FusedLocationProviderApi в исходном вопросе.

    • ACCESS_FINE_LOCATION/ACCESS_COARSE_LOCATION
    • android.hardware.location (неявный)
  5. Использует местоположение, если доступно, по-прежнему разрешает установку приложения, если оно недоступно

    • ACCESS_FINE_LOCATION
    • android.hardware.location required = false (неявное переопределение)
    • android.hardware.location.gps required = false (неявно переопределить до API 20)
person mattm    schedule 23.09.2016
comment
Привет @mattm, мне все еще непонятно. Нужно ли мне явно включать android.hardware.location.GPS uses-feature, если я использую провайдер объединенного местоположения Google Play Services? - person Vinay Kashyap T S; 07.09.2018
comment
@VinayKashyapTS 5 случаев, которые я описал выше, относятся к провайдеру Fused Location. Это зависит от того, хотите ли вы конкретно GPS, или вас устраивает местоположение из сетевых источников, или вы хотите местоположение, если оно доступно, но по-прежнему будет работать без него. - person mattm; 07.09.2018

Да, вам нужны оба разрешения, если вы используете объединенный провайдер.

ACCESS_COARSE_LOCATION - получать обновления местоположения от NETWORK_PROVIDER. Достаточно добавить android.hardware.location.network разрешения на функцию.

ACCESS_FINE_LOCATION - для получения обновлений местоположения от NETWORK_PROVIDER и GPS_PROVIDER. Вы должны добавить разрешения для функций как android.hardware.location.gps, так и android.hardware.location.network. Применимо также для плавленых мест.

person Eshack Nazir    schedule 22.09.2016

По вашему первому пункту:

Исходя из первой цитаты, я думаю, что мне не нужно вносить никаких изменений.

Вам не нужно вносить никаких изменений, потому что вы используете FusedLocation, который автоматически определяет GPS и NetworkProvider в зависимости от доступности и дает вам наилучшую оценку местоположения (Вам нужно добавить ACCESS_FINE_LOCATION разрешение, чтобы получить высокую точность). Таким образом, даже если вы настроили таргетинг на API выше 21, вам не нужно ничего менять в своем приложении -FusedLocation будет работать как раньше.

И по вашему второму пункту:

Основываясь на второй цитате, я думаю, мне нужны и android.hardware.location.gps, и android.hardware.location.network. Или это только для LocationManager, а не для объединенного местоположения?

Вам просто нужно игнорировать это, потому что вы используете FusedLocation API и не используете LocationManager API, который вы заменили на FusedLocation. Таким образом, второе предложение предназначено только для приложений, использующих LocationManagar.

NETWORK_PROVIDER и GPS_PROVIDER являются частью LocationManager, а не FusedLocation API

person androidXP    schedule 20.09.2016
comment
В третьем абзаце первой ссылки на документ указано, что объединенное местоположение по-прежнему требует функции android.hardware.loction.gps ... - person zgc7009; 22.09.2016
comment
Прочтите еще раз его из Стратегии местоположения, если вы нажмете ссылки, они будут указывать на LocationManager API, поэтому для объединенного местоположения оно вам не нужно. Я уже разработал несколько приложений с объединенным местоположением, и я никогда не использовал GPS или сетевое разрешение. Манифест - person androidXP; 22.09.2016
comment
@ zgc7009 Да, и это только для LocationManager API, вот как он работает - person androidXP; 22.09.2016
comment
Я запутался. Зачем им явно указывать, что вам нужно добавить его для поставщика объединенного местоположения? Идея запроса функции состоит в том, чтобы убедиться, что у людей есть GPS, который так необходим для того, чтобы провайдер объединенного местоположения работал так, как должен. Вы можете установить для обязательного флага значение false, но, согласно этому сообщению от Google, вам нужно будет начать добавлять его для любого приложения, использующего поставщика объединенного местоположения. Если я ошибаюсь, не могли бы вы предоставить прямую документацию, чтобы заявить об обратном? - person zgc7009; 22.09.2016
comment
Пожалуйста, проверьте Google I / O Fused Location, у него лучшее объяснение, чем документация. - person androidXP; 23.09.2016
comment
Но все дело в том, что это меняется, все не так, как было раньше. В прошлом вы были правы, но они прямо заявляют, что начиная с 15 октября есть изменения в способах решения проблем. Вот почему я смущен. Ввод-вывод FusedLocation появился 3 года назад ... - person zgc7009; 23.09.2016
comment
Просто подожди и увидишь, нам не понадобится никаких дополнительных разрешений. - person androidXP; 23.09.2016