2012-10-18 168 views
1

我已經知道如何使用,以獲取用戶的當前位置:Android後臺位置更新?

locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10, 500, locationListener) 

但什麼是在Android後臺運行位置更新時所需的通常的步驟?

我必須讓整個應用程序在GPS的後臺運行?

我基本上想要定期將用戶的緯度經度發送回我們的服務器,如果不是定時器,那麼可能會發生超過25米的運動。

我也不想殺死電池,這是GPS持續使用的臭名昭着。

任何想法?

回答

0

嗯,這很難做,因爲如果你不定期請求職位,你不能找出電話是否移動,它可以像汽車一樣快速移動,或者像個人一樣慢,所以我想出了一種可能性:

我不確切知道acelerometer如何在android上工作,它的精度是多少(確定它必須取決於設備),但可以使用這些傳感器間接評估近似行程距離。

[編輯]

注意,使用acelerometer會使用一些權力,你會需要它不停地運轉,所以使用GPS有一個較小的「採樣率」可以更有效和更精確的確定。

+1

GPS可能不是在任何時候都更加準確,尤其是在擁擠的城市與摩天大樓各地。在這種情況下,蜂窩網絡提供更準確的信息。 – Raptor

2

您可以使用蜂窩網絡以一定的時間間隔ping用戶的地理數據。一旦你發現位置已經被某個變量改變了,你就可以激活GPS並獲得確切的座標發送回你的服務器。記住要停止接收位置更新,一旦你完成(很明顯電池耗盡的原因。)

locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener); 

蜂窩網絡是準確的50米,這樣可以爲你的需要進行經常性劉炳章準確和電池之間的一些妥協生活。

2

該服務我已經使用更新我在後臺位置,我的本地服務器

import java.util.ArrayList; 

import org.apache.http.NameValuePair; 
import org.apache.http.message.BasicNameValuePair; 

import com.google.android.gcm.GCMRegistrar; 

import android.app.Service; 
import android.content.Context; 
import android.content.Intent; 
import android.location.Criteria; 
import android.location.Location; 
import android.location.LocationListener; 
import android.location.LocationManager; 
import android.os.Bundle; 
import android.os.IBinder; 
import android.util.Log; 
import android.widget.Toast; 

public class LocationService extends Service{ 

@Override 
public void onCreate() { 
// TODO Auto-generated method stub 
super.onCreate(); 
final LocationManager mlocmag = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
final LocationListener mlocList = new MyLocationList(); 
final Location loc = mlocmag.getLastKnownLocation(LocationManager.GPS_PROVIDER); 
    // This method is used to get updated location. 
mlocmag.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mlocList); 
LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 

Criteria criteria = new Criteria(); 
criteria.setAccuracy(Criteria.ACCURACY_FINE); 
String provider = lm.getBestProvider(criteria, true); 
Location mostRecentLocation = lm.getLastKnownLocation(provider); 
UpdateWithNewLocation(mostRecentLocation); 


} 

@Override 
public void onDestroy() { 
// TODO Auto-generated method stub 
super.onDestroy(); 
} 

@SuppressWarnings("deprecation") 
@Override 
public void onStart(Intent intent, int startId) { 
// TODO Auto-generated method stub 
super.onStart(intent, startId); 
} 
private void UpdateWithNewLocation(final Location loc) { 
    // TODO Auto-generated method stub 

    if(loc!= null) 
    { 
    final double lat =loc.getLatitude(); // Updated lat 
    final double Long = loc.getLongitude(); // Updated long 
    final String regId = GCMRegistrar.getRegistrationId(this); 
    ArrayList<NameValuePair> postParameters = new ArrayList<NameValuePair>(); 
    String Latitude=String.valueOf(lat); 
    String Longitude=String.valueOf(Long); 
    // define the parameter 
    postParameters.add(new BasicNameValuePair("lat",Latitude)); 
    postParameters.add(new BasicNameValuePair("lang", Longitude)); 
    postParameters.add(new BasicNameValuePair("regId", regId)); 
    String response = null; 

    // call executeHttpPost method passing necessary parameters 
    try { 
    response = CustomHttpClient.executeHttpPost(
    "http://192.168.0.144/location.php", // your ip address if using localhost server 

postParameters); 
    String result=response.toString(); 
    // Toast.makeText(this, result ,Toast.LENGTH_LONG).show(); 

    }catch (Exception e) { 
     Log.e("log_tag","Error in http connection!!" + e.toString());  
     } 
    } 

    else 
    { 
     String latLongStr = "No lat and longitude found"; 
     Toast.makeText(this, "Your location is "+latLongStr ,Toast.LENGTH_LONG).show(); 
    } 


} 
public class MyLocationList implements LocationListener 
{ 

public void onLocationChanged(Location arg0) { 
    // TODO Auto-generated method stub 
    UpdateWithNewLocation(arg0); 
} 

public void onProviderDisabled(String provider) { 
    // TODO Auto-generated method stub 
    Toast.makeText(getApplicationContext(),"GPS Disable ", Toast.LENGTH_LONG).show(); 
} 

public void onProviderEnabled(String provider) { 
    // TODO Auto-generated method stub 
    Toast.makeText(getApplicationContext(),"GPS enabled", Toast.LENGTH_LONG).show(); 
} 

public void onStatusChanged(String provider, int status, Bundle extras) { 
    // TODO Auto-generated method stub 

} 


} 
@Override 
public IBinder onBind(Intent arg0) { 
    // TODO Auto-generated method stub 
    return null; 
} 
}