2014-09-25 3 views
2

Я беспокоюсь о приложении Android, которое чувствительно к местоположению пользователя.Убедитесь, что пользователь остался на том же месте

Как только пользователь остался на месте в течение длительного времени (например, 20 минут), мы должны что-то сделать (установите статус ближайшего ближайшего парковочного места «занято»), и как только он покинет эту позицию, статус ближайшего парковочного места, ближайшего к «свободному».

Теперь я могу получить местоположение пользователя для зарегистрированного LocationListener, однако у меня есть две проблемы:

1) Как отслеживать местоположение пользователя, чтобы сделать это убедиться, если он есть стиль для указанного времени в том же месте ?

Я думал создать Handler и выполнить задачу, чтобы проверить местоположение:

private Location mLastLocation; 
private Location mCurrentLocation; 

private Handler mHandler = new Handler(); 
private Runnable mLocationCalculateRunnable = new Runnable() { 
    @Override 
    public void run() { 
     if (mCurrentLocation != null) { 
      if (!userLocationChanged()) { 

      } else { 

      } 
     } 
     mHandler.postDelayed(mLocationCalculateRunnable,10000); //check every 10 seconds 
    } 

    private boolean userLocationChanged() { 
     return getDistance(mCurrentLocation, mLastLocation) > 5; 
    } 
}; 
mHandler.postDelayed(mLocationCalculateRunnable,1000); 


private void onLocationChanged(Location location) { 
    mLastLocation = mCurrentLocation; 
    mCurrentLocation = location; 
} 

Но я не могу продолжать, чтобы проверить местоположение и время.

2) Приложение должно запускаться, даже если пользователь нажимает клавишу back, чтобы вернуться на главный экран, и экран может выйти, даже процессор может переспать.

Если это так, я не могу получить новое местоположение, и обработчик также может быть остановлен.

Интересно, что моя идея проверки местоположения правильная и как поддерживать приложение в любых целях?

BTW, я не могу получить доступ к сервисам, связанным с Google.

ответ

1

1) Используйте для установки правильного обновления для LocationManager. Они определяют минимальное время и расстояние, необходимые для обновления позиции пользователя.

locationManager.requestLocationUpdates(
           LocationManager.GPS_PROVIDER, 
           MIN_TIME_BW_UPDATES, 
           MIN_DISTANCE_CHANGE_FOR_UPDATES, this); 

2) Run Service, который будет работать на фоне.

Небольшой пример кода:

public class GPSservice extends Service implements LocationListener { 


    private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 2; 

    private static final long MIN_TIME_BW_UPDATES = 1000 * 1; 

    double latitude, longitude; 

    boolean isGPSEnabled = false; 

    boolean isNetworkEnabled = false; 

    boolean canGetLocation = false; 

    Location location; 

    protected LocationManager locationManager; 


    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 

     getLocation(); 

     return super.onStartCommand(intent, flags, startId); 
    } 


    @Override 
    public void onLocationChanged(Location location) { 
     new LocationReceiver(location, getApplicationContext()); 
    } 


    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) { 

    } 

    @Override 
    public void onProviderEnabled(String provider) { 

    } 

    @Override 
    public void onProviderDisabled(String provider) { 

    } 

    public Location getLocation() { 
     try { 
      locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); 

      // getting GPS status 
      isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); 

      isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER); 

      if (!isGPSEnabled && !isNetworkEnabled) { 
       Log.d("Network", "OFF"); 
      } else { 
       this.canGetLocation = true; 
       if (isNetworkEnabled) { 
        locationManager.requestLocationUpdates(
          LocationManager.NETWORK_PROVIDER, 
          MIN_TIME_BW_UPDATES, 
          MIN_DISTANCE_CHANGE_FOR_UPDATES, this); 
        Log.d("Network", "ON"); 
        if (locationManager != null) { 
         location = locationManager 
           .getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 
         if (location != null) { 
          latitude = location.getLatitude(); 
          longitude = location.getLongitude(); 
         } 
        } 
       } 
       if (isGPSEnabled) { 
        if (location == null) { 
         locationManager.requestLocationUpdates(
           LocationManager.GPS_PROVIDER, 
           MIN_TIME_BW_UPDATES, 
           MIN_DISTANCE_CHANGE_FOR_UPDATES, this); 
         Log.d("GPS Enabled", "ON"); 
         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; 
    } 
} 
+0

ли означает, что служба не может быть остановлена? И мне кажется, что я должен разместить слушателя местоположения и действия (сделать что-то в соответствии с местоположением) на службе тоже? – hguser

+0

http://developer.android.com/guide/components/services.html вы можете запускать службы на фоне приложения, и пользователь не сможет включить его, даже когда он убьет приложение. –

Смежные вопросы