私は、位置が変更されたらGPS座標を送信するアプリを作成しています。私は車両が動いているときだけデータを送る必要があります。どうすればこのことを知ることができますか?私は、加速度センサー 移動中の車内でAndroid携帯を追跡する最善の方法
これを行うための最善の方法は何を使用してonLocationChanged, getSpeed();
- を得ましたか。
私は、位置が変更されたらGPS座標を送信するアプリを作成しています。私は車両が動いているときだけデータを送る必要があります。どうすればこのことを知ることができますか?私は、加速度センサー 移動中の車内でAndroid携帯を追跡する最善の方法
これを行うための最善の方法は何を使用してonLocationChanged, getSpeed();
onLocationChanged
おそらくあなたの最善の策でしょう。これは電池でかなり重くなる可能性があるので、周波数に注意してください。誤っていない場合、加速度計は、デバイスの回転のように、3軸に沿った動きを検出するために使用されます。移動する車は、妥当なユースケースのようには聞こえません。
@BiGGZの回答によれば、OnLocationChanged()がこれを行う最も良い方法です。ここでは、サービスで実行されるサンプルコードをバックグラウンドで追跡します。
public class GPSService extends Service implements GoogleApiClient.ConnectionCallbacks,GoogleApiClient.OnConnectionFailedListener,LocationListener {
private int i=0;
private GoogleApiClient mGoogleApiClient;
private DatabaseHelper myDb;
private LocationRequest mLocationRequest;
private int uniqueInt=0;
private PowerManager.WakeLock wakeLock;
private String templat, templong;
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
PowerManager mgr = (PowerManager)this.getSystemService(Context.POWER_SERVICE);
wakeLock = mgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakeLock");
wakeLock.acquire();
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addApi(LocationServices.API)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();
myDb =new DatabaseHelper(this);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
mGoogleApiClient.connect();
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
mGoogleApiClient.disconnect();
wakeLock.release();
super.onDestroy();
}
@Override
public void onConnected(Bundle bundle) {
mLocationRequest = LocationRequest.create();
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
mLocationRequest.setInterval(1000); // Update location every second
LocationServices.FusedLocationApi.requestLocationUpdates(
mGoogleApiClient, mLocationRequest, this);
}
@Override
public void onConnectionSuspended(int i) {
Toast.makeText(this,"GoogleApiClient connection has been suspend",Toast.LENGTH_SHORT).show();
}
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
Toast.makeText(this,"GoogleApiClient connection has failed",Toast.LENGTH_SHORT).show();
}
@Override
public void onLocationChanged(Location location) {
double lat = location.getLatitude(), lon = location.getLongitude();
// Toast.makeText(this,lat+"--->"+lon,Toast.LENGTH_SHORT).show();
//Do your task here!!
}
}
そして、私はあなたがバッテリーを節約したい場合は、5秒または10秒に変更し、場所1秒を追跡する頻度を撮影しました。
EDIT:あなたのデバイスの計算速度について
、あなたの2間の計算差のための方法以下の使用は、ex((メートルで)座標を追跡した後、トラッキング周波数によって、これを分割できた場合5で割ます。 5秒ごとに位置を追跡しています)。あなたはm/sであなたにスピードを与えます。
public double distance(String lat1, String lon1, String lat2, String lon2){
double earthRadius = 6378.137;
double dLat = Double.parseDouble(lat2)*Math.PI/180 - Double.parseDouble(lat1)*Math.PI/180;
double dLon = Double.parseDouble(lon2)*Math.PI/180 - Double.parseDouble(lon1)*Math.PI/180;
double a = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.cos(Double.parseDouble(lat1)*Math.PI/180) * Math.cos(Double.parseDouble(lat2)*Math.PI/180)*
Math.sin(dLon/2) * Math.sin(dLon/2);
double c = 2 * Math.atan2(Math.sqrt(a),Math.sqrt(1-a));
double d = earthRadius*c;
return d*1000; //distance in meter.
}
・ホープ、このことができます:)
をデバイスのあまりバッテリーを必要とせずに、あなたが望むものを達成するための最良の方法は、ユーザーがAwareness APIを使用して車の中にあるときに検出することです。
ユーザの現在の活動(、ランニングウォーキング、運転など)を確認するには、次のように取得する必要があります。このAPIを使用する場合は、あなたのAndroidManifestでcom.google.android.gms.permission.ACTIVITY_RECOGNITION
許可を宣言することを忘れないでください、とチェック
Awareness.SnapshotApi.getDetectedActivity(mGoogleApiClient)
.setResultCallback(new ResultCallback<DetectedActivityResult>() {
@Override
public void onResult(@NonNull DetectedActivityResult detectedActivityResult) {
if (!detectedActivityResult.getStatus().isSuccess()) {
Log.e(TAG, "Could not get the current activity.");
return;
}
ActivityRecognitionResult ar = detectedActivityResult.getActivityRecognitionResult();
DetectedActivity probableActivity = ar.getMostProbableActivity();
Log.i(TAG, probableActivity.toString());
}
});
実行時のユーザーの許可。
は大丈夫ですか?編集内容を確認してください。 – Kaushal28
@ Kaushal28:チェックしています。ありがとう、 – Senps
あなたが完了した場合、あなたは答えを受け入れることができます。 – Kaushal28