5

ユーザーの現在の位置に基づいて最も近い場所を取得する GPS Android アプリケーションを構築しています。

これは私のアプリケーションが行うことです:

  • GPS またはネットワークが利用可能かどうかを確認する
  • どちらも利用できない場合は、何もしないでください。それ以外の場合は、最初に GPS があるかどうかを確認し、そうでない場合はネットワークを確認します。
  • それらのいずれかを使用した後、現在の場所を取得してサーバーに送信します。
  • サーバーからデータを取得して UI を更新すると、それ以降の場所の更新のリッスンを停止します。もう一度開始する更新ボタンを押すまでは、1 回で十分です。

私がやりたいこと:

  • GPS またはネットワークが場所の取得に失敗した場合 (たとえば 2 分)、プロバイダーを切り替えます。ユーザーを長時間待たせたくありません。

  • また、両方のプロバイダーを使用して、そこから最も正確なものを取得できるとよいでしょう。http://developer.android.com/guide/topics/location/strategies.htmlを見て、isBetterLocation メソッドを見ました。このメソッドをアプリケーションにどのように統合しますか? どのように、どこで、いつ呼び出す必要があるのか​​ 理解できません。isBetterLocation() では、Network と GPS の両方を同時に呼び出す必要があると思います。私のアプリケーションが正確さのために両方をリッスンするのはいいことです。どうすればいいですか?それらのいずれかが利用できない場合はどうなりますか?

これが私のコードの一部です:

if(!GPSEnabled && !networkEnabled)
{
    Toast.makeText(this, "Error: This application requires a GPS or network connection",
            Toast.LENGTH_SHORT).show();
}
else
{
    if(GPSEnabled)
    {
        locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
    }
    else if(networkEnabled)
    {
        System.out.println("Getting updates from network provider");
        locManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, this);
    }
}

これがonLocationChanged方法です。緯度/経度の値を取得してサーバーに送信し、適切な処理を行います。

public void onLocationChanged(Location location)
{
    //Get coordinates
    double lat = (location.getLatitude());
    double lng = (location.getLongitude());
    Log.d("MainActivity", "got location: " + lat + ": " + lng);
    //get nearest locations
    new GetLocations().execute(SharedVariables.root + SharedVariables.locationsController + SharedVariables.getNearestMethod + lat + "/" + lng); 

    // Zoom in, animating the camera after the markers have been placed
    map.animateCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(lat, lng), 10));
    System.out.println("lat = " + lat + ", lng = " + lng);

     //Stop listening for updates. We only want to do this once. 
     locManager.removeUpdates(this);
}
4

1 に答える 1

0

GPS を使用してもネットワークを使用しても、現在地を取得するまでの最終的な待ち時間を大幅に短縮することはできません。

これらのロケーション方法には、どちらも欠点と利点があります。

  • GPS 衛星を見つけて調整するのは大変な作業なので、通常、GPS は現在地を知るのに時間がかかります (少なくとも3 つの正確に位置合わせされた衛星を見つける必要があります)。その上に、信号をブロックする最終的な障害物/環境を追加します。アプリの開始前/開始時に GPS を有効にしない限り、待機は必須です。反対側では、きめの細かい場所が得られます。

  • 大まかな場所だけが必要な場合は、ネットワークを使用するのが解決策です。数秒でデータが返されます。ただし、ロケーションの精度は、利用可能な/使用されているネットワークによって異なります。実用的な例はありませんが、精度は大きく異なる可能性があると思います。GPS は常に、ネットワークよりも正確な位置情報を提供します。

事前定義された選択肢がないことを理解してください。アプリがこのデータをどのように処理するかによって、すべてが決まります。

GPS が利用可能な場合は、ネットワークへの位置要求を行う際に使用し、GPS デバイスがない場合はネットワークにフォールバックします。次に、次のいずれかを実行します。

  • 場所だけが必要な場合の最初の結果
  • 最も正確なデータが必要な場合の好ましい結果

GPS またはネットワークが場所の取得に失敗した場合 (たとえば 2 分)、プロバイダーを切り替えます。ユーザーを長時間待たせたくありません。

どちらの場合も、フォールバック タイマーを作成しないでください。最初のプロバイダーが失敗した場合に待機時間を長くするだけです。したがって、Android API が非同期の位置情報リクエストを許可しない限り、両方のリクエストを同時に行ってください。

于 2013-03-09T17:05:46.973 に答える