Проблема с менеджером по размещению для мороженого sandwhich

Может кто-нибудь объяснить мне, что это за ошибка? Я получаю только для android 4 + и не ниже:

E/AndroidRuntime(891): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.getaddress/com.example.getaddress.MainActivity}: java.lang.IllegalArgumentException: requested provider network doesn't exisit

Ответ 1

Похоже, что поставщик местоположения NETWORK_PROVIDER недоступен в эмуляторах Android 4+ без API Google (ну, на самом деле, я не тестировал их на всех, см. ниже). Настоящие устройства, на которых я тестировал, в порядке с ними (но у них у всех есть службы Google на них, было бы интересно протестировать с обычными чистыми версиями Android, может быть, с Kindles?).

Это не вопрос включения/отключения провайдера в настройках устройства, его просто нет в эмуляторе.

Проблема

В основном этот код:

locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,0,0,mLocListener);

приведет к следующему исключению:

java.lang.IllegalArgumentException: provider doesn't exisit: null

на всех Android 4+ голой эмулятор (в отличие от Google-связанных эмуляторов)

Примечание: опечатка в "exisit" находится в фактической строке журнала.

Diagnostic

Получение списка всех поставщиков местоположения на целевом устройстве со следующим:

List<String> providers = locationManager.getAllProviders();

Я вижу, что поставщик сети присутствует на

  • физические устройства
  • эмулятор Android 2.3.3 (без API Google)
  • эмулятор уровня 17 (4.2) (с API Google)

Но не на

  • эмулятор уровня Android 15 (4.0.3) с API Google
  • эмулятор android 4.2 (без API Google)

Мое предположение заключается в том, что по нетехническим причинам Google не разрешил службу определения местоположения в сети AOSP и ограничил ее использование версиями ОС под управлением Google с 4.2 (?).

Что я не знаю, есть ли замена службы сетевых сервисов на других устройствах (например, Kindle).

Вероятное влияние на ваше приложение

Я бы не ожидал, что это повлияет на большинство смартфонов и планшетов. Однако он может

  • несколько ухудшают вашу способность тестировать
  • быть проблемой совместимости для пользователей, использующих пользовательские/не-Google версии Android (еще раз, Kindle?)

Как обнаружить

Простой тест, например:

locationManager.getAllProviders().contains(LocationManager.NETWORK_PROVIDER)

может сказать вам безболезненно, если поставщик сети присутствует на устройстве. Обратите внимание, что если он присутствует, но пользователь не активировал его, ваш локатор-получатель получит обратный вызов onProviderDisabled после запроса местоположения.