在后台服务中使用融合位置获取GPS更新(15分钟)



我是新的android开发需要在后台服务中获得gps位置,而无需用户交互,就像每15分钟需要获取坐标并将结果发送到服务器,我如何才能实现这一点。然后我尝试融合位置api syncadapter组合。它的工作原理,我得到坐标,但我需要在专用的android服务中使用该位置类,我如何才能实现这一需要,使该服务运行每15分钟获取坐标,并将结果发送到服务器,让我发布我的谷歌api客户端类。请检查下面的代码,我已经试过了。

import android.content.Context;
import android.location.Location;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.util.Log;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesUtil;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.common.api.PendingResult;
import com.google.android.gms.common.api.Status;
import com.google.android.gms.location.FusedLocationProviderApi;
import com.google.android.gms.location.LocationListener;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;
import java.text.DateFormat;
import java.util.Date;
/**
 * Created by 4264 on 14-10-2016.
 */
public class Locationlistener implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener,LocationListener  {

    LocationRequest mLocationRequest;
    GoogleApiClient mGoogleApiClient;
    Location mCurrentLocation;
    String mLastUpdateTime;
    private Context context;
    private static final long INTERVAL = 1000 * 10;
    private static final long FASTEST_INTERVAL = 1000 * 5;
    public Locationlistener(Context c)
    {
        context=c;
        //show error dialog if GoolglePlayServices not available
        createLocationRequest();
        mGoogleApiClient = new GoogleApiClient.Builder(context)
                .addApi(LocationServices.API)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .build();
        mGoogleApiClient.connect();
    }
    protected void createLocationRequest() {
        mLocationRequest = new LocationRequest();
        mLocationRequest.setInterval(INTERVAL);
        mLocationRequest.setFastestInterval(FASTEST_INTERVAL);
        mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    }
    public String lat(){
        String lat=null;
        if(mCurrentLocation==null){
            Log.d("is null","null");
        }
        else {
            lat=String.valueOf(mCurrentLocation.getLatitude());
        }
        return lat;
    }
    protected void startLocationUpdates() {
        PendingResult<Status> pendingResult = LocationServices.FusedLocationApi.requestLocationUpdates(
                mGoogleApiClient, mLocationRequest, this);
        Log.d("started", "Location update started ..............: ");
    }
    public void updateUI() {
        Log.d("updated", "UI update initiated .............");
        if (null != mCurrentLocation) {
            String lat = String.valueOf(mCurrentLocation.getLatitude());
            String lng = String.valueOf(mCurrentLocation.getLongitude());
            Log.e("latw",lat);
            Log.e("Long",lng);
        } else {
            Log.d("", "location is null ...............");
        }
    }

    @Override
    public void onConnected(Bundle bundle) {
        Log.d("connected", "onConnected - isConnected ...............: " + mGoogleApiClient.isConnected());
        startLocationUpdates();
    }

    @Override
    public void onConnectionSuspended(int i) {
    }


    @Override
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
        Log.d("failed", "Connection failed: " + connectionResult.toString());
    }
    @Override
    public void onLocationChanged(Location location) {
        Log.d("locationchanged", "Firing onLocationChanged..............................................");
        mCurrentLocation = location;
        mLastUpdateTime = DateFormat.getTimeInstance().format(new Date());
        updateUI();
    }
}

它在syncadapter工作,但我需要使这个服务,我怎么能实现这一点,另一个疑问,如果用户关闭gps我怎么能得到位置是可能的,网络位置更新提前感谢!!

我建议您使用AlarmManager唤醒设备并尽快接收位置(间隔0),然后每隔15分钟继续睡眠。所以这种方式优于直航服务。

如果用户关闭gps,您仍将获得(网络提供商)位置更新,但由于位置设置不充分而不准确。同样为了解决这个问题,你可以使用SettingsApi

当请求位置服务时,设备的系统设置可能处于阻止应用程序获取所需位置数据的状态。例如,GPS或Wi-Fi扫描可能被关闭。

最新更新