10-2 퍼미션 설정하기

StrayCat·2022년 11월 9일
0

퍼미션(Permission)

  • 앱의 특정 기능에 부여하는 접근 권한
  • 다른 앱이나 시스템에서 보호 중인 특정 기능을 사용해야 할 때 설정한다.
  • 반대로 다른 앱으로 부터 권한 없이 사용할 수 없도록 보호 할 때도 설정한다.

퍼미션 설정

  • <permission> : 보호하려는 앱의 manifest 파일에 설정
  • <uses-permission> : 기능을 사용하려는 앱의 manifest 파일에 설정
    <permission android:name="com.example.permission.TEST_PERMISSION"
        android:label="Test Permission"
        android:description="Permission Desc"
        android:protectionLevel="dangerous"></permission>
  • name : 식별자
  • protectionLevel
    • normal : 낮은 수준, 퍼미션 사용 설정을 하지만 사용자에게 권한요청을 하지 않아도 된다.
    • dangerous : 높은 수준, 사용자에게도 권한 허용을 요청해야한다.
    • signature : 같은 키로 인증한 앱만 실행한다.
    • signatureOrSystem : 안드로이드 시스템 앱이거나 같은 키로 인증한 앱만 실행한다.
        <activity
            android:name=".MainActivity"
            android:permission="com.example.permission.TEST_PERMISSION"
            android:exported="true"
            >
  • 위에서 설정한 permission을 보호하고자 하는 컴포넌트에 적용할 경우에는, android:permission 키워드로 설정해준다.

퍼미션 사용 설정

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
    <uses-permission
        android:name="android.permission.ACCESS_FINE_LOCATION"
        tools:ignore="CoarseFineLocation" />
  • ACCESS_FINE_LOCATION (위치 권한) 의 경우 dangerous 로 되어있으므로 앱의 권한 설정 화면에서 확인 할 수 있다.

안드로이드 시스템이 보호하는 대표적인 기능

  • ACCESS_FINE_LOCATION : 위치
  • BATTERY_STATS : 배터리 정보
  • CAMERA : 카메라
  • READ_INTERNAL_STORAGE : 내부 저장소 접근
  • READ_PHONE_STATE : 전화기 정보 접근

퍼미션 허용 확인

  • API 레벨 23 이전에는 모두 신고제 ( 어떤 권한을 사용하는지 사용자에게 통보 )

  • API 레벨 23 부터는 모두 사용 허가제로 변경

    • 사용자가 해당 기능 사용을 거부할 수 있다.
  • 앱을 실행할 때마다 해당 기능을 허용하였는지 직접 확인해줘야 한다.

  • 처음 앱 설치할 경우 모든 권한 거부 상태

  • checkSelfPermission() 함수를 통해 권한 획득 여부를 확인한다.

        val status = ContextCompat.checkSelfPermission(this, "android.permission.ACCESS_FILE_LOCATION")

        if(status == PackageManager.PERMISSION_GRANTED){
            Log.d("lumineko", "granted")
        }else{ //PackageManager.PERMISSION_DENIED
            Log.d("lumineko", "denied")
        }
  • ActivityResultLauncher를 통해 사용자에게 권한 요청을 할 수 있다.
        val requestPermissionLauncher = registerForActivityResult(ActivityResultContracts.RequestPermission()){
            isGranted ->
                if (isGranted){
                    Log.d("lumineko", "granted callback")

                }else{
                    Log.d("lumineko", "denied callback")
                }
        }

        requestPermissionLauncher.launch("android.permission.ACCESS_FINE_LOCATION")
        // 해당 권한 요청 런처를 실행한 후 결과값에 따라 isGranted값이 달라진다.

0개의 댓글