7
  • Jak pobrać aktualną lokalizację przy użyciu nowego FusedLocation API z IntentService?
  • W jaki sposób można się upewnić, że IntentService otrzyma wszystkie callbacków z FusedLocation API? ie, Jak mogę synchronicznie uzyskać obiekt lokalizacji ?
+5

Start, zastępując 'IntentService' z usług regularnych. 'IntentService' nie obsługuje wywoływania interfejsów API, które same są asynchroniczne, np. Interfejs API dostawcy lokalizacji. Będziesz potrzebować regularnej usługi, z własnym wątkiem w tle (w razie potrzeby), gdzie możesz zamknąć usługę tylko wtedy, gdy otrzymasz dane (lub jakiś czas oczekiwania). "Jak mogę uzyskać obiekt lokalizacji synchronicznie?" - nie ma żadnej gwarancji, że możesz, dlatego zastępujesz 'IntentService' usługą regularną. – CommonsWare

+0

@DroidHacker rozwiązałeś ten problem? – rup35h

Odpowiedz

4

To mogą pomóc

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

Należy zauważyć, że usługa (w przeciwieństwie do IntentService) działa w głównym wątku aplikacji. Nie tworząc własnego wątku w tej usłudze, będziesz blokować wątek interfejsu użytkownika, co może prowadzić do złego doświadczenia użytkownika. – lenrok258

Powiązane problemy