【问题标题】:Getting GPS updates using fused location in background service For ex(15 mins)?在后台服务中使用融合位置获取 GPS 更新 For ex(15 分钟)?
【发布时间】:2016-10-18 15:36:42
【问题描述】:

我是 android 开发的新手,需要在没有用户交互的情况下在后台服务中获取 gps 位置,例如每 15 分钟需要获取坐标并将结果发送到服务器我该如何实现这一点。然后我尝试了融合位置 api 同步适配器组合。它可以工作,我正在获取坐标,但我需要在专用的 android-service 中使用该位置类我怎样才能实现这个需要使该服务运行 15 分钟获取坐标并发送该结果到服务器让我发布我的 Google 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我如何获取位置是否可以通过网络位置更新提前感谢!

【问题讨论】:

标签: android gps android-service fusedlocationproviderapi


【解决方案1】:

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

如果用户关闭 gps,您仍会收到(网络提供商)位置更新,但由于位置设置不充分,因此不准确。也为了解决这个问题,你可以使用SettingsApi

向位置服务发出请求时,设备的系统设置可能会阻止应用获取所需的位置数据。例如,GPS 或 Wi-Fi 扫描可能会关闭。

【讨论】:

  • 如果用户强制停止应用程序会自动重启怎么办
  • 没有。如果用户强制停止应用程序,它不会自动重启。用户必须自己再次明确启动应用程序。
  • @DavidWasser 的回答是正确的。同样在启动设备后,必须再次安排闹钟。
猜你喜欢
  • 2018-05-25
  • 2015-07-28
  • 1970-01-01
  • 1970-01-01
  • 2016-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-26
相关资源
最近更新 更多