반응형
권한
- 개인정보 (개인정보, 카메라, 센서, 저장소) 와 관련된 기능을 사용하기 위해서 권한 등록 필요
- 사용자가 앱을 다운받거나 설치한 후, 앱정보에서 확인 가능
- 사용자에게 이 앱이 어떤 기능을 사용하는지를 알려주는 목적이 있음
- 개발자는 권한을 필요로 하는 기능을 필요로 할 때 권한등록을 하지 않고 코드를 작성하게 되면 오류가 발생하면서 튕기는 현상 발생 -> 개발자는 반드시 권한을 등록 / 등록된 권한은 사용자에게 고지됨 (사용자에게 허가를 받는 권한도 있고 등록만 하는 권한도 있음)
- 안드로이드 6.0 (마시멜로우) 부터 개인정보와 관련된 권한은 앱 내부에서 고지하고 사용 허가를 받아야 함
- 사용자에게 고지후 승인을 받거나 허가를 받을 필요가 없는 권한(개인정보 관련 x)은 사용 허가를 받은 상태로 처리
- manifest에 사용할 권한들을 명시해 등록 (사용자 허가가 필요해 따로 허용 여부를 물어봐야 하는 경우 처음엔 비활성화)
- 마시멜로우 이전에는 사용자가 직접 설정 페이지에 들어가 권한을 확인하도록 했으나 잘 확인하지 않는 이슈 => 처음에는 무조건 권한 허용이 비활성화 되어서 개발자가 반드시 해당 권한의 허가를 받는 코드를 작성한 후 그 안에 기능과 관련된 코드를 작성해야 함. 또한 사용자는 권한에 대해 직접 찾아보지 않아도 앱을 설치하고 시작할 때 허용 여부를 체크하는 것으로 편의성 증대
권한 허가 여부 확인하기
- checkCallingOrSeldPermission() : 권한의 허용/거부 여부를 확인하는 메서드 (허용 : PERMISSION_GRANTED, 거부 : PERMISSION_DENIED)
binding.textView.text = ""
// 어떤 권한이 허용되었고, 거부되었는지 확인
for (permission in permission_list) {
// 권한 허용 여부
val chk = checkCallingOrSelfPermission(permission)
if (chk == PackageManager.PERMISSION_GRANTED) { // 허용 : PERMISSION_GRANTED 거부 : PERMISSION_DENIED
binding.textView.append("${permission} : 허용\n")
} else if (chk == PackageManager.PERMISSION_DENIED) {
binding.textView.append("${permission} : 거부\n")
}
}
거부되어 있는 권한을 사용자에게 허가 받기
- requestPermissions() : 권한 허가 받고자 하는 권한 리스트와 해당 상황을 구분하기 위한 코드를 넣어 사용
binding.button2.setOnClickListener {
// 거부되어 있는 권한들을 사용자에게 확인 받음
requestPermissions(permission_list, 0)
// requestCode : 여러 상황에서 requestPermissions() 메소드를 호출할 수 있는데 상황을 구분하기 위한 코드
}
사용자에게 권헌 허가 확인시, 자동 호출 메서드 만들기
- onRequestPermissionResult() : requestPermissions() 호출시 자동으로 호출됨. 오버라이딩 하여 필요한 기능 구현
// 사용자에게 권한 허용 여부를 확인 받으면 자동으로 호출되는 메서드 (동작 하는 기능 만들기)
override fun onRequestPermissionsResult(
requestCode: Int, // requestPermissions() 에서 전달하는 requestCode 값 -> 이 코드에 따라 분기
permissions: Array<out String>, // 확인할 권한들
grantResults: IntArray // 허용 or 거부 값
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
binding.textView.text = ""
// 사용자에게 권한 허가만 받으면 바로 텍스트뷰에 반영
for (idx in 0 until grantResults.size) { // indices : IntRange(0, lastIndex) 반환 //for(idx in 0 until grantResults.size)
if (grantResults[idx] == PackageManager.PERMISSION_GRANTED) {
binding.textView.append("${permissions[idx]} : 허용\n")
} else {
binding.textView.append("${permissions[idx]} : 거부\n")
}
}
}
[전체 코드]
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
// 확인 받아야 할 권한 명시 (일단 모든 권한 다 명시하고, 그 중 확인이 필요한(현재 거부 상태) 권한만 확인 받도록 된다)
val permission_list = arrayOf(
android.Manifest.permission.INTERNET,
android.Manifest.permission.ACCESS_FINE_LOCATION,
android.Manifest.permission.ACCESS_COARSE_LOCATION,
android.Manifest.permission.READ_CONTACTS,
android.Manifest.permission.WRITE_CONTACTS,
android.Manifest.permission.READ_EXTERNAL_STORAGE,
android.Manifest.permission.WRITE_EXTERNAL_STORAGE
)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater) // 뷰바인딩 객체
val view = binding.root //뷰바인딩을 통해 레이아웃과 뷰가 결합 -> .root 를 통해 View 객체만를 뽑아내는(?)
setContentView(view)
binding.textView.text = ""
// 어떤 권한이 허용되었고, 거부되었는지 확인
for (permission in permission_list) {
// 권한 허용 여부
val chk = checkCallingOrSelfPermission(permission)
if (chk == PackageManager.PERMISSION_GRANTED) { // 허용 : PERMISSION_GRANTED 거부 : PERMISSION_DENIED
binding.textView.append("${permission} : 허용\n")
} else if (chk == PackageManager.PERMISSION_DENIED) {
binding.textView.append("${permission} : 거부\n")
}
}
binding.button2.setOnClickListener {
// 거부되어 있는 권한들을 사용자에게 확인 받음
requestPermissions(permission_list, 0)
// requestCode : 여러 상황에서 requestPermissions() 메소드를 호출할 수 있는데 상황을 구분하기 위한 코드
}
}
// 사용자에게 권한 허용 여부를 확인 받으면 자동으로 호출되는 메서드 (동작 하는 기능 만들기)
override fun onRequestPermissionsResult(
requestCode: Int, // requestPermissions() 에서 전달하는 requestCode 값 -> 이 코드에 따라 분기
permissions: Array<out String>, // 확인할 권한들
grantResults: IntArray // 허용 or 거부 값
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
binding.textView.text = ""
// 사용자에게 권한 허가만 받으면 바로 텍스트뷰에 반영
for (idx in 0 until grantResults.size) { // indices : IntRange(0, lastIndex) 반환 //for(idx in 0 until grantResults.size)
if (grantResults[idx] == PackageManager.PERMISSION_GRANTED) {
binding.textView.append("${permissions[idx]} : 허용\n")
} else {
binding.textView.append("${permissions[idx]} : 거부\n")
}
}
}
}
반응형
'Android' 카테고리의 다른 글
[안드로이드/Menu] Context Menu (0) | 2023.03.06 |
---|---|
[안드로이드/Menu] Option Menu (0) | 2023.03.05 |
[안드로이드/AdapterView] RecyclerView (0) | 2023.03.01 |
[안드로이드/AdapterView] MultiChoiceListView (0) | 2023.02.28 |
[안드로이드/AdapterView] SingleChoiceListView (0) | 2023.02.28 |