안드로이드 6.0부터 Manifest를 통해 앱에 권한을 부여해도, 위험 권한이면 사용자에게 허락을 받아야 합니다.
위험 권한을 요청하고 (권한을)부여받는 알고리즘과 소스를 제공합니다.
코딩할 때는 import문을 참고해서 제작해야 합니다!
요청 예시)


fun permissioncheck(cancel:()->Unit,ok:()->Unit)
: 앱이 권한이 있는지 없는지 확인하고 처리하는 메소드

permissionCheck(cancel={showPermissionInfoDialog()},
ok={addLocationListener()})
: 고차함수인 permissionCheck메소드 호출
fun showPermissionInfoDialog()
: 승인이 필요하다는 알림 메소드

fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray)
: 사용자의 선택(허용,비허용)에 대한 처리 메소드

package com.example.mapsactivity import android.Manifest import android.content.pm.PackageManager import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat import com.google.android.gms.maps.OnMapReadyCallback import org.jetbrains.anko.alert import org.jetbrains.anko.noButton import org.jetbrains.anko.toast import org.jetbrains.anko.yesButton class Activity : AppCompatActivity() { private val oo_request_code = 1000 // 00에 관한 권한 요청 코드(번호) override fun onResume() { super.onResume() // 거부됐으면 showPermissionInfoDialog(알림)메소드를 호출, 승인됐으면 addLocationListener(위치 요청)메소드를 호출 permissionCheck(cancel = { showPermissionInfoDialog() }, ok = { 원하는 메소드 () }) } private fun permissionCheck(cancel: () -> Unit, ok: () -> Unit) { // 앱에 ()을 하려는 권한이 없을 때 // <앱을 처음 실행하거나, 사용자가 이전에 권한 허용을 안 했을 때 성립> if (ContextCompat.checkSelfPermission( this, Manifest.permission.허용하려는 권한 ) != PackageManager.PERMISSION_GRANTED ) { // <PERMISSION_DENIED가 반환됨> // 이전에 사용자가 앱 권한을 허용하지 않았을 때 -> 왜 허용해야되는지 알람을 띄움 // shouldShowRequestPermissionRationale메소드는 이전에 사용자가 앱 권한을 허용하지 않았을 때 ture를 반환함 if (ActivityCompat.shouldShowRequestPermissionRationale( this, Manifest.permission.허용하려는 권한 ) ) { cancel() } // 앱 처음 실행했을 때 else // 권한 요청 알림 ActivityCompat.requestPermissions( this, arrayOf(Manifest.permission.허용하려는 권한), oo_request_code ) } // 앱에 권한이 허용됨 else ok() } // 사용자가 권한 요청<허용,비허용>한 후에 이 메소드가 호출됨 override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) when (requestCode) { // () 사용에 대한 사용자의 요청)일 때 oo_request_code -> { // 요청이 허용일 때 if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) 원하는 메소드 () // 요청이 비허용일 때 else { toast("권한 거부 됨") finish() } } } } // 사용자가 이전에 권한을 거부했을 때 호출된다. private fun showPermissionInfoDialog() { alert("()정보를 얻으려면 ()권한이 필수로 필요합니다", "") { yesButton { // 권한 요청 ActivityCompat.requestPermissions( this@MapsActivity, arrayOf(Manifest.permission.ACCESS_FINE_LOCATION), oo_request_code ) } noButton { toast("권한 거부 됨") finish() } }.show() } }