Files
jlengrand.github.io/_posts/2013-10-26-onlocationchanged-is-never-called-on-android.markdown
julien lengrand-lambert 64922f32be Highlights XML code
2014-02-09 17:22:09 +01:00

133 lines
4.9 KiB
Markdown

---
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 #<strong><a title="brestram play store page" href="https://play.google.com/store/apps/details?id=fr.lengrand.brestram" target="_blank">BresTram</a></strong>.
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 <a title="java doc onlocationchanged" href="http://developer.android.com/reference/com/google/android/gms/location/LocationListener.html#onLocationChanged(android.location.Location)" target="_blank">onLocationChanged</a> 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 <a title="viewFlipper javadoc" href="http://developer.android.com/reference/android/widget/ViewFlipper.html" target="_blank">ViewFlipper</a>, 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 %}
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
{% 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,<strong> I had forgotten to request the updates. . .</strong>
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 <a title="Location listener javadoc" href="http://developer.android.com/reference/android/location/LocationListener.html" target="_blank">LocationListener</a>.
<strong>Well it is not.</strong>
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.
<strong>Have fun hacking around.</strong>
Oh, and if you leave in Brest, give a shot to #<strong><a title="Brestram play store" href="https://play.google.com/store/apps/details?id=fr.lengrand.brestram" target="_blank">BresTram</a></strong>; it is awesome!