ユーザーの場所を 5 分ごとにデータベースに送信するアプリケーションを作成しようとしています。その後、ユーザーはそれを見ることができます。いくつかの制約があります:
ユーザーが移動していない場合は、別の場所を生成しないでください。現在の場所までの新しい場所の距離が 1800M を超えているかどうかを確認することでこれを行います (精度が 900 未満の場所のみを使用するため、可能性のある場所の半径は 1800 です)。
現在地の精度に基づいてより良い位置情報を取得できる場合は、それを使用します。
だから私は今私のコードを提供します.それについてどう思うか、そしてそれが完全に機能していないのでもっとうまくできるかどうか知りたいです. 明確な質問が必要な場合:私のコードを無視してください。私が言及した2つのポイントをどのように実装すればよいですか。
コードは次のとおりです。
public void onStart(Intent intent, int startId)
{
...
this.timer.scheduleAtFixedRate(new Send(), d1, TEN_MINUTES/2);
}
...
if (mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER))
mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, TEN_MINUTES/2, 0, listener);
if (mLocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER))
mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, TEN_MINUTES/2, 0, listener);
...
@Override
public void onLocationChanged(Location location)
{
handleLocation(location);
}
private void handleLocation(Location location)
{
if(isUsable(location))
{
this.isUsable = true;
this.newLocation = location;
}
}
public boolean isUsable(Location location)
{
if (mGeocoderAvailable)
{
this.address = reverseGeocode(location);
return location.hasAccuracy() && location.getAccuracy() < 900 && !this.address.equals("");
}
return false;
}
class Send extends TimerTask
{
boolean run = true;
@SuppressWarnings("deprecation")
public void run()
{
if(isUsable)
{
isUsable = false;
if(newLocation != null)
{
if(location != null)
{
if(location.getAccuracy() > newLocation.getAccuracy() + 100)
sendTask();
else
if(newLocation.distanceTo(location) > 1800)
sendTask();
}
else
sendTask();
}
}
}
}
コードの最も重要な部分は、もちろん Send クラスとisUsable
、制約を定義するメソッドです。
発生したバグは同じアドレスの重複です。これは、この状況がこのケースをカバーする必要があるためです。
if(newLocation.distanceTo(location) > 1800)
もう 1 つのことは、携帯電話で車を 20 km 運転しましたが、運転を終了したとき (20 km 後) にのみ、データベースに位置情報が表示されませんでした。