Android Location listener in the service does not work until I activate WiFi / mobile network

My place listener is working fine, collecting data without any problems. But sometimes he does not collect any data. At this time, I have to disconnect and reboot my provider. However, restarting fixes the problem; however, this is probably not the best thing the user should do.

When I use GPS as a provider, there is no problem.

The place listener works in the service. I can not understand the problem. Is it about Android or my code?

Thanks in advance.

+3
android service location
Jun 18 '13 at 12:41
source share
4 answers

You can use the new location provider (FusedLocationProvider), which combines information from different location providers, so if your device is able to get a place, you will find out about it. Of course, you must enable in the settings for your device the ability to use location information by applications.

Check developers.android.com for more information about this provider.

This solution works fine for me:

public class FusedLocationListener implements GooglePlayServicesClient.ConnectionCallbacks, GooglePlayServicesClient.OnConnectionFailedListener, com.google.android.gms.location.LocationListener { public interface LocationListener { public void onReceiveLocation(Location location); } private LocationListener mListener; public static final String TAG = "Fused"; private LocationClient locationClient; private LocationRequest locationRequest; protected int minDistanceToUpdate = 1000; protected int minTimeToUpdate = 10*1000; protected Context mContext; @Override public void onConnected(Bundle bundle) { Log.d(TAG, "Connected"); locationRequest = new LocationRequest(); locationRequest.setSmallestDisplacement(1); locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); locationRequest.setInterval(30000); locationRequest.setNumUpdates(1); locationClient.requestLocationUpdates(locationRequest, this); } @Override public void onDisconnected() { Log.d(TAG, "Disconnected"); } @Override public void onConnectionFailed(ConnectionResult connectionResult) { Log.d(TAG, "Failed"); } private static FusedLocationListener instance; public static synchronized FusedLocationListener getInstance(Context context, LocationListener listener){ if (null==instance) { instance = new FusedLocationListener(context, listener); } return instance; } private FusedLocationListener(Context context, LocationListener listener){ mContext = context; mListener = listener; } public void start(){ Log.d(TAG, "Listener started"); locationClient = new LocationClient(mContext,this,this); locationClient.connect(); } @Override public void onLocationChanged(Location location) { Log.d(TAG, "Location received: " + location.getLatitude() + ";" + location.getLongitude()); //notify listener with new location mListener.onReceiveLocation(location); } public void stop() { locationClient.removeLocationUpdates(this); } } 

Using:

 public class MyActivity extends Activity implements FusedLocationListener.LocationListener { @Override public void onCreate(Bundle savedInstanceState) { FusedLocationListener locationListener FusedLocationListener.getInstance(getApplicationContext(), this); locationListener.start(); } @Override public void onReceiveLocation(Location location) { //handle location here } } 
+5
Jul 31 '13 at 10:09
source share

Why aren't you using both * GPS_PROVIDER * and * NETWORK_PROVIDER *? I tried this and it worked fine.

Does this error happen when testing on other devices or only on your device?

+1
Jun 18 '13 at 13:53 on
source share

You can create both of them for yourself. I used both GPS_PROVIDER and NETWORK_PROVIDER, if it cannot detect GPS after 20 seconds, it will try to use the NETWORK provider

/// First create the MYlocation class

  public class MyLocation { Timer timer1; LocationManager lm; LocationResult locationResult; boolean gps_enabled=false; boolean network_enabled=false; public boolean getLocation(Context context, LocationResult result) { //I use LocationResult callback class to pass location value from MyLocation to user code. locationResult=result; if(lm==null) lm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); //exceptions will be thrown if provider is not permitted. try{gps_enabled=lm.isProviderEnabled(LocationManager.GPS_PROVIDER);}catch(Exception ex){} try{network_enabled=lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER);}catch(Exception ex){} //don't start listeners if no provider is enabled if(!gps_enabled && !network_enabled) return false; if(gps_enabled) lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListenerGps); if(network_enabled) lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListenerNetwork); timer1=new Timer(); timer1.schedule(new GetLastLocation(), 20000); return true; } LocationListener locationListenerGps = new LocationListener() { public void onLocationChanged(Location location) { timer1.cancel(); locationResult.gotLocation(location); lm.removeUpdates(this); lm.removeUpdates(locationListenerNetwork); } public void onProviderDisabled(String provider) {} public void onProviderEnabled(String provider) {} public void onStatusChanged(String provider, int status, Bundle extras) {} }; LocationListener locationListenerNetwork = new LocationListener() { public void onLocationChanged(Location location) { timer1.cancel(); locationResult.gotLocation(location); lm.removeUpdates(this); lm.removeUpdates(locationListenerGps); } public void onProviderDisabled(String provider) {} public void onProviderEnabled(String provider) {} public void onStatusChanged(String provider, int status, Bundle extras) {} }; class GetLastLocation extends TimerTask { @Override public void run() { lm.removeUpdates(locationListenerGps); lm.removeUpdates(locationListenerNetwork); Location net_loc=null, gps_loc=null; if(gps_enabled) gps_loc=lm.getLastKnownLocation(LocationManager.GPS_PROVIDER); if(network_enabled) net_loc=lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); //if there are both values use the latest one if(gps_loc!=null && net_loc!=null){ if(gps_loc.getTime()>net_loc.getTime()) locationResult.gotLocation(gps_loc); else locationResult.gotLocation(net_loc); return; } if(gps_loc!=null){ locationResult.gotLocation(gps_loc); return; } if(net_loc!=null){ locationResult.gotLocation(net_loc); return; } locationResult.gotLocation(null); } } public void cancelTimer() { timer1.cancel(); lm.removeUpdates(locationListenerGps); lm.removeUpdates(locationListenerNetwork); } public static abstract class LocationResult{ public abstract void gotLocation(Location location); } } 

/ In your main class, you can use it like this, which I mean for web browsing

  public class Main extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mWebView=(WebView)findViewById(R.id.webview); final String string_loc = getIntent().getExtras().getString("nearest"); LocationResult locationResult = new LocationResult(){ @Override public void gotLocation(Location location) { passLat=Double.toString(location.getLatitude()); passLong=Double.toString(location.getLongitude()); maps="http://maps.google.com/maps?q="+string_loc+"+loc:"+passLat+","+passLong+"&hq=hospital&t=m&z=12"; mWebView.loadUrl(maps); } }; myLocation.getLocation(this, locationResult); } } } 

// Hope this helps you

+1
Jul 31 '13 at 1:39 on
source share

Using a network provider requires an Internet connection. It collects some information from cameras and Wi-Fi hotspots. He then requests a server server, which scans his database and gives an approximate location. The device may pre-select some location information, so you do not need a permanent Internet connection, but when the device leaves the prefetch location, it will again need to be connected to the Internet.

Perhaps your problem is that someday you will lose your Internet connection (Wi-Fi is going to sleep) and restarting the provider will force it to reconnect to the Internet. Again, this is at best a guess on my part :)

0
Jul 31 '13 at 10:20
source share



All Articles