2012-01-25 2 views
44

Я пытаюсь получить текущее местоположение пользователей, используя LocationManager. Я провел много исследований и не могу найти никого с той же проблемой. Обратный вызов OnLocationChanged никогда не называется. Ниже мой код и лог-код.OnLocationChanged callback никогда не называется

protected LocationListener locationListener; 
protected LocationManager locationManager; 
protected Context context; 

Мой OnCreate() метод

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    Log.v(TAG, "IN ON CREATE"); 

    this.context = getActivity(); 

    registerLocationUpdates(); 
} 

Мой метод registerLocationUpdates

void registerLocationUpdates() { 
    Criteria criteria = new Criteria(); 
    criteria.setAccuracy(Criteria.ACCURACY_LOW); 
    criteria.setPowerRequirement(Criteria.POWER_LOW); 
    criteria.setAltitudeRequired(false); 
    criteria.setBearingRequired(false); 

    locationManager = (LocationManager)getActivity().getSystemService(LOCATION_SERVICE); 

    provider = locationManager.getBestProvider(criteria, true); 

    // Cant get a hold of provider 
    if (provider == null) { 
     Log.v(TAG, "Provider is null"); 
     showNoProvider(); 
     return; 
    } else { 
     Log.v(TAG, "Provider: " + provider); 
    } 

    locationListener = new MyLocationListener(); 

    locationManager.requestLocationUpdates(provider, 1L, 1f, locationListener); 

    // connect to the GPS location service 
    Location oldLocation = locationManager.getLastKnownLocation(provider); 

    if (oldLocation != null) { 
     Log.v(TAG, "Got Old location"); 
     latitude = Double.toString(oldLocation.getLatitude()); 
     longitude = Double.toString(oldLocation.getLongitude()); 
     waitingForLocationUpdate = false; 
     getNearbyStores(); 
    } else { 
     Log.v(TAG, "NO Last Location found"); 
    } 
} 

Мои LocationListener

private class MyLocationListener implements LocationListener { 

    public void onLocationChanged(Location location) { 
     latitude = Double.toString(location.getLatitude()); 
     longitude = Double.toString(location.getLongitude()); 

     Log.v(TAG, "IN ON LOCATION CHANGE"); 

     if (waitingForLocationUpdate) { 
      getNearbyStores(); 
      waitingForLocationUpdate = false; 
     } 

     locationManager.removeUpdates(this); 
    } 

    public void onStatusChanged(String s, int i, Bundle bundle) { 
     Log.v(TAG, "Status changed: " + s); 
    } 

    public void onProviderEnabled(String s) { 
     Log.e(TAG, "PROVIDER DISABLED: " + s); 
    } 

    public void onProviderDisabled(String s) { 
     Log.e(TAG, "PROVIDER DISABLED: " + s); 
    } 
} 

Мои права в AndroidMa nifest

<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 

И, наконец, после LogCat я бегу мое приложение

