4

GPS とネットワークの両方をリッスンする LocationListener を実装する Service があります。

アプリケーションは一定の位置情報フィードに依存していますが、GPS が位置情報を取得するのに苦労している場合、ネットワークの位置情報が介入しないようです。

manager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000 * 30,0, LocationReporterService.this);
manager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000 * 60 * 2,0, LocationReporterService.this);

質問
常に場所を取得するにはどうすればよいですか?
GPS 位置情報を取得できない場合、ネットワーク位置情報を取得するにはどうすればよいですか?
既知のバグですか?
GPSLocationService と NetworkLocationsService の 2 つのサービスが必要ですか?
これに対する解決策はありますか?:)

4

2 に答える 2

7

私はAlexBottoniの良い答えからのコメントのほとんどに同意しますが、いくつかの点で彼を支持することはできません.

概要

まず、正しく実行しているかどうかを確認するため...

LocationListener両方のプロバイダーに同じ設定を行います。場所を受信して​​いる場所を特定するには、次のようにテストする必要があります。

public void onLocationChanged(Location fix) {
    if(fix.getProvider().equals(LocationManager.GPS_PROVIDER)){
        //here Gps
    } else if(fix.getProvider().equals(LocationManager.NETWORK_PROVIDER)){
        //here Network
    }

また、別の取得頻度を設定します。は、30 秒ごとおよび 2 分ごとGpsに新しい場所を提供しています。Network

最小距離を課さなかったので、Location要求された頻度で (修正を取得できる限り) 各プロバイダーから新しいものを受け取る必要があります。修正プログラムが届かない場合は、修正プログラムを入手できなかったことが原因です。

また、衛星と同期して位置を修正するのに時間がかかる場合があるため、(主に Gps を使用して) 修正を取得するのに要求されたよりも少し時間がかかる場合があります。

後退する

あるプロバイダーから別のプロバイダーへの組み込みのフォールバックはありません。アレックスが言ったように、彼らは独立しています。フォールバックを実装するために次のアプローチを使用しています。

  • GPS リスナーを登録してタイマーを開始する
  • すべての GPS 位置で、タイマーを再起動します
  • タイマーが終了したら、ネットワーク リスナーを登録します (GPS リスナーは登録されたままになります)。
  • 新しい GPS ロケーションが到着したら、ネットワーク リスナーの登録を解除し、タイマーを再起動します

好ましいプロバイダー

どこでも利用できるわけGpsではありませんが、はるかに正確Networkです。私の町では、GPS で 6 メートル、ネットワークで 1 Km の精度が得られます :-(

2つのサービス

リスナー、アクティビティ、またはサービスを登録する場所は関係ありません。それらを要求し、プロバイダーが修正を取得できる限り、場所を取得できます (アプリケーションにバグがないと仮定して :-))

ファイナルノート

必要な権限があることを確認してください (ACCESS_FINE_LOCATION、INTERNET など)。

電話のセットアップでネットワーク ロケーションが有効になっていることを確認します (通常、デフォルトでは無効になっています)。

ほとんどの Gps 受信機は、衛星の位置に関する情報の更新をサポートしているため、修正時間が短縮されます。あなたGPS Satusはそれを行うために、市場から使用することができます.

よろしく。

于 2012-11-30T21:09:55.640 に答える
3

知る限り、Android は最初の選択肢 (GPS) が機能しない場合にのみ 2 番目の選択肢 (ネットワーク ロケーション プロバイダー) にフォールバックしないため、これは非常に奇妙です。2 つのロケーション プロバイダーは独立しており、位置の更新をリスナーに個別に送信する必要があります。したがって、いずれの場合でも、最初のもの (GPS) が 2 番目のもの (ネットワーク) をブロックすることはできません。

ご質問について:

常に場所を取得するにはどうすればよいですか?

あなたはそうしない。確認する方法はありません。場所の参照が利用できないという理由だけで、場所の修正を取得できない場合があります。これは地下鉄/地下鉄の駅でよく見られます。GPS も、セルラー アンテナもありません (誰もがニューヨークやロンドンに住んでいるわけではありません...)。Wi-Fi ホットスポットもありません。信じられないかもしれませんが、私の町の新しい病院では、GPS コンステレーションが見えず (屋内...)、Wi-Fi ホットスポットがまだ設置されておらず、CellID アンテナしか利用できないため、現在このような状況にあります。数百メートル離れているため、建物の外側と内側の両方で、どこでも同じ信号を受信できます。

GPS 位置情報を取得できない場合、ネットワーク位置情報を取得するにはどうすればよいですか?

あなたもできません。利用可能なネットワークによって異なります。とにかく、コード内のロケーション プロバイダーから取得したものを確認し、使用可能なロケーション フィックスが得られるまで、あるプロバイダーから次のプロバイダーに切り替えることができます。

既知のバグですか?

いいえ、バグではありません。これは、既存の技術の既知の限界です。

GPSLocationService と NetworkLocationsService の 2 つのサービスが必要ですか?

それは試してみるものです。ニックがすでに言ったように、これは問題にはならないはずですが、チェックが問題になることはありません。

これに対する解決策はありますか?:)

アプリが主に都市環境 (町) で使用されることを意図している場合は、ほとんどの場合、ネットワーク ロケーション エンジンをメイン ロケーション エンジンとして使用する必要があります。今日では、すべての村や町が携帯電話アンテナの大規模なセットと Wi-Fi ホットスポットの大規模なセットによってカバーされているため、GPS プロバイダーよりもネットワーク ロケーション プロバイダーから適切な位置情報を取得する可能性が高くなります。これは特に、高層ビルと狭い道路のある町に当てはまります (これはニューヨークだけを意味するわけではありません。ここベニスでも GPS に問題があります)。ネットワーク エンジンは、最初の修正の取得も高速で、屋内でも機能します。

ネットワーク ロケーション エンジンが機能しない場合にのみ、GPS にフォールバックします。

于 2012-11-28T10:54:53.990 に答える