Ответ 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 после запроса местоположения.