4

我正在开发一个应用程序,它将不断从后台服务发送位置更新。我试过下面的代码。后台持续位置更新

public class LocationService extends Service implements LocationListener, 
GooglePlayServicesClient.ConnectionCallbacks, 
GooglePlayServicesClient.OnConnectionFailedListener { 
    LocationRequest mLocationRequest; 
    LocationClient mLocationClient; 
    @Override 
    public void onCreate() { 
    //creating log file in mobile 
     appendLog(DateFormat.getDateTimeInstance().format(new Date()) + ": Service created:", com.example.locationservice.Constants.LOG_FILE); 

     mLocationRequest = LocationRequest.create(); 
     mLocationRequest.setInterval(5*1000); 
     mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
    // mLocationRequest.setFastestInterval(5*1000); 
     mLocationClient = new LocationClient(getApplicationContext(), this,this); 
     mLocationClient.connect(); 

    } 
    @Override 
    public void onStart(Intent intent, int startId) { 
     int start = Service.START_STICKY; 
     appendLog(DateFormat.getDateTimeInstance().format(new Date()) + ": Service Started:", com.example.locationservice.Constants.LOG_FILE); 

    } 

    @Override 
    public void onConnectionFailed(ConnectionResult connectionResult) { 
     // TODO Auto-generated method stub 
     appendLog(DateFormat.getDateTimeInstance().format(new Date()) + ": Connection to client failed", com.example.locationservice.Constants.LOG_FILE); 
     this.stopSelf(); 

    } 

    @Override 
    public void onConnected(Bundle arg0) { 
     // TODO Auto-generated method stub 
     Log.i("info", "Location Client is Connected"); 
     appendLog(DateFormat.getDateTimeInstance().format(new Date()) + ": Location Client Connectd:", com.example.locationservice.Constants.LOG_FILE); 
     //checking for locaton enabled or not 
     if(Util.isLocationEnabled(getApplicationContext())){ 
     //checking for internet available or not 
      if(Util.isInternetOn(getApplicationContext())){ 
       mLocationClient.requestLocationUpdates(mLocationRequest, this); 
      }else{ 
       Log.i("info", "Internet not available"); 
       appendLog(DateFormat.getDateTimeInstance().format(new Date()) + ": Internet not available", com.example.locationservice.Constants.LOG_FILE); 
       this.stopSelf(); 
      } 
      }else{ 
      Log.i("info", "Location Acess disabled"); 
      appendLog(DateFormat.getDateTimeInstance().format(new Date()) + ": Location Acess disabled", com.example.locationservice.Constants.LOG_FILE); 
      this.stopSelf(); 
      } 
      Log.i("info", "Service Connect status :: " + isServicesConnected()); 

    } 

    @Override 
    public void onDisconnected() { 
     // TODO Auto-generated method stub 
     appendLog(DateFormat.getDateTimeInstance().format(new Date()) + ": Location Client DisConnectd:", com.example.locationservice.Constants.LOG_FILE); 
     Log.i("info", "Location Client is DisConnected"); 

    } 

    @Override 
    public void onLocationChanged(Location location) { 
     // TODO Auto-generated method stub 
     double latitude = location.getLatitude(); 
      double longitude = location.getLongitude(); 
      appendLog(DateFormat.getDateTimeInstance().format(new Date()) + ": Location Changed:", com.example.locationservice.Constants.LOG_FILE); 
      Log.i("info", "Latitude :: " + latitude); 
      Log.i("info", "Longitude :: " + longitude); 
      if(Util.isInternetOn(getApplicationContext())){ 
      //sending location details 
      sendLocation(location); 
      }else{ 
       this.stopSelf(); 
       Log.i("info", "Internet not available"); 
       appendLog(DateFormat.getDateTimeInstance().format(new Date()) + ": Internet not available", com.example.locationservice.Constants.LOG_FILE); 
      } 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     // TODO Auto-generated method stub 
     return null; 
    } 
    @Override 
    public void onDestroy() { 
     // TODO Auto-generated method stub 
     Log.i("info", "Service is destroyed"); 
     mLocationClient.removeLocationUpdates(this); 
     appendLog(DateFormat.getDateTimeInstance().format(new Date()) + ": Service Destroyed:", com.example.locationservice.Constants.LOG_FILE); 
     super.onDestroy(); 
    } 
    private boolean isServicesConnected() { 
      // Check that Google Play services is available 
      int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(LocationService.this); 
      // If Google Play services is available 
      if (ConnectionResult.SUCCESS == resultCode) {   
      return true; 
      } else { 
      return false; 
      } 
     } 
} 

onLocationChanged当我运行结束内置的地图应用调用只。另外明智的是它不更新位置细节。 我从使用警报服务的活动开始了此服务。每一分钟触发一次alarmManager。任何人都可以告诉我为什么onLocationChanged不能连续调用。

在此先感谢。

+0

是否确定设备有时间获得GPS第一次修复(正如您期望的高精度)。如果它一直困扰着你,你可以尝试我的代码从这个答案http://stackoverflow.com/questions/19365035/location-servise-gps-force-closed/19366773#19366773。多次成功地使用了它。 – cYrixmorten

回答

2

试试这个:

@Override 
public void onCreate() { 
//creating log file in mobile 
    appendLog(DateFormat.getDateTimeInstance().format(new Date()) + ": Service created:", com.example.locationservice.Constants.LOG_FILE); 

    mLocationClient = new LocationClient(getApplicationContext(), this,this); 
} 

替换为您在onStart:

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
mLocationClient.connect(); 
} 

和:

@Override 
public void onConnected(Bundle arg0) { 
mLocationRequest = LocationRequest.create(); 
mLocationRequest.setInterval(5*1000); 
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
mLocationClient.requestLocationUpdates(mLocationRequest, this); 
} 

调用服务:

startService(yourServiceIntent); 

您也可以查看我的代码here

+0

它在后台工作正常吗? 在后台运行45分钟后,服务不会停止吗? – Noman

0

它在后台工作正常吗?在后台运行45分钟后服务不会停止? - 诺曼15年11月3日6:18

这是一个很好的评论。我的项目中有一些proglem的位置更新时间很长。 45分钟后它真的停了下来。

我的服务是前台。我使用

StartForeground(ServicesId.Push,notification);

我每45分钟醒位置更新

_timer =新定时器(); (新的TimerTaskTrek(this),45 * 60 * 1000 + 10 * 1000,45 * 60 * 1000 + 10 * 1000);

和In的TimerTask

尝试 {

Looper.Prepare(); 

} 赶上(例外五) {

}

_client =新> GoogleApiClient.Bu ilder(this).AddApi(LocationServices.API) .AddConnectionCallbacks(this) .AddOnConnectionFailedListener(this) .Build();

_client。连接();

这很简单,它的工作非常好。 享受