[TIL] #26 Request Runtime Permissions

Yeon·2023년 8월 28일
0

내일배움캠프 - Kotlin

목록 보기
36/58
post-thumbnail

안드로이드에서는 위치, 저장소 읽기/쓰기 등을 하기 위해서는 권한이 필요하다. AndroidManifest에 권한을 추가하고 Activity에서 권한을 요청하는 방법을 사용하면 된다!


1. 권한 추가

AndroidManifest.xml에 필요한 권한을 추가하면 된다.
아래에 몇 가지 주요한 권한이 있다!

아래 언급한 것 외에도 다양한 권한이 존재하며, 앱의 필요한 기능에 맞게 권한을 추가하면 된다. 다만, 사용자의 개인 정보와 관련된 권한을 요청할 때에는 사용자의 프라이버시를 존중하고 꼭 필요한 경우에만 요청하는 것이 좋다. 앱이 불필요한 권한을 요구하면 사용자가 앱을 신뢰하지 않을 수 있다.

1) 카메라 권한

카메라 앱을 사용하여 사진을 찍거나 동영상을 녹화하는 경우 필요한 권한

<uses-permission android:name="android.permission.CAMERA" />

2) 인터넷 권한

인터넷 연결을 사용하여 웹 서버와 통신하려는 경우 필요한 권한입니다.

<uses-permission android:name="android.permission.INTERNET" />

3) 위치 권한

GPS 또는 네트워크를 통해 사용자의 위치 정보를 가져오려는 경우 필요한 권한

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

4) 저장소 권한

장치의 저장소에 파일을 읽고 쓰려는 경우 필요한 권한

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

### 5) 전화 권한

전화를 거는 등의 통화 관련 작업을 위해 필요한 권한

<uses-permission android:name="android.permission.CALL_PHONE" />

6) 문자 메시지 권한

SMS를 보내거나 받는 등의 작업을 위해 필요한 권한

<uses-permission android:name="android.permission.SEND_SMS" />

7) 마이크 권한

마이크를 사용하여 음성 녹음 또는 음성 인식을 하려는 경우 필요한 권한

<uses-permission android:name="android.permission.RECORD_AUDIO" />

8) 연락처 권한

연락처 정보를 읽거나 수정하려는 경우 필요한 권한

<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />

2. 권한 요청

앱을 실행했을때 해당 권한이 없다면 요청!
아래 코드는 위치 권한을 요청한 것이다.

class MainActivity : AppCompatActivity() {

    val MY_PERMISSION_ACCESS_ALL = 123
    ...

    override fun onCreate(savedInstanceState: Bundle?) {
        
        ...

        if(ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
            || ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED){
            var permissions = arrayOf(
                android.Manifest.permission.ACCESS_FINE_LOCATION,
                android.Manifest.permission.ACCESS_COARSE_LOCATION
            )
            ActivityCompat.requestPermissions(this, permissions, MY_PERMISSION_ACCESS_ALL)
        }
    }

}

3. 권한 거부 시 앱 종료

권한 요청이 완료되면 onRequestPermissionResult 함수를 호출하며 권한 요청에 대한 결과를 argument로 받을 수 있다.

class MainActivity : AppCompatActivity() {

    val MY_PERMISSION_ACCESS_ALL = 123

    ...

    override fun onCreate(savedInstanceState: Bundle?) {
        
        ...
        
    }

    override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<out String>,
        grantResults: IntArray
    ) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)

        if (requestCode === MY_PERMISSION_ACCESS_ALL) {
            if (grantResults.size > 0) {
                for (grant in grantResults) {
                    if (grant != PackageManager.PERMISSION_GRANTED) System.exit(0)
                }
            }
        }
    }
}



[참고 사이트]

'런타임 권한 요청', developers
'안드로이드 코틀린 - 권한(Permission) 요청', 프로그래머의 꿈

0개의 댓글