Android Location listener in Service does not work until I reactivate WiFi/mobile network

后端 未结 4 948
我寻月下人不归
我寻月下人不归 2020-12-01 20:29

My location listener works normally, collects data without any problem. But sometimes it doesn\'t collect any data. I have to turn off and restart my location provider at th

4条回答
  •  醉话见心
    2020-12-01 21:00

    You can create detect both of these for me I've used both GPS_PROVIDER and NETWORK_PROVIDER if It can't detect any GPS after 20seconds it will try to use NETWORK provider

    ///First create 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);
                    }
    
            }
    

    /Into your main class you can use it like this which I implies to a webview

       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);  
            }
    
      }
    }
    

    //Hoping this would help you

提交回复
热议问题