2013-03-09 10 views
5

私は、ユーザーの現在地に基づいて最も近い場所を取得するGPS Androidアプリケーションを構築しています。ロケーションフィックスを取得するのに長い時間待っているユーザーを停止するにはどうすればよいですか?

  • チェックし、その後何もしない使用できない場合はどちらもGPSやネットワーク
  • 利用可能な場合:

    これは、私のアプリケーションが何をするかです。さもなければ、まずGPSがあるかどうかチェックし、そうでなければネットワークをチェックします。

  • これらのうちの1つを使用した後、現在の場所を取得してサーバーに送信します。
  • サーバーからデータを取得してUIを更新すると、さらに場所の更新を待機しなくなります。もう一度これを開始するリフレッシュボタンを押すまで、十分です。私はしたいと考えて何

  • GPSまたはネットワークが場所を取得するために失敗した場合、例えば、2分は、その後、我々は、プロバイダを切り替えます。ユーザーはあまりにも長く待たされることはありません。

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

は、ここに私のコードの一部です:

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方法です。私はlat/lngの値を取得し、それらを私のサーバに送り、それから適切なものを実行します。

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); 
} 
+0

あなたはこれを見ましたか?:http://android-developers.blogspot.com/2011/06/deep-dive-into-location.htmlプロトタイプのサンプルアプリですか?:https://code.google.com/p/android-protips-location/ –

+0

ネットワークプロバイダが不正ですが、1秒未満で位置が返されます – Reno

+0

こんにちはリノ、ありがとう。私はGPSとネットワークが正確さと速度の点で異なることを理解しています。これは私の質問に私をもたらします。どのプロバイダを利用できるかによって、プロバイダーの1つ、最も正確ですが、x時間後に修正が見つからない場合は、スイッチがオンになっている場合、ネットワークプロバイダに切り替えようとします。 –

答えて

0

GPSまたはネットワークのいずれかを使用すると、最終的な待ち時間を大幅に短縮することができません。

これらの場所の方法のいずれもが自分の欠点と利点があります:GPS衛星を発見し、キャリブレーションすることは驚異的なタスク(少なくとも 3を見つけることですので

  • GPSを通常、自分の位置を知るために時間がかかります正しく整列された衛星が必要です)。その上に、最終的な妨害物/環境を追加してシグナルを遮断する。アプリの起動前/起動時にGPSを有効にしない限り、待ち時間は必須です。 反対側のでは、きめ細かな場所が得られます。

  • 大まかな場所が必要な場合は、ネットワークを使用することが解決策です。数秒でデータが返されます。 位置の精度は、使用可能/使用されているネットワークによって異なります。実用的な例はありませんが、精度はと非常によく似ています()。 GPSは常にはネットワークよりも細かい位置にあります。

定義済みの選択肢はありません理解します。何もあなたのアプリがこのデータで何をするかによって異なります。

可能であればGPSを使用し、ネットワークに位置情報を要求し、GPSデバイスがない場合はネットワークにフォールバックします。そして、どちらか取る:

  • 最初-来て結果をGPSやネットワークを取得するために失敗した場合は、ちょうどあなたが最も正確なデータが必要な場合は

望ましい結果場所

  • が必要な場合たとえば2分後にプロバイダを切り替えます。ユーザーはあまりにも長く待たされることはありません。

  • いずれの場合も、フォールバックタイマーを作成しないでください。最初のプロバイダが失敗した場合の待機時間が長くなります。アンドロイドAPIが非同期ロケーション要求を許可しない限り、同時に両方のリクエストを実行します。

    +0

    ありがとうございます。私が前にリノのコメントに対する返信で述べたように、私はGPSとネットワークプロバイダの違いを理解しています。両方のリクエストを同時に使用することに関する私の質問と答えの両方を暗示しているので、私はこれがどのように実装されるのかを知りたいと思っていました。 2つのプロバイダを使用する場合、どのようにして最も正確な場所を選ぶでしょうか?また、質問の最後の部分で、プロバイダーの1つが有効になっていない場合はどうすればよいですか? –

    +0

    私が言ったように、GPSは常に最良の精度を持っています。しかし、正確さを要求することによってネットワークがどれほど正確であるかを知ることができないかぎり、GPSが利用可能なときにこの特定のネットワークの精度をキャッシュすることによって(2つのプロバイダの間で差をつける))、選択される。多分、異なる場所のプロバイダの値を平均化するのでしょうか? – ElementW

    関連する問題