我想使用最新的融合位置提供商客户端在“后台服务”上获取位置更新.我不想使用所有正在使用的位置监听器和Google API客户端.
我还需要使用谷歌播放服务提供的位置设置Api来检查位置设置是否禁用或启用“后台服务”.请帮助.
我还需要使用谷歌播放服务提供的位置设置Api来检查位置设置是否禁用或启用“后台服务”.请帮助.
解决方法
如果我们需要使用fusion location api,那么我们需要使用Google API客户端,对于后台服务,使用它不是问题,以下是我用于在后台获取位置更新的示例,但还有一件事是Google从6.0引入’DOZE’模式,所以当你的设备处于’DOZE’模式时,我无法给予保证更新,@H_301_7@import android.Manifest;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.location.Location;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.util.Log;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GoogleApiAvailability;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.location.LocationListener;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;
/**
* Created By Dhaval Solanki
*/
public class ConnectionService extends Service implements GoogleApiClient.ConnectionCallbacks,GoogleApiClient.OnConnectionFailedListener,LocationListener {
String TAG = "ConnectionService";
private GoogleApiClient mGoogleApiClient;
private LocationRequest mLocationRequest;
private Location prevIoUsLocation;
public static final long UPDATE_INTERVAL_IN_MILLISECONDS = 30000;
public static final long FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS =
UPDATE_INTERVAL_IN_MILLISECONDS / 2;
private Location mLastLocation;
private Context context;
@Override
public IBinder onBind(Intent intent) {
Log.i(TAG,"onBind");
return null;
}
@Override
public int onStartCommand(Intent intent,int flags,int startId) {
context = getApplicationContext();
Log.i(TAG,"onStartCommand");
if (checkPermsion(context)) {
setupLocationService(context);
}
return Service.START_STICKY;
}
@Override
public void onCreate() {
super.onCreate();
ApplicationCLass.isServiceRunning = true;
}
@Override
public boolean onUnbind(Intent intent) {
Log.i(TAG,"onUnbind");
ApplicationCLass.isServiceRunning = false;
return super.onUnbind(intent);
}
@Override
public void onDestroy() {
ApplicationCLass.isServiceRunning = false;
super.onDestroy();
}
private void setupLocationService(Context context) {
if (checkPlayServices()) {
mGoogleApiClient = new GoogleApiClient.Builder(context)
.addApi(LocationServices.API)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();
createLocationRequest();
}
}
protected void createLocationRequest() {
mLocationRequest = new LocationRequest().create();
mLocationRequest.setInterval(UPDATE_INTERVAL_IN_MILLISECONDS);
mLocationRequest.setFastestInterval(FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS);
mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
mGoogleApiClient.connect();
}
public boolean checkPermsion(Context context) {
int MyVersion = Build.VERSION.SDK_INT;
if (MyVersion > Build.VERSION_CODES.LOLLIPOP_MR1) {
if (ContextCompat.checkSelfPermission(context,Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return false;
} else if (ContextCompat.checkSelfPermission(context,Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return false;
} else {
return true;
}
} else {
return true;
}
}
private boolean checkPlayServices() {
GoogleApiAvailability googleAPI = GoogleApiAvailability.getInstance();
int result = googleAPI.isGooglePlayServicesAvailable(this);
if (result != ConnectionResult.SUCCESS) {
return false;
}
return true;
}
private void startLocationUpdates() {
if (mGoogleApiClient.isConnected()) {
if (ActivityCompat.checkSelfPermission(this,Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this,Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
if (Prefs.getUserLat(context).trim().length() > 0 && Prefs.getUserLong(context).trim().length() > 0) {
} else {
mLastLocation = LocationServices.FusedLocationApi.getLastLocation(
mGoogleApiClient);
if (mLastLocation != null) {
Prefs.setUserLat(context,String.valueOf(mLastLocation.getLatitude()));
Prefs.setUserLong(context,String.valueOf(mLastLocation.getLongitude()));
}
}
LocationServices.FusedLocationApi.requestLocationUpdates(
mGoogleApiClient,mLocationRequest,this);
}
}
@Override
public void onConnected(@Nullable Bundle bundle) {
Log.i(TAG,"Connected to onConnected");
startLocationUpdates();
}
@Override
public void onConnectionSuspended(int i) {
Log.i(TAG,"Connected to onConnectionSuspended");
}
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
Log.i(TAG,"Connected to onConnectionFailed");
}
@Override
public void onLocationChanged(Location location) {
try {
Logger.print("onLocationChanged","latitued :" + location.getLatitude() + ",Longitude " + location.getLongitude());
} catch (Exception e) {
e.printStackTrace();
}
}
}
另一个alaram服务继续运行或不运行
@H_301_7@import android.app.ActivityManager; import android.app.IntentService; import android.content.Context; import android.content.Intent; import android.util.Log; public class AlarmService extends IntentService { @Override protected void onHandleIntent(Intent intent) { boolean isServiceRunning = false; ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) { if (ConnectionService.class.getName().equals(service.service.getClassName())) { isServiceRunning = true; break; } } Log.i("AlarmService","Service is running " + isServiceRunning); if(!isServiceRunning) { startService(new Intent(getApplicationContext(),ConnectionService.class)); } else { ConnectionService.checkConnectionAndConnect(getApplicationContext()); } } /** * Creates an IntentService. Invoked by your subclass's constructor. */ public AlarmService() { super("AlaramService"); } }最后开始服务
@H_301_7@private void checkAndStartService() { final ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); new AsyncTask<Void,Void,Boolean>() { boolean isServiceRunning = false; @Override protected Boolean doInBackground(Void... params) { for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) { if (ConnectionService.class.getName().equals(service.service.getClassName())) { isServiceRunning = true; break; } } return isServiceRunning; } @Override protected void onPostExecute(Boolean aBoolean) { super.onPostExecute(aBoolean); Log.i("onPostExecute","Service running = " + aBoolean); if (!aBoolean) { startService(new Intent(ActivitySplash.this,ConnectionService.class)); Intent i = new Intent(ActivitySplash.this,AlarmService.class); PendingIntent pi = PendingIntent.getService(ActivitySplash.this,i,0); AlarmManager am = (AlarmManager) ActivitySplash.this.getSystemService(Context.ALARM_SERVICE); am.cancel(pi); // cancel any existing alarms am.setRepeating(AlarmManager.RTC_WAKEUP,System.currentTimeMillis(),60000,pi); } } }.execute(); }