まあいろいろありますが。GPS は、「コールド スタート」として知られている場所から発信されている可能性があります。これらの場合、最後の既知の場所は null です。また、位置情報を取得するための信号がない場所にいる可能性もあります。また、お粗末な GPS またはお粗末な GPS ドライバー (咳samsung咳) である可能性もあります。これらは正確ではありません。
まず、このドキュメントから始めます。ロケーション取得戦略
次に、ここでロジックを評価してみましょう。はい、GPS が有効になっています。ただし、このコンテキストでは、有効とは、細かい場所のアクセス許可を持つアプリケーションで使用できるようになっていることを意味します。有効になっていても、現在アクティブで場所を取得していることを意味するわけではありません。しかし、良いニュースがあります!リスナーを作成したり、場所の更新を購読したりできます。
他の人が述べたように、マニフェストに権限が設定されていることを確認してください。私はあなたがそうしていると思います。そうでなければ、あなたのアプリはおそらくクラッシュし、getLastKnownLocation()
呼び出しの許可の問題で燃えました.
次に、位置情報の更新を受け取るには、LocationListenerクラスを見てください。このインターフェイスを実装することlocationManager.requestLocationUpdates()
で、GPS からの位置更新の登録に使用できます。
コードを使用する (アクティビティ内にあり、記述されているメソッドが UI スレッドで呼び出されるなど、いくつかのことを想定しています):
public class MyActivity extends Activity implements LocationListener {
// The rest of the interface is not really relevant for the example
public void onProviderDisabled(String provider) { }
public void onProviderEnabled(String provider) { }
public void onStatusChanged(String provider, int status, Bundle extras) { }
// When a new location is available from the Location Provider,
// this method will be called.
public void onLocationChanged(Location location) {
// You should do whatever it was that required the location
doStuffWithLocation(location);
// AND for the sake of your users' battery stop listening for updates
(LocationManager) getSystemService(LOCATION_SERVICE).removeUpdates(this);
// and cleanup any UI views that were informing of the delay
dismissLoadingSpinner();
}
// Then in whatever code you have
public void methodA() {
LocationManager locationManager;
GeoPoint p;
locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
boolean gps_enabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
if (gps_enabled) {
Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (location == null) {
// When it is null, register for update notifications.
// run this on the UI Thread if need be
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
// Since this might take some time you should give the user a sense
// that progress is being made, i.e. an indeterminate ProgressBar
showLoadingSpinner();
} else {
// Otherwise just use the location as you were about to
doStuffWithLocation(location);
}
}
...
これにより、期待どおりにコードが実行され、GPS に位置情報がない場合は、GPS をスピンアップして位置情報を取得するまで待ちます。それが発生したら、それを止めて、計画どおりに使用します。これは一種の単純なアプローチですが、単純な基礎として使用できるはずです。実際のソリューションでは、場所を取得する機会がない場合を考慮に入れ、場所を待っている間に場所プロバイダーが利用できない場合や利用できなくなった場合を処理し、場所の健全性を検証する必要があります。