스마트폰 활용

[안드로이드 코딩] 퍼미션 설정

SBS 뉴스 2022. 7. 17. 07:06
반응형
[안드로이드] 퍼미션 설정하기
안드로이드

[안드로이드] 퍼미션 설정하기

by 박휘버그 2022. 7. 17.

안드로이드 유저라면 핸드폰을 사용하다가

지도 앱을 다운 받았을 때 위치 액세스 권한을 허용해 달라고 요청받은 적이 많을 것이다.

 

개발자가 앱을 만들 때 사용자에게 액세스 권한을 받으려면 퍼미션 허용을 요청해야 하는데

오늘은 그 퍼미션에 대해 알아보겠다 !!


<퍼미션의 의미>

퍼미션이란 앱의 특정 기능에 부여하는 접근 권한을 의미한다.

 

 

<퍼미션을 설정하는 상황>

1. 내가 개발하는 앱이 다른 앱이나 안드로이드 시스템에서 보호하는 특정 기능을 이용할 때

2. 내가 만든 기능을 다른 앱에서 사용할 수 없도록 보호하고 권한을 얻은 앱에서만 허용하고 싶을 때

 

<퍼미션의 사용과 설정>

A앱의 컴포넌트를 B앱에서 사용하는 상황이라고 가정하자.

 

A앱의 개발자가 매니페스트 파일에 <permission> 태그로 퍼미션을 설정하면 이를 이용하는

B앱의 코드를 아무리 잘 구현하더라도 실행되지 않는다.

 

이때는 B앱의 매니페스트 파일에 <uses-permission> 태그로 해당 퍼미션을 이용하겠다고 설정해줘야 한다.

 

따라서

 

1. <permission> : 기능을 보호하려는 앱의 매니페스트 파일에 설정

2. <uses-permission> : 퍼미션으로 보호된 기능을 사용하려는 앱의 매니페스트 파일에 설정

 

매니페스트 파일에 퍼미션을 설정할 때는 <permission> 태그와 다음 속성을 이용한다

 

<퍼미션 태그 속성>

1. name : 퍼미션의 이름

2. label, description : 퍼미션 설명

3. protectionLevel : 보호 수준

  • normal : 낮은 수준의 보호. 사용자에게 권한 허용을 요청하지 않아도 OK
  • dangerous : 높은 수준의 보호. 사용자에게 권한 허용을 요청해야 함
  • signature : 같은 키로 인증한 앱만 실행 가능
  • signatureOrSystem : 안드로이드 시스템 앱이거나 같은 키로 인증한 앱만 실행

 

 

<퍼미션 적용하기>

매니페스트 파일에 <permission>을 설정했다고 해서 컴포넌트가 보호되지는 않는다.

<permission>을 설정한 다음 이 퍼미션으로 보호하려는 컴포넌트에 적용해야 한다.

퍼미션을 적용할 때는 android:permission 속성을 이용한다.

 

 <activity
            android:name=".OneActivity"
            android:permission="com.example.TEST_PERMISSION"> //여기
            <intent-filter>
                <action android:name="android.intent.action.PICK" />
            </intent-filter>
</activity>

이제 이 컴포넌트는 com.example.TEST_PERMISSION에 의해 보호되며 이 컴포넌트를 이용하는 곳에서는

매니페스트 파일에 <uses-permission>을 선언해줘야 정상적으로 실행되는 것이다.

 

<uses-permission android:name="com.example.TEST_PERMISSION" />

 

<안드로이드 시스템에서 보호하는 기능을 사용할 때>

이처럼 외부 앱과 연동할 때 퍼미션 사용을 설정해야 하지만 안드로이드 시스템에서 보호하는

기능을 사용할 때도 매니페스트 파일에 퍼미션 사용 설정을 해야한다.

 

https://developer.android.com/reference/android/Manifest.permission?hl=ko

 

기본 플랫폼에서 정의한 권한 목록은 위의 링크에서 확인할 수 있다.

 

 

<퍼미션 허용 확인>

퍼미션은 API 레벨 1 버전부터 있었떤 내용이지만 API 레벨 23 ( 안드로이드 6 ) 버전부터 정책이 바뀌었다.

 

API 23 이전 : 개발자가 매니페스트 파일에 <uses-permission>으로 선언만 하면 보호받는 기능을 앱에서 이용하는 데 문제 X

API 23 이후 : 허가제. 즉 개발자가 <uses-permission>으로 선언했더라도 사용자가 권한 화면에서 이를 거부할 수 있게 됨

 

만약 사용자가 앱의 권한 설정에서 특정 퍼미션을 제거하면  <uses-permission>를 선언하지 않은 것과 같은 것이다.

 

결국 API 23버전부터는 매니페스트 파일에  <uses-permission>을 선언하는 것뿐만 아니라 앱을 실행할 때

사용자가 퍼미션을 거부했는지 확인하고 만약 거부를 했으면 다시 퍼미션을 허용해달라고 요청해야 한다.

(신뢰되지 않는 어플 쓸 때는 거부할 때가 많은데 .. 개발자들을 피곤하게 하는 행동이었다니 반성하게 됨)

 

사용자가 펴미션을 허용했는지 확인하려면 checkSelfPermission() 함수를 이용해야한다.

public static int checkSelfPermission(@NonNull Context context, @NonNull String permission)

두번째 매개변수가 퍼미션을 구분하는 이름이며

결괏값은 다음 중 하나의 상수로 전달된다.

  • PERMISSION_GRANTED : 권한을 허용한 경우
  • PERMISSION_DENIED : 권한을 거부한 경우

 

만약 퍼미션을 거부한 상태라면 사용자에게 해당 퍼미션을 허용해 달라고 요청해야 한다.

 

사용자에게 퍼미션 허용을 요청할 때는 ActivityResultLauncher를 이용해야한다.

ActivityResultLauncher 객체는 registerForActivityResult() 함수를 호출해서 만든다.

public final @NonNull ActivityResultLauncher<I> <I, O> registerForActivityResult(
    @NonNull ActivityResultContract<I, O> contract,
    @NonNull ActivityResultCallback<O> callback
)

첫번째 파라미터 : 어떤 요청인지를 나타내는 ActivityResultContract 타입 객체

두번째 파라미터 : 결과를 받았을 때 호출되는 콜백

 

private val requestPermissionLauncher = registerForActivityResult(
        ActivityResultContracts.RequestPermission()
    ) { isGranted ->
        if (isGranted) {
            // 권한 획득 성공 시 
        } else {
	   // 권한 획득 거부 시 
        }
    }

위 방법으로 객체를 만들었다면

필요한 곳에서 ActivityResultLauncher 객체의 launch() 함수를 호출하여 요청을 실행한다.

 

requestPermissionLauncher.launch("android.permission.ACCESS_FINE_LOCATION")

두번째 파라미터 쓰는 것은 나중에 설명하겠다 !!! 

댓글0


TOP

TEL. 02.1234.5678 / 경기 성남시 분당구 판교역로

반응형