ユーザーが GPS を有効にしていない場合でも、携帯電話の設定で Wi-Fi/ネットワークをロケーション ソースとして有効にすることができるため、これらのデータも使用できます。
GPS またはネットワークの最新の既知の位置をいつでも取得できます。
locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
および/または
locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER)
デバイスによって最後に認識された場所が保持されます。これは、アプリまたは以前に GPS を使用した他のアプリから取得できます。
実際には、プロバイダーが異なる 2 つのロケーション マネージャーを使用できます。1 つは GPS_PROVIDER を使用し、もう 1 つは NETWORK_PROVIDER を使用します。Gps はより正確ですが、通常、NETWORK_PROVIDER は屋内で機能しますが、精度が低いため、自由な空の下で屋外でのみ機能します。また、GPS は初期化後、最初の修正を取得するまでに時間がかかる場合があります (場合によっては 1 分以上) が、ネットワークはほぼ即座に位置を取得します。
この投稿を読む必要があります。非常に詳細で、サンプル コード
があります。
2 番目の質問について: サービスを停止する前に、ロケーション リスナーの登録も解除する必要があります。これは、onPause または onDestroy で実行できます。
locationManager.removeUpdates(baseLocationListener)
また
locationManager.removeAllUpdates()
あなたの場合、 getLastKnowLocation() を使用しても問題ないと思います。
それにもかかわらず、GPS ステータスについて明示的に知りたい場合は、GPS ステータス リスナーを実装してから、以下のようなものを使用できます。これにより、GPS に衛星修正があるかどうかがわかりますが、前述のように、これはないと思います本当に必要です。
final class GpsStatusListener implements GpsStatus.Listener {
public void onGpsStatusChanged(int i) {
if (i==GpsStatus.GPS_EVENT_FIRST_FIX) {
Log.d(AskTingTing.APP, "gpsx.fixed.");
for (GpsSatellite sat:locationManager.getGpsStatus(null).getSatellites()) {
Log.d(AskTingTing.APP, "gpsx.GpsStatus.Sat.fixed: " + sat.usedInFix());
}
}
}
}
適切なコード サンプルについては、上記のリンクを参照してください。