问题
This is a question which has been asked numerous times but I could not find a solution that always works.
I am developing an application using the Fused location provider.
In the onConnected()
method, I am requesting for location updates and the application logic will be initiated once a location fix is generated and onLocationChanged()
is called. (Please refer to my code below).
Problem onLocationChanged()
method is never called on some devices. I use a Samsung Tab 2 and a Samsung Galaxy Grand for testing. This code works perfectly fine on the Tab 2 but does not work on Grand. By does not work, I mean that locationClient
gets connected but onLocationChanged()
is never called.
Earlier, I used the location manager for getting location and in that implementation, the same problem occurred. So, I tried implementing the fused location provider but I still get the same problem.
Can anyone help me out with this issue? Is there something I am missing here?
public class MainActivity extends Activity implements GooglePlayServicesClient.ConnectionCallbacks, OnConnectionFailedListener, LocationListener {
LocationClient locationclient;
LocationRequest lr;
Location loc1;
static String address;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
locationclient = new LocationClient(this,this,this);
locationclient.connect();
}
@Override
public void onConnected(Bundle arg0) {
// TODO Auto-generated method stub
lr=LocationRequest.create();
lr.setInterval(100);
locationclient.requestLocationUpdates(lr, this);
Log.d("LocationClient","On Connected");
}
@Override
public void onDisconnected() {
// TODO Auto-generated method stub
locationclient.disconnect();
}
@Override
public void onConnectionFailed(ConnectionResult arg0) {
// TODO Auto-generated method stub
}
@Override
public void onLocationChanged(Location loc) {
// TODO Auto-generated method stub
// Application Logic
Log.d("LocationClient","Last Known Location LC:" + loc.getLatitude() + "," + loc.getLongitude());
}
}
回答1:
I observed same behavior on Galaxy Nexus and recognized two things causing onLocationChanged()
to not being called. There are
Corresponding location source is not enabled in System Settings. For
PRIORITY_HIGH_ACCURACY
the GPS satellites must be enabled, forPRIORITY_BALANCED_POWER_ACCURACY
Wi-Fi & mobile network location must be enabled.Even for the enabled location sources there can be no valid location information available. For instance,
PRIORITY_HIGH_ACCURACY
source is enabled, but there is no (or not good) GPS reception (e.g. device is inside a building). OrPRIORITY_BALANCED_POWER_ACCURACY
source is enabled, but both Wi-Fi and mobile data are switched off. In those cases location cannot be detected andonLocationChanged()
will not be called.
To fix #1 I had to check whether required location sources are enabled even before connecting to Google Services API and if they are switched off, then I notified a user asked him/her to allow location access.
To solve #2 I decided to use LocationRequest.setExpirationDuration()
. I set timeout at about 10 seconds, and immediately after calling requestLocationUpdates()
I post a callback delayed by same 10 seconds. If delayed callback is called before requestLocationUpdates()
, this means location cannot be detected due to reason #2. I do three retries and then show user an error message.
Android documentation is not great at this place, that's why I hope this helps.
回答2:
lr.setInterval(100);
with it your interval is 0,1 second so it very hard for gps chipset to detect location. Your interval should be > 1 second.(with me it is > 10)
locationRequest it should be set:
setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
because PRIORITY_BALANCED_POWER_ACCURACY
in outdoor it doesn't get location . Code will look like :
lr=LocationRequest.create();
lr.setInterval(5 * 1000);// 5s
lr.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
locationclient.requestLocationUpdates(lr, this);
Hope this help.
回答3:
See if you're getting a passed location by testing for if (loc == null). Even though it's the same provider, maybe one device is coming back null and bombing out, resulting in a look like it's not firing.
回答4:
This maybe non-sense but I have faced this problem before, someone suggested that you should create your own LocationListener
instead of letting your MainActivity
implements LocationListener
. Basically this:
locationclient.requestLocationUpdates(lr, your_location_listener);
Hope this helps.
回答5:
I solved this by setting both parameters, minimum distance and minimum time between updates to 0. As per what I have tested on 2 devices, now onLocationChanged() is being called regularly after requesting for updates.
回答6:
try to remove and reinstall "google play services
". Install it from google market link bellow,
google play services
回答7:
Here Check this code out...
public class MyActivity extends Activity implements LocationListener {
double destLat, destLong;
LocationManager locationManager;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
}
@Override
public void onLocationChanged(Location location) {
// TODO Auto-generated method stub
destLat = location.getLatitude();
destLong = location.getLongitude();
}
@Override
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
}
来源:https://stackoverflow.com/questions/18109542/onlocationchanged-not-called-on-some-devices