位置更新如何直接发送到Intent服务?以下方法不起作用. OnConnected函数被调用,但是在服务中从未接收到该意图:
... private PendingIntent getLocationPendingIntent(boolean shouldCreate) { Intent broadcast = new Intent(m_context,LocationUpdateService.class); int flags = shouldCreate ? 0 : PendingIntent.FLAG_NO_CREATE; return PendingIntent.getService(m_context,broadcast,flags); } @Override public void onConnected(Bundle arg0) { PendingIntent locationPendingIntent = getLocationPendingIntent(true); LocationRequest locationRequest = new LocationRequest(); locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); locationRequest.setInterval(LOCATION_UPDATE_INTERVAL); locationRequest.setFastestInterval(LOCATION_FASTEST_UPDATE_INTERVAL); LocationServices.FusedLocationApi.requestLocationUpdates(m_googleApiClient,locationRequest,locationPendingIntent); } ...
意向服务:
import android.app.IntentService; import android.content.Intent; import android.util.Log; public class LocationUpdateService extends IntentService { public LocationUpdateService() { super(LocationUpdateService.class.getName()); } @Override public int onStartCommand(Intent intent,int flags,int startID) { super.onStartCommand(intent,flags,startID); Log.d("LocationUpdateService","Location received"); return START_REDELIVER_INTENT; } @Override protected void onHandleIntent(Intent intent) { Log.d("LocationUpdateService","Intent received"); } }
清单文件:
... <service android:name=".LocationUpdateService" /> ...
解决方法
这里是基于代码找到的代码,成功地将IntentService设置为用于位置更新的PendingIntent中包含的Intent的接收者.
首先,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()); } } } }
并且这里是活动代码,注册用于发送到IntentService的PendingIntent的位置更新:
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(),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(); } }
结果日志:
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