7
  • Как получить текущее местоположение с помощью нового FusedLocation API из IntentService?
  • Как я могу убедиться, что IntentService получит все обратных вызовов из FusedLocation API? ie, Как я могу получить объект местоположения синхронно?
+5

Start, заменив 'IntentService' с регулярным обслуживанием. 'IntentService' не обрабатывает вызовы API, которые сами по себе являются асинхронными, например API с плавным определением местоположения. Вам понадобится регулярная служба с собственным фоновым потоком (где это необходимо), где вы можете отключить эту услугу только тогда, когда вы получите свои данные (или некоторое время ожидания). «Как я могу получить объект местоположения синхронно?» - нет никакой гарантии, что вы можете, поэтому вы заменяете свой «IntentService» на регулярную службу. – CommonsWare

+0

@DroidHacker вы решили эту проблему? – rup35h

ответ

4

Это может помочь вам

import java.util.ArrayList; 
    import java.util.List; 

    import org.apache.http.NameValuePair; 
    import org.apache.http.message.BasicNameValuePair; 
    import org.json.JSONArray; 
    import org.json.JSONException; 
    import org.json.JSONObject; 

    import android.app.AlertDialog; 
    import android.app.Notification; 
    import android.app.NotificationManager; 
    import android.app.PendingIntent; 
    import android.app.Service; 
    import android.content.Context; 
    import android.content.Intent; 
    import android.content.SharedPreferences; 
    import android.location.Criteria; 
    import android.location.Location; 
    import android.location.LocationManager; 
    import android.os.Bundle; 
    import android.os.Handler; 
    import android.os.IBinder; 
    import android.util.Log; 
    import android.widget.Toast; 

    import com.example.driverapplication.CommonUtilities; 
    import com.example.driverapplication.R; 
    import com.example.driverapplication.ServiceHandler; 
    import com.example.driverapplication.utilities.ConnectionDetector; 
    import com.google.android.gms.common.ConnectionResult; 
    import com.google.android.gms.common.api.GoogleApiClient; 
    import com.google.android.gms.location.LocationRequest; 
    import com.google.android.gms.location.LocationServices; 

    public class LocationUpdate extends Service implements GoogleApiClient.ConnectionCallbacks, 
    GoogleApiClient.OnConnectionFailedListener { 
     private static final String TAG = "DRIVER"; 
     private LocationManager mLocationManager = null; 
     private static final int LOCATION_INTERVAL = 30000; 
     private static final float LOCATION_DISTANCE = 0; 
     private double currentLat, currentLng; 
     private SharedPreferences pref; 
     private String driverId; 
     private GoogleApiClient mGoogleApiClient; 
     // A request to connect to Location Services 
     private LocationRequest mLocationRequest; 

     private LocationListener locationListener; 

     private class LocationListener implements 
       com.google.android.gms.location.LocationListener { 

      public LocationListener() { 
      } 

      @Override 
      public void onLocationChanged(Location location) { 
       Log.e(TAG, "onLocationChanged: " + location); 
       currentLat = location.getLatitude(); 
       currentLng = location.getLongitude(); 

      } 


     } 


     @Override 
     public IBinder onBind(Intent arg0) { 
      return null; 
     } 

     @Override 
     public int onStartCommand(Intent intent, int flags, int startId) { 
      Log.e(TAG, "onStartCommand"); 
      super.onStartCommand(intent, flags, startId); 
      boolean stopService = false; 
      if (intent != null) 
       stopService = intent.getBooleanExtra("stopservice", false); 

      System.out.println("stopservice " + stopService); 

      locationListener = new LocationListener(); 
      if (stopService) 
       stopLocationUpdates(); 
      else { 
       if (!mGoogleApiClient.isConnected()) 
        mGoogleApiClient.connect(); 
      } 

      return START_STICKY; 
     } 

     @Override 
     public void onCreate() { 
      Log.e(TAG, "onCreate"); 
      pref = getSharedPreferences("driver_app", MODE_PRIVATE); 
      driverId = pref.getString("driver_id", ""); 
      mGoogleApiClient = new GoogleApiClient.Builder(this) 
      .addApi(LocationServices.API).addConnectionCallbacks(this) 
      .addOnConnectionFailedListener(this).build(); 
     } 



     @Override 
     public void onDestroy() { 
      Log.e(TAG, "onDestroy"); 
      super.onDestroy(); 
     } 

     public void stopLocationUpdates() { 
      LocationServices.FusedLocationApi.removeLocationUpdates(
        mGoogleApiClient, locationListener); 

      if (mGoogleApiClient.isConnected()) 
       mGoogleApiClient.disconnect(); 
     } 


     @Override 
     public void onConnectionFailed(ConnectionResult arg0) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void onConnected(Bundle arg0) { 
      // TODO Auto-generated method stub 
      mLocationRequest = LocationRequest.create(); 
      mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY); 
      mLocationRequest.setInterval(35000); 
      mLocationRequest.setFastestInterval(30000); 
      startLocationUpates(); 
     } 
     private void startLocationUpates() { 
      LocationServices.FusedLocationApi.requestLocationUpdates(
        mGoogleApiClient, mLocationRequest, locationListener); 
     } 


     @Override 
     public void onConnectionSuspended(int arg0) { 
      // TODO Auto-generated method stub 

     } 

    } 
+0

Обратите внимание, что Служба (в отличие от IntentService) работает в основном потоке приложения. Не создавая собственный поток в этой службе, вы заблокируете поток пользовательского интерфейса приложения, что может привести к плохой работе с пользователем. – lenrok258

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