緯度経度の取得(一度きりの取得)

SDKの追加ダウンロード

Google Play Servicesが公開しているAPIである「FusedLocationProviderClient」というライブラリを使うと位置情報を取得できます(Androidの公式ドキュメントが推奨)。

しかしAndroidの標準SDKに含まれていないので別途ダウンロードする必要があります。

・ToolsメニューからSDK Managerを選択し、SDK ToolsタブのGooglePlayservicesをチェックしてOKボタンでダウンロードします。

・FileメニューからProject Structrureを選択し、左のDependenciesメニューからModulesセクションでappを選択し、Declared Dependenciesの+ボタンを押してLibraray Dependenciesをクリックし、検索窓で「com.google.android.gms」と入力してEnterすると、Artifact Nameがplay-services-locationとなっている最新Versionsのものを選択してOKボタンを押します。Project Structure画面もOKを押して終了です。

AndroidManifest.xml

位置情報の権限を追加します

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <--追加
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <--追加

    <application

build.gradle.kts(Module:app)

dependencies {
    implementation("com.google.android.gms:play-services-location:21.0.1") <--追加
    implementation(libs.androidx.core.ktx)

MainActivity.kt

package com.example.app8

import android.Manifest
import android.content.pm.PackageManager
import androidx.core.app.ActivityCompat
import com.google.android.gms.location.FusedLocationProviderClient
import com.google.android.gms.location.LocationServices
import android.widget.Toast
import android.os.Bundle
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat

class MainActivity : AppCompatActivity(){
    private lateinit var fusedLocationClient: FusedLocationProviderClient

    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
        }

        // FusedLocationProviderClient の初期化
        fusedLocationClient = LocationServices.getFusedLocationProviderClient(this)

        // 位置情報の取得を開始
        getLastLocation()
    }

    private fun getLastLocation() {
        // 権限が許可されているか確認
        if (ActivityCompat.checkSelfPermission(
                this,
                Manifest.permission.ACCESS_FINE_LOCATION
            ) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(
                this,
                Manifest.permission.ACCESS_COARSE_LOCATION
            ) != PackageManager.PERMISSION_GRANTED
        ) {
            // 権限がない場合、リクエストする
            ActivityCompat.requestPermissions(
                this,
                arrayOf(Manifest.permission.ACCESS_FINE_LOCATION),
                LOCATION_PERMISSION_REQUEST_CODE
            )
            return
        }

        // 最後の既知の位置を取得
        fusedLocationClient.lastLocation.addOnSuccessListener { location ->
            if (location != null) {
                val latitude = location.latitude
                val longitude = location.longitude
                Toast.makeText(this, "緯度: $latitude, 経度: $longitude", Toast.LENGTH_LONG).show()
            } else {
                Toast.makeText(this, "位置情報が取得できませんでした", Toast.LENGTH_LONG).show()
            }
        }.addOnFailureListener {
            Toast.makeText(this, "位置情報の取得に失敗しました: ${it.message}", Toast.LENGTH_LONG).show()
        }
    }

    companion object {
        private const val LOCATION_PERMISSION_REQUEST_CODE = 1
    }

    override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<out String>,
        grantResults: IntArray
    ) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        if (requestCode == LOCATION_PERMISSION_REQUEST_CODE) {
            if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                getLastLocation()
            } else {
                Toast.makeText(this, "位置情報の権限が必要です", Toast.LENGTH_SHORT).show()
            }
        }
    }
}