FusedLocationProviderClientで位置情報の取得し、それをGoogle Mapで地図表示をすることがと可能です。
Android Studio
2021.2.1
2021.2.1
FusedLocationProviderClient
GPSだけでなく、WiFiや電話網を使った位置情報はFusedLocationProviderClientで取得できます
位置情報といえばGPSと思う人が多いとは思いますが、スマホでの位置情報はGPS以外にWiFiや電話網を駆使して短時間で効率の良い情報を取得で...
また、Google MapはAPI キーを取得して地図表示することは自由度はありますが、使用量による費用が発生することもあります。Intentを使ってGoogle Mapアプリを起動させてしまうのが簡単です
API key 無しでIntentを使って簡単に Google Map を呼び出して地図を表示させる方法です。
GoogleMapを...
作成手順としては以下を合体させます
- FusedLocationProviderClientの更新リエストを作成
- IntentでGoogle Mapに飛ばして地図表示
MapsActivity.kt
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 |
//package your.package.name import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AppCompatActivity import androidx.core.app.ActivityCompat import android.Manifest import android.annotation.SuppressLint import android.content.Intent import android.content.pm.PackageManager import android.location.Location import android.net.Uri import android.os.Bundle import android.os.Looper import android.widget.TextView import android.widget.Toast import com.google.android.gms.location.* class MainActivity : AppCompatActivity() { private lateinit var locationCallback: LocationCallback private lateinit var locationRequest: LocationRequest private lateinit var fusedLocationClient: FusedLocationProviderClient private var requestingLocationUpdates = false private val requestPermissionLauncher = registerForActivityResult( ActivityResultContracts.RequestPermission()) { isGranted: Boolean -> if (isGranted) { requestingLocationUpdates = true } else { val toast = Toast.makeText( this, "これ以上なにもできません", Toast.LENGTH_SHORT ) toast.show() } } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) if (ActivityCompat.checkSelfPermission( this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { requestPermissionLauncher.launch(Manifest.permission.ACCESS_FINE_LOCATION) } else { requestingLocationUpdates = true } locationRequest = LocationRequest.create().apply{ interval = 10000 fastestInterval = 5000 priority = Priority.PRIORITY_HIGH_ACCURACY } locationCallback = object : LocationCallback() { override fun onLocationResult(locationResult: LocationResult) { for (location in locationResult.locations) { val textView1 = findViewById<TextView>(R.id.text_view1) val textView2 = findViewById<TextView>(R.id.text_view2) // 緯度の表示 val str1 = " Latitude:" + location.latitude textView1.text = str1 // 経度の表示 val str2 = " Longitude:" + location.longitude textView2.text = str2 // Google Map moveToGMap(location) } } } fusedLocationClient = LocationServices.getFusedLocationProviderClient(this) } private fun startLocationUpdates() { if (ActivityCompat.checkSelfPermission( this, Manifest.permission.ACCESS_FINE_LOCATION ) != PackageManager.PERMISSION_GRANTED ) { return } fusedLocationClient.requestLocationUpdates( locationRequest, locationCallback, Looper.getMainLooper() ) } @SuppressLint("QueryPermissionsNeeded") private fun moveToGMap(location: Location) { val str1: String = java.lang.String.valueOf(location.latitude) val str2: String = java.lang.String.valueOf(location.longitude) // geo:[lat,lng][?param[¶m]...], param:z=zoom val uri: Uri = Uri.parse("geo:$str1,$str2?z=16") val intent = Intent(Intent.ACTION_VIEW, uri) startActivity(intent) if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } } private fun stopLocationUpdates() { fusedLocationClient.removeLocationUpdates(locationCallback) } override fun onResume() { super.onResume() if (requestingLocationUpdates) { startLocationUpdates() } } override fun onPause() { super.onPause() stopLocationUpdates() } } |
activity_main.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <TextView android:id="@+id/text_view1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="20dp" android:textColor="#44f" android:textSize="20sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintHorizontal_bias="0.501" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.2" /> <TextView android:id="@+id/text_view2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20sp" android:textColor="#f44" android:layout_margin="20dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.3" /> </androidx.constraintlayout.widget.ConstraintLayout> |
play-services-locationのライブラリ追加
build.gradle(Module…)
19.0.1 と20.0.0では、PRIORITY_HIGH_ACCURACYの差分があります
1 2 3 4 5 6 7 8 9 10 11 12 |
plugins { ... } android { ... } dependencies { implementation 'com.google.android.gms:play-services-location:20.0.0' ... } |
位置情報のパーミッション
AndroidManifest.xml
1 2 3 4 5 6 7 8 9 10 11 |
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" ... > <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <application ... </application> </manifest> |
emulatorのLocationをハワイにセットして実行してみました
関連記事:
- FusedLocationProviderClient による位置情報の取得
- 複数の権限、LOCATIONとCAMERAをリクエスト
- FusedLocationProvider からGoogle Map地図の表示
- Kotlin でGPS位置情報を取得するアプリを作る
- アプリの権限リクエスト
References:
直近の位置情報を取得する – Android Developers
現在地の更新情報をリクエストする – Android デベロッパー
位置情報の設定を変更する – Android デベロッパー
FusedLocationProviderClient
アプリの権限をリクエストする
一般的なインテント
インテントとインテント フィルタ