01-25 09:43:10.963: VERBOSE/NearbyListFragment(3060): IN ON CREATE 
01-25 09:43:10.963: VERBOSE/LocationManagerService(1329): getProviders 
01-25 09:43:10.963: VERBOSE/LocationManagerService(1329): getProviders 
01-25 09:43:10.973: VERBOSE/LocationManagerService(1329): getProviders 
01-25 09:43:10.983: VERBOSE/NearbyListFragment(3060): Provider: gps 
01-25 09:43:10.983: DEBUG/LocationManager(3060): requestLocationUpdates: provider = gps, listener = co.fusionweb.[email protected]46ef4680 
01-25 09:43:10.983: DEBUG/GpsLocationProvider(1329): setMinTime 1 
01-25 09:43:10.983: VERBOSE/NearbyListFragment(3060): NO Last Location found 
01-25 09:43:10.983: VERBOSE/LocationManagerService(1329): _requestLocationUpdates: listener = Receiver{47421e68 Listener [email protected]} 
01-25 09:43:11.003: VERBOSE/countingFragment(3060): IN ON CREATE VIEW 
01-25 09:43:11.003: WARN/GpsLocationProvider(1329): Duplicate add listener for co.fusionweb.dealsplus 
01-25 09:43:11.013: VERBOSE/ScrollListener(3060): In Constructor 
01-25 09:43:11.013: VERBOSE/ScrollListener(3060): Scrolling 
01-25 09:43:11.033: DEBUG/GpsLocationProvider(1329): startNavigating 
01-25 09:43:11.043: DEBUG/lib_locapi(1329): loc_eng_set_qos_time_out(standalone = 60, agps = 89) 
01-25 09:43:11.043: DEBUG/lib_locapi(1329): loc_eng_set_qos_accuracy(accuracy = 50) 
01-25 09:43:11.043: VERBOSE/lib_locapi(1329): persist.radio.agps.mode: [] 
01-25 09:43:11.043: DEBUG/lib_locapi(1329): loc_eng_set_position mode, client = 1, interval = 1, mode = 1 
01-25 09:43:11.043: VERBOSE/lib_locapi(1329): loc_eng_ioctl called: client = 1, ioctl_type = 2 
01-25 09:43:11.043: VERBOSE/locapi_rpc_glue(1329): loc_ioctl 
01-25 09:43:11.043: DEBUG/RPC(1329): written RPC packet size: [96] 
01-25 09:43:11.043: DEBUG/RPC(1329): read RPC packet 
01-25 09:43:11.043: DEBUG/RPC(1329): read RPC packet size: [28] 
01-25 09:43:11.043: VERBOSE/locapi_rpc_glue(1329): loc_api_sync_ioctl: select_id = 0, loc_ioctl returned 0 
01-25 09:43:11.043: DEBUG/RPC(1329): read RPC packet 
01-25 09:43:11.043: DEBUG/RPC(1329): read RPC packet size: [80] 
01-25 09:43:11.043: VERBOSE/locapi_rpc_glue(1329): Callback received: 80 (cb_id=0x5310000 handle=1) 
01-25 09:43:11.043: DEBUG/RPC(1329): written RPC packet size: [28] 
01-25 09:43:11.043: VERBOSE/lib_locapi(1329): loc_eng_ioctl result: client = 1, ioctl_type = 2, SUCCESS 
01-25 09:43:11.043: DEBUG/lib_locapi(1329): loc_eng_start 
01-25 09:43:11.043: DEBUG/locapi_rpc_glue(1329): loc_start_fix 
01-25 09:43:11.043: DEBUG/RPC(1329): written RPC packet size: [44] 
01-25 09:43:11.043: DEBUG/RPC(1329): read RPC packet 
01-25 09:43:11.053: DEBUG/RPC(1329): read RPC packet size: [28] 
01-25 09:43:11.103: DEBUG/RPC(1329): read RPC packet 
01-25 09:43:11.103: DEBUG/RPC(1329): read RPC packet size: [80] 
01-25 09:43:11.113: VERBOSE/locapi_rpc_glue(1329): Callback received: 100 (cb_id=0x5310000 handle=1) 
01-25 09:43:11.113: VERBOSE/lib_locapi(1329): process_deferred_action: pthread_cond_wait returned 
01-25 09:43:11.113: DEBUG/lib_locapi(1329): loc_eng_report_status: GPS_STATUS_SESSION_BEGIN 
01-25 09:43:11.113: DEBUG/lib_locapi(1329): loc_eng_report_status: update status 
01-25 09:43:11.113: VERBOSE/GpsLocationProvider(1329): reportStatus status: 1 
01-25 09:43:11.113: DEBUG/GpsLocationProvider(1329): Acquiring wakelock 
01-25 09:43:11.123: DEBUG/RPC(1329): written RPC packet size: [28] 
01-25 09:43:11.183: DEBUG/PowerManagerService(1329): New lightsensor value:40, lcdValue:77 
01-25 09:43:11.273: DEBUG/RPC(1329): read RPC packet 
01-25 09:43:11.273: DEBUG/RPC(1329): read RPC packet size: [80] 
01-25 09:43:11.273: VERBOSE/locapi_rpc_glue(1329): Callback received: 100 (cb_id=0x5310000 handle=1) 
01-25 09:43:11.273: VERBOSE/lib_locapi(1329): process_deferred_action: pthread_cond_wait returned 
01-25 09:43:11.273: DEBUG/lib_locapi(1329): loc_eng_report_status: GPS_STATUS_ENGINE_ON 
01-25 09:43:11.273: DEBUG/lib_locapi(1329): loc_eng_report_status: update status 
01-25 09:43:11.273: VERBOSE/GpsLocationProvider(1329): reportStatus status: 3 

