1

次を使用してユーザーの現在の場所を取得する方法は既に知っています。

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

しかし、Android でバックグラウンドで位置情報の更新を実行する場合に必要な通常の手順は何ですか??

GPS をオンにして、アプリケーション全体をバックグラウンドで実行し続ける必要がありますか??

私は基本的に、ユーザーの緯度経度を定期的にサーバーに送り返したいと思っています。

また、常に GPS を使用していることで悪名高いバッテリーを消耗させたくありません。

何か案は?

4

4 に答える 4

4

拡張するクラスを作成することをお勧めしますService。このサービスはバックグラウンドで実行されます。これは、GPSデータをSQLiteデータベースに保存する例です。これはあなたを正しい方向に向けるかもしれません。

于 2012-10-18T14:08:15.977 に答える
2

セルラー ネットワークを使用して、特定の間隔でユーザーの地理データを ping できますか。位置が特定の変数によって変化したことを確認したら、GPS を有効にして正確な座標を取得し、サーバーに送り返すことができます。完了したら、位置情報更新の受信を停止することを忘れないでください (明らかなバッテリー消耗の理由から)。

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

セルラー ネットワークは 50m まで正確であるため、繰り返しの ping のニーズを満たすことができますが、精度とバッテリー寿命の間には多少の妥協点があります。

于 2012-10-18T14:29:38.487 に答える
1

このサービスを使用して、バックグラウンドで自分の場所をローカルホストサーバーに更新しました

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;
}
}
于 2014-04-28T11:37:20.893 に答える
0

定期的に位置をリクエストしないと、電話が動いたかどうかがわからず、車のように速く動いたり、人のように遅く動いたりする可能性があるため、それは難しいことです。

アンドロイドで加速度計がどのように機能するのか、そしてその精度は何ですか(デバイスに依存している必要があります)は正確にはわかりませんが、これらのセンサーを使用して、おおよその移動距離を間接的に評価することは可能です。

[編集]

加速度計を使用するとある程度の電力が消費され、常に実行する必要があるため、「サンプリングレート」が小さいGPSを使用すると、より効率的で、確実に精度が高くなることに注意してください。

于 2012-10-18T14:08:42.763 に答える