9

У меня есть Android приложение, которое получает местоположение:Android приложение не может получить доступ к местоположению на эмуляторе, используя FusedLocationApi

private LocationRequest createLocationRequest() { 
    LocationRequest mLocationRequest = new LocationRequest(); 
    mLocationRequest.setInterval(120000); 
    mLocationRequest.setFastestInterval(60000); 
    mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY); 
    return mLocationRequest; 
} 

private GoogleApiClient getLocationApiClient(){ 
    return new GoogleApiClient.Builder(App.instance) 
      .addConnectionCallbacks(this) 
      .addOnConnectionFailedListener(this) 
      .addApi(LocationServices.API) 
      .build(); 
} 

... 

apiClient = getLocationApiClient(); 
apiClient.connect(); 

@Override 
public void onConnected(@Nullable Bundle bundle) { 
    ... 
    LocationRequest locationRequest = createLocationRequest(); 
    LocationServices.FusedLocationApi.requestLocationUpdates(apiClient, locationRequest, new LocationListener() { 
      @Override 
      public void onLocationChanged(Location newLocation) { 
       //***THIS IS NEVER CALLED ON EMULATOR*** 
      } 
    }); 
} 

При работе на устройстве (Galaxy S3, Android 4.4.4) не существует никаких проблем. При работе на эмуляторе (Android Studio по умолчанию qemu, Android 7.1, x86-64) я не получаю местоположение в своем приложении. onConnected, я даже могу прочитать последнее место, хотя я не буду получать никаких обновлений местоположения (requestLocationUpdates завершение никогда не вызывается).

Я:

  • Добавлено <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" /> проявляться (в дополнение к грубой и тонкой месте).
  • Попытался изменить настройки местоположения Google на эмуляторе (высокая точность, экономия заряда батареи, только устройство)
  • Пробовал настройку местоположения из графического интерфейса эмулятора.
  • Включить и выключить опцию «Использовать обнаруженное местоположение ADB» эмулятора.
  • Пробовал adb -s emulator-5555 emu geo fix 12.34 56.78 (команда работает, продолжайте чтение, чтобы увидеть, почему)

Я до сих пор не могу получить мое приложение, чтобы получить обновление местоположения. Я пробовал встроенные карты Google эмулятора, и он прекрасно обновляет местоположение, я вижу, что текущая позиция на карте сразу изменяется, когда я отправляю разные координаты с помощью geo fix.

Но мое приложение полностью не знает о местоположении обновлений. Я пробовал ждать не менее 2 минут (мой интервал запроса местоположения) перед отправкой другой координаты. Что я делаю не так?

+0

проверьте, есть ли у вас игровая служба google в вашем эмуляторе. если у вас есть, то обновите его. –

+0

@jiteshmohite он подключается к сервису без ошибок, поэтому я думаю, он имеет его –

+1

Любые обновления по этому вопросу? Наблюдение за тем же поведением на всех эмуляторах, которые я использую. –

ответ

3

Я столкнулся с той же проблемой на эмуляторе. Единственное исправление, которое я нашел, - это использовать PRIORITY_HIGH_ACCURACY.

Объяснение: Это единственный вариант, который заставит андроид включить чип GPS (виртуальный чип в случае эмулятор). На реальном устройстве это не проблема, потому что телефон может использовать прием сотовой связи и Wi-Fi для определения приблизительного местоположения. На эмуляторе нет приема сотовой связи, а Wi-Fi абстрагируется как просто сетевое соединение. Таким образом, эмулятор может в значительной степени использовать GPS для местоположения.

Если вы действительно не хотите использовать PRIORITY_HIGH_ACCURACY в своем приложении, вы можете создать (или найти пример приложения) для FusedLocationApi с точностью до PRIORITY_HIGH_ACCURACY. Запустите это, прежде чем запускать свое приложение (PRIORITY_BALANCED_POWER_ACCURACY), и будет доступно последнее известное местоположение.

+0

Какие-нибудь дополнительные предложения, если я использую это и не получаю обновлений? Мой код: if (! Emulator()) lr.priority = LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY else // заставить эмулятор с высокой точностью, так как qemu только поставляет результаты для GPS lr.priority = LocationRequest.PRIORITY_HIGH_ACCURACY. Кажется, я как-то помнил getonLocationResult, но в настоящее время мой callback получает onLocationAvailability, но никаких результатов! – user3175580

Смежные вопросы