И андроид части LogCat SDK место повторять их самих. Я пробовал все, о чем я мог думать и видел в google и stackoverflow. Als как раз в качестве примечания, я смог заставить его работать на устройстве 2.3, используя requestSingleUpdate, который доступен в API 9, и следуя руководству A Deep Dive into Location, но мне нужно, чтобы он работал на 2,1 или 2,2 и выше, используя старый SDK , Если у вас есть какие-либо намеки или вы хотите узнать больше, сообщите мне. Заранее спасибо.

+0

Хотя очень поздно, но я надеюсь, что этот комментарий может помочь кому-то еще, посмотрите по этой ссылке: http://www.lengrand.fr/2013/10/onlocationchanged-is-never-called-on-android – SMHJamali

ответ

46

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

requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener); 
requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener); 

Таким образом, вы получите ВСЕ обновления. И прокомментируйте часть о том, как получить последнее известное место. Это еще не нужно.

Тогда в onLocationChanged(), просто

Log.v(TAG, "IN ON LOCATION CHANGE, lat=" + latitude + ", lon=" + longitude); 

Закомментируйте остальное так, что вы держите ваш слушатель активно. Это должно дать вам поток обновлений на реальном устройстве. На эмуляторе вам нужно будет использовать DDMS, и каждый раз, когда вы нажимаете отправить, вы получите одно обновление GPS.

+1

Это почти работал, я думал, что это сработало, потому что оно работало на MyTouch 4G, я продолжал получать обновления после обновления. Затем я попробовал на другом устройстве (MyTouch 3G), и он больше не работал. Я заметил, что на более совершенных устройствах, таких как Bionic, GPS работает очень быстро, но на более низких телефонах кажется, что я никогда не смогу заставить его работать. Являются ли телефоны нижнего уровня действительно такими плохими в GPS? или что-то еще мне не хватает? – smitt04

+1

Упрощение помогло, но оказалось, что на MyTouch 3G я не смог получить позицию, пока я не подключился к сети WiFi сначала – smitt04

+11

, это не имеет никакого значения. – user724861

2

Как писал Стив Блэквелл, ваша установка хороша. Что вы может попытаться понять, если у вас 100% фиксированный сигнал GPS! Я установил хороший GPS Tester application (from the play store), и он покажет вам, есть ли у вас исправление или нет, и к каким спутникам вы подключены и какова сила соединения. Вот почему мой OnLocationChanged() никогда не звонил .. Я попытался запустить его изнутри здания: \

удачи!

+1

Спасибо, что поделились этим замечательным приложением, я установил его и узнал, что в некоторых местах мое местоположение gps не обновляется автоматически (в моем приложении) –

+0

Не работает для sony 4.3 –

+2

Удивительный инструмент, это приложение GPS-теста, поэтому я вижу, что на моем устройстве он показывает GPS: NO Fix. Я предполагаю, что это означает, что нет фиксированного сигнала GPS, верно? – cubycode

0

Я столкнулся с той же проблемой. Я получил getLastKnownLocation как null. Проблема разрешается при перезапуске устройства и службы местоположения на устройстве.

+0

Я столкнулся с такой же проблемой, но узнал, что некоторые устройства также занимают время/движение, чтобы найти местоположение lat-lon ... my nexus не собирал лат-лон, в то время как мото мог –

6

Замена

LocationManager.GPS_PROVIDER

с

LocationManager.NETWORK_PROVIDER

решить мою проблему.

Вот фрагмент кода моего менеджера местонахождения

LocationManager locationManager = (LocationManager) getActivity().getSystemService(LOCATION_SERVICE); 

