Skip to content

Instantly share code, notes, and snippets.

@TatsukiIshijima
Created July 12, 2021 09:26
Show Gist options
  • Save TatsukiIshijima/7a265ace04c93d46886a6342382b27d5 to your computer and use it in GitHub Desktop.
Save TatsukiIshijima/7a265ace04c93d46886a6342382b27d5 to your computer and use it in GitHub Desktop.
Androidの位置情報権限取得サンプルコード
package com.sample.locationsample
import android.Manifest
import android.annotation.SuppressLint
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
import android.net.Uri
import android.os.Bundle
import android.provider.Settings
import android.view.View
import android.widget.Button
import android.widget.TextView
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat
import com.google.android.gms.location.FusedLocationProviderClient
import com.google.android.gms.location.LocationServices
import com.google.android.material.snackbar.Snackbar
class MainActivity : AppCompatActivity() {
private lateinit var mainLayout: View
private lateinit var requestCurrentLocationButton: Button
private lateinit var currentLocationText: TextView
private lateinit var fusedLocationClient: FusedLocationProviderClient
@SuppressLint("MissingPermission")
private var requestPermissionLauncher =
registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { grantedState ->
// 7. ユーザーが権限を許可するか確認
val grantedPermissions = grantedState.keys.filter { key ->
key == Manifest.permission.ACCESS_COARSE_LOCATION ||
key == Manifest.permission.ACCESS_FINE_LOCATION }
.filter { key -> grantedState[key] == true }
if (grantedPermissions.count() == grantedState.count()) {
// 8a. 位置情報を利用する
fusedLocationClient.lastLocation.addOnSuccessListener { location ->
// lastLocation は最後に取得した位置情報を使用するため、一度も取得していない場合は null を返す
location?.let {
currentLocationText.text = "緯度=${it.latitude}, 経度=${it.longitude}"
}
}
} else {
// 8b. UX を下げる
val snackBar = Snackbar.make(
mainLayout,
"位置情報の権限が拒否されました。設定から位置情報の権限を許可してください。",
Snackbar.LENGTH_LONG)
snackBar.setAction("設定") {
val intent = Intent(
Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
Uri.parse("package:${packageName}")
)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
startActivity(intent)
}
snackBar.show()
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
mainLayout = findViewById(R.id.main_layout)
requestCurrentLocationButton = findViewById(R.id.request_current_location_button)
currentLocationText = findViewById(R.id.current_location_text)
fusedLocationClient = LocationServices.getFusedLocationProviderClient(this)
requestCurrentLocationButton.setOnClickListener {
// 4. 既に位置情報の利用が許可されているか確認
if (checkSinglePermission(Manifest.permission.ACCESS_COARSE_LOCATION) &&
checkSinglePermission(Manifest.permission.ACCESS_FINE_LOCATION)) {
// 8a. 位置情報を利用する
fusedLocationClient.lastLocation.addOnSuccessListener { location ->
// lastLocation は最後に取得した位置情報を使用するため、一度も取得していない場合は null を返す
location?.let {
currentLocationText.text = "緯度=${it.latitude}, 経度=${it.longitude}"
}
}
} else {
requestLocationPermission()
}
}
}
private fun Context.checkSinglePermission(permission: String): Boolean =
ContextCompat.checkSelfPermission(applicationContext, permission) == PackageManager.PERMISSION_GRANTED
private fun requestLocationPermission() {
// 5a. ユーザーに説明を表示する必要があるか確認
// (≒ 許可しない状態で「今後表示しない」が未チェックであれば true)
if (shouldShowRequestPermissionRationale(Manifest.permission.ACCESS_COARSE_LOCATION) ||
shouldShowRequestPermissionRationale(Manifest.permission.ACCESS_FINE_LOCATION)) {
// 5b. 説明を表示
val snackBar = Snackbar.make(
mainLayout,
"現在地を取得するためには位置情報の権限の許可が必要です。",
Snackbar.LENGTH_INDEFINITE)
snackBar.setAction("OK") {
// 6. 権限を要求
requestPermissionLauncher.launch(
arrayOf(
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION
)
)
}
snackBar.show()
} else {
// 6. 権限を要求
requestPermissionLauncher.launch(arrayOf(
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION))
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment