緯度経度の取得(連続的な取得)

Kotlin

AndroidManifest.xml

<manifest>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> ※1
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> ※2

    <application ...>
</manifest>

※1 … 高精度のGPS位置情報

※2 … Wifiやモバイルネットワークを使う位置情報

build.gradle (Module: app)

dependencies {
    implementation("com.google.android.gms:play-services-location:21.0.1")
}

MainActivity.kt

package com.example.application0210

import android.os.Bundle
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat

import android.Manifest
import android.annotation.SuppressLint
import android.content.pm.PackageManager
import android.location.Location
import android.util.Log
import android.widget.TextView
import androidx.activity.result.contract.ActivityResultContracts
import androidx.core.app.ActivityCompat
import com.google.android.gms.location.*
import com.google.android.gms.location.FusedLocationProviderClient


class MainActivity : AppCompatActivity() {

    private lateinit var fusedLocationClient: FusedLocationProviderClient
    private lateinit var locationCallback: LocationCallback
    private lateinit var locationRequest: LocationRequest
    private lateinit var textLocation: TextView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        setContentView(R.layout.activity_main)
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
            val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
            insets
        }

        //
        textLocation = findViewById(R.id.textLocation)

        // 位置情報のクライアントを取得
        fusedLocationClient = LocationServices.getFusedLocationProviderClient(this)

        // 位置情報を5秒に1回リクエストする
        locationRequest = LocationRequest.Builder(Priority.PRIORITY_HIGH_ACCURACY, 5000).build()

        // 位置情報の更新を受け取るコールバック
        locationCallback = object : LocationCallback() {
            override fun onLocationResult(locationResult: LocationResult) {
                for (location in locationResult.locations) {
                    logLocation(location)
                }
            }
        }

        // 権限をリクエスト
        requestLocationPermissions()
    }

    private fun requestLocationPermissions() {
        val requestPermissionLauncher = registerForActivityResult(
            ActivityResultContracts.RequestMultiplePermissions()
        ) { permissions ->
            if (permissions[Manifest.permission.ACCESS_FINE_LOCATION] == true ||
                permissions[Manifest.permission.ACCESS_COARSE_LOCATION] == true) {
                startLocationUpdates()
            } else {
                Log.e("Location", "位置情報の権限が拒否されました")
                textLocation.text = "権限がありません"
            }
        }

        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &&
            ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            requestPermissionLauncher.launch(
                arrayOf(Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION)
            )
        } else {
            startLocationUpdates()
        }
    }

    @SuppressLint("MissingPermission")
    private fun startLocationUpdates() {
        fusedLocationClient.requestLocationUpdates(locationRequest, locationCallback, null)
    }

    private fun stopLocationUpdates() {
        fusedLocationClient.removeLocationUpdates(locationCallback)
    }

    private fun logLocation(location: Location) {
        Log.d("Location", "緯度: ${location.latitude}, 経度: ${location.longitude}")
        val locationText = "緯度: ${location.latitude}, 経度: ${location.longitude}"
        textLocation.text = locationText
    }

    override fun onDestroy() {
        super.onDestroy()
        stopLocationUpdates()
    }
}
BACK