2015-05-14 6 views
0

Я создаю приложение для Android для отслеживания местоположения пользователя GPS во время поездки (путем отправки событий с позиционированием информации на сервер), но до сих пор у меня есть две проблемы. Поскольку пользователь может приостановить приложение, чтобы использовать другие приложения во время поездки, приложение перестало бы отправлять события. Чтобы обойти эту проблему, я реализовал фоновый сервис, который продолжает работать, даже когда пользователь переключается на другое приложение и, следовательно, продолжает отправлять события на сервер. Однако кажется, что каким-то образом служба приостанавливается всякий раз, когда телефон выключает свой экран (переходите в спящий режим?). Вторая проблема - получение GPS-данных с телефона. Я установил необходимые разрешения для получения данных из приемника GPS, и на самом деле, иногда, позиция g извлекается правильно (в то же время, когда есть и другие приложения, использующие GPS). Когда нет других приложений, использующих GPS, полученное позиционирование является кортежем (0.0, 0.0) для долготы и широты. Мне непонятно, почему эти два вопроса имеют место. Почему фоновое обслуживание приостанавливается всякий раз, когда экраны отключены, и почему GPS возвращает правильное позиционирование только тогда, когда есть другие приложения, требующие использования GPS?Внедрение фоновых сервисов на Android

ответ

4

Я столкнулся с той же проблемой (первый выпуск). Я разрешаю это с помощью петлителя внутри службы. Для второго вопроса мы должны видеть, что некоторые ваши кодо-коды помогают вам. Также я покажу свой код для поиска, возможно, это поможет. Я использовал GoogleApiClient для этого https://developer.android.com/training/location/retrieve-current.html

public class LocationService extends Service implements com.google.android.gms.location.LocationListener { 
    private Thread mTriggerService; 

    private Handler mLooperHandler; 
    ... 
    private void addLocationListener(){ 

    // Start thread which listen location 
    mTriggerService = new Thread(new Runnable(){ 
     public void run(){ 
      try{ 
       Looper.prepare();//Initialise the current thread as a looper. 
       mLooperHandler = new Handler(); 
       initLocationManager(); 
       Looper.loop(); 
      }catch(Exception ex){ 
       ex.printStackTrace(); 
      } 
     } 
    }, "LocationThread"); 
    mTriggerService.start(); 
} 
/** 
* Strart listening location 
*/ 
public void initLocationManager(Context context) { 
    ... 
    mLocationRequest = new LocationRequest(); 
    mLocationRequest.setInterval(mInterval); 
    //This controls the fastest rate at which your application will receive location 
    //updates, which might be faster than setInterval(long) in some situations 
    //(for example, if other applications are triggering location updates).(from doc) 
    mLocationRequest.setFastestInterval(mFastestInterval); 
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
    mGoogleApiClient = new GoogleApiClient.Builder(context) 
      .addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() { 
       @Override 
       public void onConnected(Bundle bundle) { 
        Log.d(TAG, "onConnected"); 
        LocationServices.FusedLocationApi.requestLocationUpdates(
          mGoogleApiClient, mLocationRequest, this); 
       } 

       @Override 
       public void onConnectionSuspended(int i) { 
        Log.d(TAG, "onConnectionSuspended"); 
       } 

      }) 
      .addOnConnectionFailedListener(mOnConnectionFailedListener) 
      .addApi(LocationServices.API) 
      .build(); 
    mGoogleApiClient.connect(); 
} 

//stop listening location 
private void stopLocationListener() { 
    if(mLocationHelper != null){ 
     mLooperHandler.getLooper().quit(); 
     if(mGoogleApiClient != null && mLocationListener != null 
      && mGoogleApiClient.isConnected()) { 
      LocationServices.FusedLocationApi.removeLocationUpdates(
       mGoogleApiClient, this); 
     } 
    } 
} 
}