---
layout: post
status: publish
published: true
title: onLocationChanged is never called on Android
author: Julien Lengrand-Lambert
author_login: jlengrand
author_email: julien@lengrand.fr
author_url: http://www.lengrand.fr
wordpress_id: 892
wordpress_url: http://www.lengrand.fr/?p=892
date: 2013-10-26 16:28:40.000000000 +02:00
categories:
- Uncategorized
- programming
tags:
- android
- programming
- brestram
- java
- gps
comments:
- id: 21831
author: Robert
author_email: robertbobrek@gmail.com
author_url: ''
date: !binary |-
MjAxMy0xMi0xMiAyMTo0NzozNyArMDEwMA==
date_gmt: !binary |-
MjAxMy0xMi0xMiAyMDo0NzozNyArMDEwMA==
content: ! "Hi,\r\n\r\nthanks for the code but it is not working...\r\n\tprivate
LocationInfo li;\r\n\r\ngives me: \"LocationInfo can not be resolved to a type\""
- id: 21886
author: Julien Lengrand-Lambert
author_email: julien@lengrand.fr
author_url: http://www.lengrand.fr
date: !binary |-
MjAxMy0xMi0xNCAxMDo0OToyOSArMDEwMA==
date_gmt: !binary |-
MjAxMy0xMi0xNCAwOTo0OToyOSArMDEwMA==
content: ! "Hey, \r\n\r\nYou are totally right, sorry for that.\r\nLocationInfo
is a class I use internally. I removed the references to LocationInfo, so things
should be ok now :).\r\n\r\nThanks for noticing!"
---
I had problems with this while developing #BresTram.
I was developing a new feature, allowing my users to find bus stops nearby using their GPS location.
But whatever I was trying, my location was never set, and onLocationChanged was never called.
Here is what my Activity would look like :
{% highlight java %}
public class DisplayGPSInfoActivity extends BaseActivity implements LocationListener {
private static final String TAG = "DisplayGPSInfoActivity";
private ViewFlipper vf;
private LocationManager locationManager;
private String provider;
@SuppressLint("NewApi")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Initiating ViewFlipper
setContentView(R.layout.activity_display_gpsinfo_request);
vf = (ViewFlipper) findViewById(R.id.viewFlipper);
this.locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
//Choosing the best criteria depending on what is available.
Criteria criteria = new Criteria();
provider = locationManager.getBestProvider(criteria, false);
//provider = LocationManager.GPS_PROVIDER; // We want to use the GPS
// Initialize the location fields
Location location = locationManager.getLastKnownLocation(provider);
}
@Override
public void onLocationChanged(Location location) {
Log.d(TAG, "GPS LocationChanged");
double lat = location.getLatitude();
double lng = location.getLongitude();
Log.d(TAG, "Received GPS request for " + String.valueOf(lat) + "," + String.valueOf(lng) + " , ready to rumble!");
// Do clever stuff here
}
}
{% endhighlight %}
You can forget about the ViewFlipper, that is here only to show something to the user.
Basically, I am letting android decide which provider he wants to use (GPS or Network), and request for the last known location.
Then, I want to do something clever each time onLocationChanged is called.
Problem is, it is not. never. Ever. . .
After having verified hundred times that I had
{% highlight xml %}
{% endhighlight %}
correctly defined in my manifest, and that yes, other GPS based apps were working fine on my phone; I finally found the solution.
As stupid as it seems, I had forgotten to request the updates. . .
Something like that would do the job :
{% highlight java %}
@Override
protected void onResume() {
super.onResume();
Log.v(TAG, "Resuming");
locationManager.requestLocationUpdates(provider, 400, 1, this);
}
{% endhighlight %}
I was somehow expecting that is was automatic, implied by the fact that my activity implements LocationListener.
Well it is not.
So, if any of you has the same problem, look whether you actually ask for something before getting angry because you don't receive it :D.
Have fun hacking around.
Oh, and if you leave in Brest, give a shot to #BresTram; it is awesome!