LocationManagerを介してGPS、Networkの位置情報を得ることができます。
位置情報を取得する方法は、 LocationManager.getLastKnownLocation()
で、最後に記録された位置情報を取得または
LocationManager.requestLocationUpdates()
でListenerを登録して、位置が変更されるたびにイベントを受け取ることができます。
Locationパーミッション
位置情報を取得するには、次のパーミッションのいずれかは、AndroidManifestに定義する必要があります。
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
ACCESS_COARSE_LOCATION
:都市Block単位の精度の位置情報を取得することができますACCESS_FINE_LOCATION
:ACCESS_COARSE_LOCATION
より精密な位置情報を得ることができます
Runtime Permission要求の詳細実装は、Android - Runtime permissionリクエスト方法を参照してください。
最後に確認された位置情報を取得する
LocationManager.getLastKnownLocation(provider)
APIで最後に確認された位置情報を得ることができます。
長い間、Location更新がないなどの理由で、非常に長い時間前に保存された位置情報が戻されることがあります。
または、当該Providerの格納された位置情報がないときは、nullが返されることがあります。
引数として渡されたProviderの種類には、一般的にGPSの位置を提供してくれる GPS_PROVIDER
とネットワークの位置を提供してくれるNETWORK_PROVIDER
があります。
次のように位置情報の緯度(latitude)と経度(longitude)を得ることができます。
val location : Location? = locationManager
.getLastKnownLocation(LocationManager.GPS_PROVIDER)
if (location != null) {
val latitude = location.latitude
val longitude = location.longitude
Log.d("Test", "GPS Location changed, Latitude: $latitude" +
", Longitude: $longitude")
}
Location
は、次のような情報を提供しています。
getAccuracy()
:正確getLatitude()
:上記getLongitude()
:軽getTime()
:生成された時刻(UTCgetElapsedRealtimeNanos()
:生成された時間(Elapsed time
次のように Location.getElapsedRealtimeNanos()
でいつ生成されたLocationオブジェクトであるか知ることができ、現在ので数秒前に生成されたかどうかを計算することができます。
これで古いデータはフィルタすることができます。
val location : Location? = locationManager
.getLastKnownLocation(LocationManager.GPS_PROVIDER)
val ageMs = TimeUnit.NANOSECONDS.toMillis(SystemClock.elapsedRealtimeNanos()
- location.getElapsedRealtimeNanos())
位置情報の変更のListener
次のように位置情報のリスナーを登録することができ、リスナーを登録すると、Callbackが渡されます。
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
10000, // 10-second interval.
10.0f, // 10 meters
gpsListener)
var gpsListener: LocationListener = object : LocationListener {
override fun onLocationChanged(location: Location) {
val latitude = location.latitude
val longitude = location.longitude
Log.d("Test", "GPS Location changed, Latitude: $latitude" +
", Longitude: $longitude")
}
override fun onStatusChanged(provider: String, status: Int, extras: Bundle) {
}
override fun onProviderEnabled(provider: String) {
}
override fun onProviderDisabled(provider: String) {
}
}
requestLocationUpdates()
の引数には、次のような内容が渡されます。
- Provider:
GPS_PROVIDER
またはNETWORK_PROVIDER
することができます - minInterval(ms):10秒に設定すると、更新があったとき、少なくとも10秒間隔でイベントを送出します
- minDistance(meters):設定された距離だけの変化があったときのイベントを転送します
- Listener:Listenerオブジェクトを渡します
Listenerの登録解除
Listenerを使用していないときは、次のように終了することができます。
locationManager.removeUpdates(listener);
使用可能なProviderあることを確認
次のようにデバイスのGPSまたはNetworkプロバイダが使用可能かどうかを確認することができます。
val isGPSEnabled =
locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)
val isNetworkEnabled =
locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)
もしGPSの設定がオフになっている場合は GPS_PROVIDER
が無効にされたと返されます。
このような場合には、次のようにSettings画面を実行して、ユーザーにGSPを有効にするようにガイドすることができます。
private fun enableLocationSettings() {
val settingsIntent = Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS)
startActivity(settingsIntent)
}
参考
Related Posts
- Android - 振動、Vibrator、VibrationEffectの例
- Android - TabLayoutの実装方法(+ ViewPager2)
- Android - PackageManagerにPackage情報を取得する
- Android - ACTION_BOOT_COMPLETEDイベント受信
- Android - FusedLocationProviderClientに位置情報を取得する
- Android - GPS、Network位置情報を取得する(LocationManager)
- Android - Foreground Service実行
- Android - 時間、日付、変更イベント受信
- Android - currentTimeMillis()、elapsedRealtime()、uptimeMillis()
- Android-PowerManager WakeLock
- Android - ファイル入出力の例(Read、Write、内部、外部ストレージ)
- Android - Screen On / Offイベントの受信、状態確認
- Android - 他のアプリのServiceにバインド
- Android - Handler vs Executor
- Android - Darkmode有効にする方法
- Android - hasSystemFeature()、サポートされているFeature確認
- Android - アプリの権限を確認(Permission check)
- Android - インストールされてアプリリストをインポートする
- Android App Shortcuts実装
- Android - ContentProviderを実装、および例
- Android - AIDLを利用して、Remote Serviceの実装
- Android - Uri、Scheme、SSP(Scheme Specific Part)説明
- Android - アプリのインストール、削除、イベントダウンロード(BroadcastReceiverインテントを受け取る)
- Android - SharedPreferencesに簡単なデータを保存する方法
- Android - AlarmManagerにアラームを登録する方法、および例
- Android - Quick SettingsにCustom Tile追加する方法(kotlin)
- Android - Broadcast Receiver登録およびイベントの受信方法
- Android - Runtime permissionリクエスト方法と例(kotlin)
- Android - ネットワーク(WIFI)の接続状態を確認し、変更の検出
- Mockito - static、final methodをmockingする方法
- Andriod - カスタムパーミッションを定義する方法
- RobolectricにUnit Testを作成する(kotlin)
- Android Mockitoのテストコードを作成する(kotlin)
- Android - Handlerの使用方法、および例
- Android - IntentService使用方法
- Android - JobIntentService使用方法