5

Android(GingerBread)に、GPSが現在何かをしているのかどうかを知る方法があるかどうか知りたいです。もう少し明確にしましょう。基本的に、GPSが何であるかを教えてくれるメソッドまたはAPIを呼び出したいと思います。

1)修正済み(ステータスバーのGPSアイコンがオン)
2)修正の検索(ステータスバーのGPSアイコンが点滅)
3)非アクティブ(現在、位置情報サービスを使用しているアプリはありません。ステータスバーのアイコンはありません)

今:LocationListenerを使用してそのような変更を通知できることはわかっていますが、コードを実行してイベントを待機したくないので、これは私には適していません。コードはスケジュールされた時間に定期的に実行され、何かを実行します。その後終了するので、GPSサービスが変更されたときの通知を待つのではなく、その瞬間にGPSサービスのステータスを確認する方法が必要です。

4

2 に答える 2

12

GPSで多くのテストを行った後、最終的に解決策を見つけました。Androidアプリがロケーションマネージャーを呼び出し、GPSが検索を開始すると、1つのイベントがトリガーされ、gpsがロックされると別のイベントがトリガーされます。次のコードは、これを行う方法を示しています。

locationManager = (LocationManager)mContext.getSystemService(LOCATION_SERVICE);
isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
    if (isGPSEnabled) {                 
        if (locationManager != null) {
            // Register GPSStatus listener for events
            locationManager.addGpsStatusListener(mGPSStatusListener); 
            gpslocationListener = new LocationListener() {
                public void onLocationChanged(Location loc) {}
                public void onStatusChanged(String provider, int status, Bundle extras) {}
                public void onProviderEnabled(String provider) {}
                public void onProviderDisabled(String provider) {}                          
            };  

               locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
                MIN_TIME_BW_UPDATES_GPS, MIN_DISTANCE_CHANGE_FOR_UPDATES_GPS,
                gpslocationListener);           
        }
    }

/ * *これは、GPSの開始、GPSの停止、GPSのロックなどのさまざまなイベントが発生したときに呼び出されるGPSListener関数です* /

public Listener mGPSStatusListener = new GpsStatus.Listener() {  
    public void onGpsStatusChanged(int event) {     
        switch(event) {
            case GpsStatus.GPS_EVENT_STARTED:
                Toast.makeText(mContext, "GPS_SEARCHING", Toast.LENGTH_SHORT).show();
                System.out.println("TAG - GPS searching: ");                        
                break;
            case GpsStatus.GPS_EVENT_STOPPED:    
                System.out.println("TAG - GPS Stopped");
                break;
            case GpsStatus.GPS_EVENT_FIRST_FIX:

                /*
                 * GPS_EVENT_FIRST_FIX Event is called when GPS is locked            
                 */
                    Toast.makeText(mContext, "GPS_LOCKED", Toast.LENGTH_SHORT).show();
                    Location gpslocation = locationManager
                            .getLastKnownLocation(LocationManager.GPS_PROVIDER);

                    if(gpslocation != null) {       
                    System.out.println("GPS Info:"+gpslocation.getLatitude()+":"+gpslocation.getLongitude());

                    /*
                     * Removing the GPS status listener once GPS is locked  
                     */
                        locationManager.removeGpsStatusListener(mGPSStatusListener);                
                    }               

                break;
            case GpsStatus.GPS_EVENT_SATELLITE_STATUS:
 //                 System.out.println("TAG - GPS_EVENT_SATELLITE_STATUS");
                break;                  
       }
   }
};  

GPSコードを入れて、GPS位置情報を取得するサービスとして使用することをお勧めします。

GPS関数を呼び出すたびに、GPSStatusリスナーが登録されます。GPS_SEARCHINGトーストはGPSの検索が開始されたときに一度だけ発生し、GPS_LOCKEDトーストはGPSがロックされたときに表示されます。GPS関数を再度呼び出すと、ロックされている場合(GPS_LOCKEDトーストを表示)にGPS_EVENT_FIRST_FIXイベントがトリガーされ、GPSがすでに検索を開始している場合は、GPS_SEARCHINGトーストは表示されません(つまり、GPS_STARTEDイベントはトリガーされません)。GPS_EVENT_FIRST_FIXイベントがトリガーされた後、GPSstatusリスナーの更新を削除します。

GPS_EVENT_FIRST_FIXイベントがトリガーされたら、gpslastknownlocation()関数を呼び出して、最新のGPS修正を取得することをお勧めします(詳細については、Android開発者サイトを参照することをお勧めします)。

これが他の人の役に立つことを願っています。

于 2013-12-28T07:52:27.090 に答える
1

残念ながら、AndroidでGPSの「現在の状態」を取得する簡単な方法はありません。他の人が指摘しているように、あなたの最善の策は、onGpsStatusChanged()イベントに登録して状態を追跡することです。

冒険心がある場合は$ dumpsys location、adbシェルからcallを呼び出して、gpsプロバイダーの状態を取得できます。通常は$ adb shellデスクトップから呼び出しますが、ネイティブのAndroidシェルアプリをコンパイルし、シェル内からを呼び出して、電話で直接出力exec()を取得することもできます。dumpsys

于 2013-04-23T09:56:20.747 に答える