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。連接();

這很簡單,它的工作非常好。 享受