안드로이드에서는 특정 동작을 위하여 권한이 필요
Android 6.0 (Marshmallow) 이전에는 앱 설치 시 모든 권한이 요청되었지만 이후 버전은 권한이 크게 일반 권한과 위험 권한으로 나뉨
일반권한
개인정보를 요청하지 않는 권한으로 앱 설치 시 권한을 요청하며, 대표적으로 인터넷 접근 권한, 와이파이 접근 권한, 블루투스 접근 권한 등이 있다.
위험 권한
개인정보를 요청하는 권한으로 그 기능이 동작할 때 권한을 요청하며, 대표적으로 카메라, 위치, 갤러리, 주소록 권한 등이 있다.
그룹 내 권한 허용 시, 동일 그룹 내 권한이 요청될 경우 자동으로 허용
Permission 요청 예시
Manifest 위치 권한 추가
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
FINE은 GPS 센서, COARSE는 네트워크로 위치를 측정
권한 요청 (Activity)
val TAG_CODE_PERMISSION_LOCATION = 100 //지역변수
if(ContextCompat.checkSelfPermission(this,android.Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED
&& ContextCompat.checkSelfPermission(this,android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED){
Toast.makeText(this, "권한 확인 되었습니다.", Toast.LENGTH_SHORT).show()
//권한 확인이 되었을 때 실행 코드
}else { // 권한이 없을 때 권한을 요구함
val permissions = arrayOf(Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION)
ActivityCompat.requestPermissions(this, permissions, TAG_CODE_PERMISSION_LOCATION)
}
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
if(grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED){
Toast.makeText(this, "권한 확인 되었습니다.", Toast.LENGTH_SHORT).show()
}else{
Toast.makeText(this, "설정에서 권한을 허가 해주세요.", Toast.LENGTH_SHORT).show()
}
}
부연 설명
권한 체크
ContextCompat.checkSelfPermission(컨텍스트(), 퍼미션정보) == PackageManager.PERMISSION_GRANTED
checkSelfPermission으로 권한이 있는지 여부를 확인
Activity는 자기 자신(this)을, Fragment에서는 requireActivity를 context로 사용
PERMISSION_DENIED를 사용할 경우 권한이 없다의 조건으로 사용 가능
권한 요청
ActivityCompat.requestPermissions(컨텍스트(),arrayOf(퍼미션정보),요청값)
requestPermissions로 권한을 요청, arrayOf의 인자로 권한들을 나열해주면 되고 요청 값이 반환됨
필자는 따로 array 변수를 만들었지만 바로 arrayOf를 사용해 권한 나열 가능
요청 결과
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
if(grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED){
Toast.makeText(this, "권한 확인 되었습니다.", Toast.LENGTH_SHORT).show()
}else{
Toast.makeText(this, "설정에서 권한을 허가 해주세요.", Toast.LENGTH_SHORT).show()
}
}
권한이 요청되고 나면 onRequestPermissionsResult 이 호출된다.
요청 값을 확인하여 grantResults가 비어있지 않고, 첫 번째 값이 동의 상태라면 권한이 있는 것이므로 동의한 내용을 처리, 아닐 경우 동의하지 않았을 시 처리
Fragment에서 권한을 요청했을 경우 onRequestPermissionsResult 는 부모 Activity에서 호출된다.
부모 Activity에서 권한결과를 Fragment로 보내어 처리를 하든 하면 된다.
Permission Check
https://developer.android.com/training/permissions/requesting?hl=ko
https://hanyeop.tistory.com/139
'Android > Reference' 카테고리의 다른 글
ClipboardManager 클립보드에 복사 후 붙여넣기 (0) | 2022.03.16 |
---|---|
ViewPager Infinite, Auto Scroll (7) | 2022.03.08 |
Fragment ViewModel 공유 (0) | 2022.02.22 |
Navigation, BottomNavigation 클릭시 Fragment 재생성 막기 (0) | 2022.02.17 |
LiveData setValue(), postValue() 차이 (0) | 2022.02.16 |