代码之家  ›  专栏  ›  技术社区  ›  Bonny Sebastian

在Android中,如何连续接收GPS位置?

  •  2
  • Bonny Sebastian  · 技术社区  · 7 年前

    在下面的代码中,在请求LocationManager的RequestLocationUpdate之后,onLocationChanged在不均匀的间隔中调用,即我将period设置为1秒,但我不会在每秒钟后收到位置更改。

    import android.content.Context;
    import android.location.Location;
    import android.location.LocationListener;
    import android.location.LocationManager;
    import android.os.Bundle;
    import android.util.Log;
    
    @SuppressWarnings("MissingPermission")
    public class SimplePositionProvider extends PositionProvider implements LocationListener {
    
    public SimplePositionProvider(Context context, PositionListener listener) {
    super(context, listener);
    
    Log.i("SimplePositionProvider", "start");
    if (!type.equals(LocationManager.NETWORK_PROVIDER)) {
    type = LocationManager.GPS_PROVIDER;
    }
    
    }
    
    public void startUpdates() {
    Log.i("startUpdates", "start");
    try {
    Log.i("requestLocationUpdates", "start");
    Log.i("TYPE", type);
    locationManager.requestLocationUpdates(type, period, 0, this);
    } catch (Exception e) {
    e.printStackTrace();
    Log.e(TAG, "error");
    }
    }
    
    public void stopUpdates() {
    Log.i("stopUpdates", "start");
    locationManager.removeUpdates(this);
    }
    
    @Override
    public void onLocationChanged(Location location) {
    Log.i("onLocationChanged", "start");
    updateLocation(location);
    }
    
    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
    Log.i("onStatusChanged", "start");
    }
    
    @Override
    public void onProviderEnabled(String provider) {
    Log.i("onProviderEnabled", "start");
    }
    
    @Override
    public void onProviderDisabled(String provider) {
    Log.i("onProviderDisabled", "start");
    }
    
    }
    
    4 回复  |  直到 7 年前
        1
  •  0
  •   Haem    7 年前

    tutorial ,您应该使用 FusedLocationProviderClient 请求位置更新。如果内存可用,该解决方案将按指定的间隔发送更新。你可以得到一个 FusedLocationProviderClient 通过呼叫 LocationServices.getFusedLocationProviderClient(Context context) .

    您可以在中设置请求过期时间 LocationRequest setExpirationDuration ,然后在每次到期后重新启动更新时使用类似以下代码:

    Handler handler = new Handler(Looper.myLooper());
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
          if (expectingLocationUpdates) {
            restartLocationUpdates();
          }
        }
    }, EXPIRATION_DURATION);
    
        2
  •  0
  •   Aashutosh Kumar    7 年前
    public class CustomLocationService extends Service implements LocationListener {
    
    
    private static final Location TODO = null;
    boolean isGPSEnabled = false;
    boolean isNetworkEnabled = false;
    public boolean canGetLocation = false;
    
    Location location;
    
    double latitude;
    double longitude;
    
    private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 0;
    private static final long MIN_TIME_BW_UPDATES = 10000 * 60 * 1;
    private CommonSharedPreference commonSharedPreference = new CommonSharedPreference();
    
    protected LocationManager locationManager;
    private long time;
    Context context;
    
    
    @Override
    public void onCreate() {
        super.onCreate();
        context = this;
    
        time = MIN_TIME_BW_UPDATES;
        getLocation();
    
    }
    
    @Override
    public void onStart(Intent intent, int startId) {
        getLocation();
    }
    
    @Override
    public void onDestroy() {
        // handler.removeCallbacks(sendUpdatesToUI);
        super.onDestroy();
        Log.v("STOP_SERVICE", "DONE");
        locationManager.removeUpdates(GPSTracker.this);
    }
    
    public Location getLocation() {
        try {
            locationManager = (LocationManager) context.getSystemService(LOCATION_SERVICE);
    
            isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
    
            isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
    
            if (!isGPSEnabled && !isNetworkEnabled) {
                // no network provider is enabled
    
            } else {
                this.canGetLocation = true;
                // First get location from Network Provider
                if (isNetworkEnabled) {
                    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                        return TODO;
                    }
                    locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                    if (locationManager != null) {
                        location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                        if (location != null) {
                            latitude = location.getLatitude();
                            longitude = location.getLongitude();
                        }
                    }
                }
                // if GPS Enabled get lat/long using GPS Services
                if (isGPSEnabled) {
                    if (location == null) {
                        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                        if (locationManager != null) {
                            location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
                            if (location != null) {
                                latitude = location.getLatitude();
                                longitude = location.getLongitude();
                            }
                        }
                    }
                }
            }
    
        } catch (Exception e) {
            e.printStackTrace();
        }
    
        return location;
    }
    
    
    public void stopUsingGPS() {
        if(locationManager != null) {
            locationManager.removeUpdates(GPSTracker.this);
        }
    }
    
    public double getLatitude() {
        if(location != null) {
            latitude = location.getLatitude();
        }
        return latitude;
    }
    
    public double getLongitude() {
        if(location != null) {
            longitude = location.getLongitude();
        }
    
        return longitude;
    }
    
    public boolean canGetLocation() {
        return this.canGetLocation;
    }
    
    
    @Override
    public void onLocationChanged(Location arg0) {
        // TODO Auto-generated method stub
    }
    
    @Override
    public void onProviderDisabled(String arg0) {
        // TODO Auto-generated method stub
    
    }
    
    @Override
    public void onProviderEnabled(String arg0) {
        // TODO Auto-generated method stub
    
    }
    
    @Override
    public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
        // TODO Auto-generated method stub
    
    }
    
    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }
    

    }

        3
  •  0
  •   Haem    7 年前
        4
  •  0
  •   Vinayak B    7 年前

    使用此类。。

        public class MyLocationService extends Service {
        private static final String TAG = "MyLocationService";
        private LocationManager mLocationManager = null;
        private static final int LOCATION_INTERVAL = 1000 * 30;;
        private static final float LOCATION_DISTANCE = 0f;
    
    
        private final IBinder serviceBinder = new MyLocationService.RunServiceBinder();
    
        public MyLocationService() {
        }
    
        LocationListener[] mLocationListeners = new LocationListener[]{
                new LocationListener(LocationManager.GPS_PROVIDER),
    
        };
    
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            Log.e(TAG, "onStartCommand");
            super.onStartCommand(intent, flags, startId);
            return START_STICKY;
        }
    
        @Override
        public void onCreate() {
    
            Log.e(TAG, "onCreate");
    
            initializeLocationManager();
    
         /*   try {
                mLocationManager.requestLocationUpdates(
                        LocationManager.NETWORK_PROVIDER, LOCATION_INTERVAL, LOCATION_DISTANCE,
                        mLocationListeners[1]);
            } catch (java.lang.SecurityException ex) {
                Log.i(TAG, "fail to request location update, ignore", ex);
            } catch (IllegalArgumentException ex) {
                Log.d(TAG, "network provider does not exist, " + ex.getMessage());
            }*/
    
    
    
            try {
                mLocationManager.requestLocationUpdates(
                        LocationManager.GPS_PROVIDER, LOCATION_INTERVAL, LOCATION_DISTANCE,
                        mLocationListeners[0]);
            } catch (java.lang.SecurityException ex) {
                Log.i(TAG, "fail to request location update, ignore", ex);
            } catch (IllegalArgumentException ex) {
                Log.d(TAG, "gps provider does not exist " + ex.getMessage());
            }
        }
    
        @Override
        public void onDestroy() {
            Log.e(TAG, "onDestroy");
            super.onDestroy();
            if (mLocationManager != null) {
                for (int i = 0; i < mLocationListeners.length; i++) {
                    try {
                        if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                            return;
                        }
                        mLocationManager.removeUpdates(mLocationListeners[i]);
                    } catch (Exception ex) {
                        Log.i(TAG, "fail to remove location listener, ignore", ex);
                    }
                }
            }
        }
    
        private void removeUpdate(){
            if (mLocationManager != null) {
                for (int i = 0; i < mLocationListeners.length; i++) {
                    try {
                        if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                            return;
                        }
                        mLocationManager.removeUpdates(mLocationListeners[i]);
                    } catch (Exception ex) {
                        Log.i(TAG, "fail to remove location listener, ignore", ex);
                    }
                }
            }
        }
    
        private void initializeLocationManager() {
            Log.e(TAG, "initializeLocationManager - LOCATION_INTERVAL: " + LOCATION_INTERVAL + " LOCATION_DISTANCE: " + LOCATION_DISTANCE);
            if (mLocationManager == null) {
                mLocationManager = (LocationManager) getApplicationContext().getSystemService(Context.LOCATION_SERVICE);
            }
        }
    
        @Override
        public IBinder onBind(Intent intent) {
            // TODO: Return the communication channel to the service.
            //   throw new UnsupportedOperationException("Not yet implemented");
            return null;
        }
    
        public class RunServiceBinder extends Binder {
            public MyLocationService getService() {
                return MyLocationService.this;
            }
        }
    
    
        private class LocationListener implements android.location.LocationListener {
            Location mLastLocation;
    
            public LocationListener(String provider) {
                Log.e(TAG, "LocationListener " + provider);
              //  Toast.makeText(MyLocationService.this, ""+provider, Toast.LENGTH_SHORT).show();
                mLastLocation = new Location(provider);
            }
    
            @Override
            public void onLocationChanged(Location location) {
                Log.e(TAG, "onLocationChanged: " + location);
               // Toast.makeText(MyLocationService.this, ""+"checked", Toast.LENGTH_SHORT).show();
                mLastLocation.set(location);
    
            }
    
            @Override
            public void onProviderDisabled(String provider) {
                Log.e(TAG, "onProviderDisabled: " + provider);
            }
    
            @Override
            public void onProviderEnabled(String provider) {
                Log.e(TAG, "onProviderEnabled: " + provider);
            }
    
            @Override
            public void onStatusChanged(String provider, int status, Bundle extras) {
                Log.e(TAG, "onStatusChanged: " + provider);
            }
        }
    
    
    }