// Проверка разрешений Location, Зефир и выше

 if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED 
       && ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
      // TODO: Consider calling 
      // ActivityCompat#requestPermissions 
      // here to request the missing permissions, and then overriding 
      // public void onRequestPermissionsResult(int requestCode, String[] permissions, 
      //           int[] grantResults) 
      // to handle the case where the user grants the permission. See the documentation 
      // for ActivityCompat#requestPermissions for more details. 

      Toast.makeText(getActivity(), "Not Enough Permission", Toast.LENGTH_SHORT).show(); 
      return; 
     } 

// Получить текущее местоположение, чтобы начать с

 Location myLocation = locationManager.getLastKnownLocation(LocationManager.PASSIVE_PROVIDER); 

     currentLatitude = myLocation.getLatitude(); 
     currentLongitude = myLocation.getLongitude(); 

// Запросить обновление местоположения с помощью LocationManager.NETWORK_PROVIDER

 locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 
       MIN_TIME_BW_UPDATES, 
       MIN_DISTANCE_CHANGE_FOR_UPDATES, MapFragment.this); 
1

У меня возникла аналогичная проблема. У меня были разрешения, исправленные запросы, но обновления не было. Оказалось, что все, что я должен был сделать, это просто подождать. Пока я искал проблему в Интернете, у меня было приложение, и через несколько минут оно только начинало получать обновления. Тогда даже когда я убил приложение и запустил его снова, обновления пришли мгновенно - я думаю, это системная вещь, некоторые оптимизации, возможно, из-за того, что устройство вообще не двигалось (кстати, это не какое-то дерьмовое устройство , это Pixel).

1

У меня была такая же ситуация, я думал, что допустил ошибку в своем коде, поэтому метод onlocationchage не вызван, наконец, я решил вот так.

Step 1 : 
Close your application and Open Google Map Application. 

Step 2 : 
Touch the location finder button or icon over the Google Map app then It will show, currently where you are located. 

Step 3 : 
Now Run your app and check onlocationchage will call. 
2

GPS Provider отключит, когда устройство в малой мощности или использовать режим экономии энергии, то в этом случае мы не можем получить onLocationChanged

GPS Provider вряд ли когда-либо вернуть место, если вы остаетесь в доме или здание (только хорошо работать на открытом воздухе)

Таким образом, в моем приложении я буду использовать как GPS_PROVIDER и NETWORK_PROVIDER получить onLocationChanged() лучше

https://developer.android.com/guide/topics/location/strategies.html#Updates

Чтобы получить данные о местоположении от поставщика GPS, используйте GPS_PROVIDER вместо NETWORK_PROVIDER. Вы также можете запросить обновления местоположения как от GPS, так и от поставщика сетевого местоположения, вызвав requestLocationUpdates() дважды в один раз для NETWORK_PROVIDER и один раз для GPS_PROVIDER.

0

Если вы пытаетесь с NETWORK_PROVIDER, это действительно трудно проверить:

  • на эмуляторе: никогда не работать
  • на реальном устройстве: только getLastKnownLocation() работает, чтобы получить onLocationChanged(), вы должны использовать мобильные данные и выйти на улицу с риском потери телефона от разбойника: P

Я думаю, причина в том, что это просто местоположение поставщика сети, а не только ваше устройство, а также сеть Поставщик rk никогда не перемещается, поэтому onLocationChanged() никогда не звонит. Это может произойти только при переключении между мобильными данными и Wi-Fi и наоборот. Пожалуйста, поправьте меня, если я ошибаюсь.

Поэтому я предлагаю использовать GPS_PROVIDER для экспериментов перед рассмотрением производительности и использования батареи. Он отлично работает как на эмуляторах, так и на реальных устройствах. Для наилучшей практики: https://developer.android.com/guide/topics/location/strategies.html

Мне потребовалось несколько часов для тестирования с NETWORK_PROVIDER без каких-либо результатов, поэтому, надеюсь, мое предложение будет полезным.

0

У меня была такая же проблема (onLocationChanged() никогда не вызывался с NETWORK_PROVIDER) на моем реальном устройстве (M, appSDK 23), пока я не перезапустил его.

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