以下の内容はhttps://android-java.hatenablog.jp/entry/location-permission-sampleより取得しました。


位置情報の権限(パーミッション)を取得する方法 - Kotlin

今回は、位置情報を取得するために必要な権限(パーミッション)を取得する方法をご紹介します。

ここでご紹介する方法は、公式サイト(Android Developer)の方法とほぼ同じですが、重要なポイントをわかりやすくまとめてありますので、公式サイトの説明では難しくてわからない・・・基礎を習得したい・・・とお考えの方にとくにおすすめです。

※使用言語は「Kotlin」、記事内のコードはエミュレーターだけでなく、Andoroid 端末の実機(2機種)での確認も済ませてあります。

<取得する権限>

位置情報を取得するには「おおよその位置情報(ACCESS_COARSE_LOCATION)」または「正確な位置情報(ACCESS_FINE_LOCATION)」の権限が必要です。

  • ① ACCESS_FINE_LOCATION(正確な位置情報)
  • ② ACCESS_COARSE_LOCATION(おおよその位置情報)

作成するアプリが「正確な位置情報」を必要とする場合は①と②の両方の権限をマニフェストで宣言しなければなりませんが、「おおよその位置情報」のみを必要とする場合は②だけをマニフェストで宣言します。

なお、「正確な位置情報」と「おおよその位置情報」どちらの場合も、アプリの実行時に確認ダイアログを表示してユーザーに「位置情報の使用許可」をもらう必要があります。

~ マニフェストでの宣言方法 ~

マニフェストファイルの <manifest></manifest> タグと同じレベルに以下の2行を追加します。間違えて <application></application> 内に記述しないよう注意してください。

(例)

<?xml version="1.0" encoding="utf-8"?>
<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
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.Kengen"
tools:targetApi="31">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

</manifest>
~ 配列に権限を格納 ~

配列変数(今回は REQUIRED_PERMISSIONS という配列名)に、アプリ実行時にユーザーから取得する2つの権限を格納します。その他に取得したい権限があればカンマ(,)で区切って追加します。※記述場所は後ほどの例でご紹介します。

private val REQUIRED_PERMISSIONS =
mutableListOf(
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION
).toTypedArray()

<取得手順>

ステップ①

まず、アプリが起動した直後に「allPermissionGranted」で位置情報へのアクセス権限の有無を確認します。位置情報のアクセス権限がない場合は requestPermissions( ) で確認ダイアログを表示し、ユーザーに権限を要求します。この確認は onCreate() { } 内のなるべく早い段階で行った方が良いでしょう。

//権限チェック開始
if (allPermissionsGranted()) {
//すでに権限がある場合の処理
} else {
//権限がない場合の処理(ユーザーに権限を要求)
ActivityCompat.requestPermissions(
this, REQUIRED_PERMISSIONS, REQUEST_CODE_PERMISSIONS
)
}

ステップ②

こちらが、ステップ①で呼び出されて位置情報のアクセス権限を確認しているコードです。この方法は複数の権限を一度に確認できるので覚えておくと便利です。

private fun allPermissionsGranted() = REQUIRED_PERMISSIONS.all {
ContextCompat.checkSelfPermission(
baseContext, it) == PackageManager.PERMISSION_GRANTED
}

ステップ③

手動でコードに「override fun onRequestPermissionsResult ( )」を追加します。この関数は位置情報のアクセス権限を要求するために表示したダイアログの結果を受け取る関数で、この中でもう一度権限の有無をチェックします。そして、権限が取得できた場合はアプリを起動して、権限が拒否された場合はアプリを終了するなどして対応します。

override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)

if (allPermissionsGranted()) {
//確認ダイアログで権限を取得した場合の処理
} else {
       //権限を取得できなかった場合の処理
       finish()
}
}

<ポイント>

1.マニフェストファイル(AndroidManifest.xml)に以下の2行を追加する。

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

2.MainActivity.kt などの中に、取得する権限の配列とリクエストコード、前に説明したステップ①~③のコードを記述します。

(例)

import android.Manifest
import android.content.pm.PackageManager
import android.os.Bundle
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat

class MainActivity : AppCompatActivity() {

//取得する権限の配列を準備する
private val REQUIRED_PERMISSIONS =
mutableListOf(
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION
).toTypedArray()
//リクエストコード
private val REQUEST_CODE_PERMISSIONS = 10

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

enableEdgeToEdge()
setContentView(R.layout.activity_main)

//権限チェック開始(ステップ①)
if (allPermissionsGranted()) {
//すでに権限がある場合の処理
} else {
//権限がない場合の処理(ユーザーに権限を要求)
ActivityCompat.requestPermissions(
this, REQUIRED_PERMISSIONS, REQUEST_CODE_PERMISSIONS
)
}
}

//権限チェックする関数(ステップ②)
private fun allPermissionsGranted() = REQUIRED_PERMISSIONS.all {
ContextCompat.checkSelfPermission(
baseContext, it) == PackageManager.PERMISSION_GRANTED
}

   //確認ダイアログの結果を受け取る(ステップ③)
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)

//再度権限をチェックする
if (allPermissionsGranted()) {
//確認ダイアログで権限を取得した場合の処理
} else {
//権限を取得できなかった場合の処理
finish()
}
}
}

<実行結果>

起動するとすぐに位置情報のアクセス権限チェックが実行され、必要な権限がない場合は権限を要求するダイアログが表示されます。

このダイアログで位置情報へのアクセスが許可されるとアプリが使用できるようになり、拒否された場合はアプリを強制的に終了します。

※なお、権限要求時に表示されるダイアログは、端末の Android バージョンによって異なります。

<まとめ>

以上で今回の記事「GPS位置情報の権限(パーミッション)を取得する方法 - Kotlin」の解説は終了となります。

初心者の方にはやや難しく感じたかもしれませんが、権限の取得はアプリ作りに欠かせない基本となりますので、サンプルコードを繰り返し解読してぜひ習得してください。

Android アプリ開発「MATRIX」管理人

END




以上の内容はhttps://android-java.hatenablog.jp/entry/location-permission-sampleより取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14