3

GPS_PROVIDER のステータスが変化した場合に通知を取得しようとしています。ここ (http://hejp.co.uk/android/android-gps-example/) で次のコードを見つけましたが、通知が届きません。

  1. 現在、建物の中にいて GPS 信号を受信できないため、「ステータスが変更されました: サービスが停止しています」という通知が表示されませんか?
  2. onStatusChanged はいつ呼び出されますか?
  3. 私は何を間違っていますか?

ありがとう、

@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
    /* This is called when the GPS status alters */
    switch (status) {
    case LocationProvider.OUT_OF_SERVICE:
        Log.v(tag, "Status Changed: Out of Service");
        Toast.makeText(this, "Status Changed: Out of Service",
                Toast.LENGTH_SHORT).show();
        break;
    case LocationProvider.TEMPORARILY_UNAVAILABLE:
        Log.v(tag, "Status Changed: Temporarily Unavailable");
        Toast.makeText(this, "Status Changed: Temporarily Unavailable",
                Toast.LENGTH_SHORT).show();
        break;
    case LocationProvider.AVAILABLE:
        Log.v(tag, "Status Changed: Available");
        Toast.makeText(this, "Status Changed: Available",
                Toast.LENGTH_SHORT).show();
        break;
    }
4

4 に答える 4

22

アプリの実行中に GPS ステータスが変化しない場合 (たとえば、GPS 修正なしで常に屋内にいる場合)、一部のデバイスはOnStatusChanged()メソッドをトリガーしません。

アプリの実行中に GPS ステータスを変更した場合 (たとえば、屋内にいて修正を取得できず、外に出て修正を取得できる、またはその逆)、OnStatusChanged()すべてのデバイスでメソッドが起動する必要があります。

例として使用する完全に機能するオープンソース アプリが必要な場合は、GPSTest を試してください (完全な開示、私のアプリ)。

Google Play の GPSTest - https://play.google.com/store/apps/details?id=com.android.gpstest

GPSTest のソース コード - https://github.com/barbeau/gpstest

デバイスが修正できない場合でも常に更新される GPS に関する詳細情報については、GPSStatus.Listener.

アクティビティで、実装GpsStatus.Listenerします。たとえば、次のようになります。

public class GpsTestActivity extends TabActivity
    implements LocationListener, GpsStatus.Listener{

次に、アクティビティでクラス変数を宣言します。

private LocationManager mService;
private GpsStatus mStatus;

...そして、GPSStatus の変更を処理するメソッドを追加します。

public void onGpsStatusChanged(int event) {
    mStatus = mService.getGpsStatus(mStatus);
    switch (event) {
        case GpsStatus.GPS_EVENT_STARTED:
            // Do Something with mStatus info
            break;

        case GpsStatus.GPS_EVENT_STOPPED:
            // Do Something with mStatus info
            break;

        case GpsStatus.GPS_EVENT_FIRST_FIX:
            // Do Something with mStatus info
            break;

        case GpsStatus.GPS_EVENT_SATELLITE_STATUS:
            // Do Something with mStatus info
            break;
    }

}

次に、OnCreate()Activity で GPSStatus.Listener を登録します。

 mService = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
 mService.addGpsStatusListener(this);

GPSTest アプリでは、現在利用可能な衛星のリストが、次のコードに基づいて GPSStatus.Listener の更新ごとに画面に表示されます。

https://github.com/barbeau/gpstest/blob/master/GPSTest/src/main/java/com/android/gpstest/GpsStatusFragment.java

これにより、携帯電話が GPS 修正を取得できない場合でも、システムの GPS ステータスに関するアクティブな更新を受け取ることができます (そのためOnStatusChanged、LocationListener がトリガーされない場合があります)。

于 2013-01-10T15:42:18.613 に答える
1

このリンクを確認する必要があるかもしれませんGpsStatus.Listener このリスナーは、GPS ステータスがいつ変更されたかを知るために使用されます。

あなたが指摘した方法に関しては、ドキュメントLocationListenerに記載されているように、プロバイダーのステータスがいつ変更されたかを知るために使用されます

于 2013-01-08T19:15:14.197 に答える
0

私は過去数週間 GPS に取り組みましたが、テストの結果、GPS 信号が建物の内部にある可能性があることに気づきました。地下エリアにいる場合は、決して取得できません。自宅から試してみたところ、95% の確率で常に緯度と経度が取得されました。

これを制御することはできません。GpsLocationProvider は、インターネットまたは WiFi 接続が利用可能な場合、アシスト SUPL を自動的に使用します。スタンドアロン ケースは、インターネットにアクセスできない場合にのみ使用されます。アシスト データは、GPS 衛星信号にロックオンするのに役立ちます。屋内の場合、2 ~ 3 個のサテライトが表示されます (チップセットの品質によって異なります)。衛星信号をスキャンできない場合は、修正できません。

ありがとう、ラメシュ S

于 2013-01-08T19:54:06.417 に答える