Created
July 12, 2021 09:26
-
-
Save TatsukiIshijima/7a265ace04c93d46886a6342382b27d5 to your computer and use it in GitHub Desktop.
Androidの位置情報権限取得サンプルコード
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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