Send location updates to IntentService

前端 未结 4 1835
离开以前
离开以前 2020-12-09 20:01

How can location updates be sent directly to Intent Service? The following approach does not work. OnConnected function is called but then the intent is never received in th

4条回答
  •  刺人心
    刺人心 (楼主)
    2020-12-09 20:40

    Here is working and tested code that successfully sets up an IntentService as the receiver for the Intent included in the PendingIntent used for location updates, based on code found here.

    First, the IntentService:

    import android.app.IntentService;
    import android.content.Intent;
    import android.location.Location;
    import android.util.Log;
    import com.google.android.gms.location.FusedLocationProviderApi;
    import com.google.android.gms.location.LocationResult;
    
    public class LocationUpdateService extends IntentService {
    
        private final String TAG = "LocationUpdateService";
        Location location;
    
        public LocationUpdateService() {
    
            super("LocationUpdateService");
        }
    
        @Override
        protected void onHandleIntent(Intent intent) {
            if (LocationResult.hasResult(intent)) {
                LocationResult locationResult = LocationResult.extractResult(intent);
                Location location = locationResult.getLastLocation();
                if (location != null) {
                     Log.d("locationtesting", "accuracy: " + location.getAccuracy() + " lat: " + location.getLatitude() + " lon: " + location.getLongitude());
                }
            }
        }
    }
    

    And here is the Activity code that registers for location updates with a PendingIntent that is sent to the IntentService:

    import android.app.PendingIntent;
    import android.os.Bundle;
    import android.content.Intent;
    import android.app.Activity;
    import android.widget.Toast;
    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 MainActivity extends Activity implements
            GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {
    
        LocationRequest mLocationRequest;
        GoogleApiClient mGoogleApiClient;
        PendingIntent mRequestLocationUpdatesPendingIntent;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            buildGoogleApiClient();
            mGoogleApiClient.connect();
        }
    
        @Override
        protected void onPause(){
            super.onPause();
            if (mGoogleApiClient != null) {
                LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, mRequestLocationUpdatesPendingIntent);
            }
        }
    
        protected synchronized void buildGoogleApiClient() {
            Toast.makeText(this,"buildGoogleApiClient",Toast.LENGTH_SHORT).show();
            mGoogleApiClient = new GoogleApiClient.Builder(this)
                    .addConnectionCallbacks(this)
                    .addOnConnectionFailedListener(this)
                    .addApi(LocationServices.API)
                    .build();
        }
    
        @Override
        public void onConnected(Bundle bundle) {
            Toast.makeText(this,"onConnected",Toast.LENGTH_SHORT).show();
    
            mLocationRequest = new LocationRequest();
            mLocationRequest.setInterval(10);
            mLocationRequest.setFastestInterval(10);
            mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
            //mLocationRequest.setSmallestDisplacement(0.1F);
    
            // create the Intent to use WebViewActivity to handle results
            Intent mRequestLocationUpdatesIntent = new Intent(this, LocationUpdateService.class);
    
            // create a PendingIntent
            mRequestLocationUpdatesPendingIntent = PendingIntent.getService(getApplicationContext(), 0,
                    mRequestLocationUpdatesIntent,
                    PendingIntent.FLAG_UPDATE_CURRENT);
    
            // request location updates
            LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient,
                    mLocationRequest,
                    mRequestLocationUpdatesPendingIntent);
        }
    
        @Override
        public void onConnectionSuspended(int i) {
            Toast.makeText(this,"onConnectionSuspended",Toast.LENGTH_SHORT).show();
        }
    
        @Override
        public void onConnectionFailed(ConnectionResult connectionResult) {
            Toast.makeText(this,"onConnectionFailed",Toast.LENGTH_SHORT).show();
        }
    }
    

    Resulting logs:

     D/locationtesting﹕ accuracy: 10.0 lat: 37.779702 lon: -122.3931595
     D/locationtesting﹕ accuracy: 10.0 lat: 37.7797023 lon: -122.3931594
     D/locationtesting﹕ accuracy: 10.0 lat: 37.7797022 lon: -122.3931596
     D/locationtesting﹕ accuracy: 10.0 lat: 37.7797021 lon: -122.3931597
     D/locationtesting﹕ accuracy: 10.0 lat: 37.7797021 lon: -122.3931596
     D/locationtesting﹕ accuracy: 10.0 lat: 37.7797019 lon: -122.3931597
     D/locationtesting﹕ accuracy: 10.0 lat: 37.7797019 lon: -122.3931597
    

提交回复
热议问题