AndroidでのGPSの可用性の決定

あいさつ、habrasociety!



この記事が、Androidのプログラミングの分野の初心者に役立つことを願っています。 あるいは、ベテランのプロでも何かを収集します。



そのため、GPS修正プログラムが現在利用可能かどうかを何らかの方法で判断する必要がありました。 LBS(ロケーションベースのサービス)は有望で人気のあるものであり、Googleはこれを完全に理解しており、開発のための使いやすいツールを提供します。 ええ、私は逃げました...それはそれほど簡単ではないので、私たちはある程度自分自身を洗練しなければなりません。



さて、ここでの問題は何ですか? 問題は、ユーザーの現在の場所を特定することです。 いくつかのタイプがありますが、TKはGPSを使用してセルタワーに配置するように指示します。 タスクは、現在の座標を最大限の精度で決定することです。 理想的にはGPSによる。 利用できない場合は、タワーで。 GPS信号があれば、すべてが簡単でシンプルです。衛星から座標を取得し、それらを使って何でもします。 信号がない場合は、座標を処理するときにnullに陥るリスクがありますが、これはほとんど役に立ちません。また、例外の処理が不完全な場合、悲しい結果を招く可能性があります。 それで、どうにか決定する必要がありますが、修正はありますか?



さて、問題は目に見える-私たちはそれを解決します!



LocationManagerをタップすることから始めましょう。 ブール値を返す興味深いプロパティisProviderEnabled()があります。 やった? Sooner ...この値は、お使いの携帯電話のGPS受信機がオンかどうかのみを特徴付けます(実際、名前から推測できます)。 最初のパンケーキはいつものように判明しました。



LocationListenerの内部に登ります。 何が見えますか? ああ、これはonStatusChanged()ハンドラです! 理想的には、適切な値を設定することにより、プロバイダーステータスの変化に対応します。 理想的には... Androidバージョン2.1以降、彼は何にも反応しません! 悲しみで通り過ぎる。



続行しますか? もちろん続けます! 次の耳のフェイントは明らかです-最後に修正された修正の時刻を現在のシステムの時刻と比較します。 修正は古いため、GPSは使用できません。 そうではありません:修正は運転中にのみ行われるため、衛星にアクセスできないことと単純な座り込みを混同する可能性があります。 同意して、座って座って、それから突然-oppa! -そして、お使いの携帯電話は400〜500メートルでテレポートしたと判断しました。 繰り返しますが、それではありませんが、受信機を覚えています-それは便利になります。



次に、onGpsStatusChanged(int event)メソッドを実装するGpsStatus.Listenerを見てみましょう。 イベント変数はいくつかの値を取ることができますが、GPS_EVENT_SATELLITE_STATUSに興味があります。 このようなイベントの発生は、受信機がGPS衛星を分析していることを示しています。 これが必要です! その後、すべてがシンプルで明確になりました-現在のGPSステータスを取得し、そこから利用可能な衛星を引き出します。 最も単純なケースでは、単にその数に興味があります。



ナビゲーション分野の初心者向けの小さな余談。 現在の座標を決定するには、通常、3つの衛星が必要です(3次元座標用)。 しかし、これは原子時計を持っている場合です。これは、モバイルデバイスの場合には非常にまれです。 したがって、時刻を同期するには、別の衛星が必要です。



ステータスハンドラは次のようになります。

LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE); GpsStatus.Listener lGPS = new GpsStatus.Listener() { public void onGpsStatusChanged(int event) { if( event == GpsStatus.GPS_EVENT_SATELLITE_STATUS){ GpsStatus status = lm.getGpsStatus(null); Iterable<GpsSatellite> sats = status.getSatellites(); doSomething(); } } }; lm.addGpsStatusListener(lGPS);
      
      





ステータス変数には、利用可能なすべてのサテライトに関する情報が含まれています



したがって、すべてが非常に素晴らしいです-衛星の数を見て、4つ未満の場合は修正がなく、不可能ですので、他の測位方法を使用します(失礼しますが、特定の実装については説明しません)。 この方法は、上記のいくつかの段落で説明した時間比較と交差させることができます。 そのため、一定の「信頼」修正期間を設定できます



バランスのように。 上記のすべてが、修正プログラムの可用性を決定するための正確な保証を与えるものではありません。 実際、修正が確実に行われない状況は単純に中断されます。 もちろん、これは私が望んでいたものではありませんが、すでに何かがあります!



UPD :解決策が見つかったようです! これはr_iiのおかげで起こりました。

そのため、GPS受信機は、電源を入れたときに、 NMEAプロトコルに従って常に信号を受信します。 これが必要なものです!

これらの信号を表示するには、コードに次を追加します。



 lm.addNmeaListener(new GpsStatus.NmeaListener() { public void onNmeaReceived(long timestamp, String nmea) { parseNMEA(nmea); }});
      
      







このコード、 この 2m0ndスレッドをありがとう。 プロトコルの詳細な説明はこちら (pdf)にあります。



実際には、小さなことは受信した文字列を解析することです。 この場合、キー(最初の)フィールドが$ GPGGAの行と、GPS品質インジケーターと呼ばれるパラメーター番号6に関心があります。 以下の値を取ります。

ビンゴ!



PSどのような場合でも、これらのメソッドの作成者を主張しないでください。 すべてがGoogleのみを使用して検出されました。 この記事の目的は、すべての情報を1つのヒープに収集し、それを構造化して、小さな緑色の生物を使ったモバイルデバイスのナビゲーションとプログラミングの素晴らしい世界への次の旅行が時間と神経を浪費しないようにすることです。

PPS明らかに、この方法は理想とはほど遠いため、改善が続けられています。 任意の助けと批判(客観的)は大歓迎です!



All Articles