본문 바로가기

Android/개념 및 예제

안드로이드 퍼미션 개념 정리

퍼미션은 AndroidManifest.xml에 들어가는 설정입니다.

안드로이드는 컴포넌트를 이용한 앱과 앱 사이의 연동이 빈번합니다.

이러한 연동에서 어떤 앱이 <permission>을 부여했다면 그 앱을 이용하는 다른 앱은 <uses-permission>을 선언해야 합니다.

 
 

permission 태그 이용

<permission>은 자신의 앱을 외부에서 이용할 때 권한을 부여하여 해당 권한을 가지고 들어올 때만 실행되게 하는 설정입니다. <permission>으로 선언된 앱을 이용하는 앱이 <uses-permission>을 선언하지 않으면 에러가 발생합니다.

 

<permission android:name="com.example.permission.SOME_PERMISSION"
 android:label="Some Permission"
 android:description="@string/permission"
 android:protectionLevel="normal"/>
  • name: 퍼미션의 이름
  • label, description: 퍼미션에 대한 설명(사용자에게 보이는 문자열)
  • protectionLevel: 보호 수준
    • normal: 낮은 수준의 보호. 사용자에게 권한 부여 요청이 필요 없는 경우
    • dangerous: 높은 수준의 보호. 사용자에게 권한 부여 요청이 필요한 경우
    • signature: 동일한 키로 사인된 앱만 실행
    • signatureOrSystem: 안드로이드 시스템 앱이거나 동일 키로 사인된 앱만 실행

<permission> 관련 공식문서

 

https://developer.android.com/guide/topics/manifest/permission-element?hl=ko

 

 

 |  Android 개발자  |  Android Developers

이 애플리케이션이나 다른 애플리케이션의 특정 구성요소 또는 기능에 대한 액세스를 제한하는 데 사용될 수 있는 보안 권한을 선언합니다. 권한 작동 방식에 관한 자세한 내용은 소개의 권한

developer.android.com

 

  • 컴포넌트에 퍼미션을 적용
<activity android:name=".SomeActivity" 
	android:permission="com.test.permission.SOME_PERMISSION">
	<intent-filter>
		<action android:name="AAA"/>
		<category android:name="android.intent.category.DEFAULT"/> 
	</intent-filter>
</activity>
  • 보호된 컴포넌트를 이용하는 앱
<manifest 
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.test">
		<uses-permission android:name="com.test.permission.SOME_PERMISSION"/>
<!--중략-->
</manifest>
  • protectionLevel 속성
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

android.permission.ACCESS_NETWORK_STATE는 “normal”로 선언,

android.permission.ACCESS_FINE_ LOCATION은 “dangerous”로 선언.

normal로 선언된 네트워크 접근 권한은 권한 설정 화면에 나오지 않습니다.

반면 dangerous로 선언된 위치 접근 권한은 권한 설정 화면에 나와 사용자에게 권한을 부여할지 물어봅니다.

이는 사용자에게 위험이 큰 퍼미션이기 때문입니다.

 

주요 시스템의 퍼미션

  • ACCESS_FINE_LOCATION: 정확한 위치 정보 액세스
  • ACCESS_NETWORK_STATE: 네트워크에 대한 정보 액세스
  • ACCESS_WIFI_STATE: 와이파이 네트워크에 대한 정보 액세스
  • BATTERY_STATS: 배터리 통계 수집
  • BLUETOOTH: 연결된 블루투스 장치에 연결
  • BLUETOOTH_ADMIN: 블루투스 장치를 검색하고 페어링
  • CALL_PHONE: 다이얼 UI를 거치지 않고 전화를 시작
  • CAMERA: 카메라 장치에 액세스
  • INTERNET: 네트워크 연결
  • READ_CONTACTS: 사용자의 연락처 데이터 읽기
  • READ_EXTERNAL_STORAGE: 외부 저장소에서 파일 읽기
  • READ_PHONE_STATE: 장치의 전화번호, 네트워크 정보, 진행 중인 통화 상태 등 전화 상태에 대한
  • 읽기
  • READ_SMS: SMS 메시지 읽기
  • RECEIVE_BOOT_COMPLETED: 부팅 완료 시 수행
  • RECEIVE_SMS: SMS 메시지 수신
  • RECORD_AUDIO: 오디오 녹음
  • SEND_SMS: SMS 메시지 발신
  • VIBRATE: 진동 울리기
  • WRITE_CONTACTS: 사용자의 연락처 데이터 쓰기
  • WRITE_EXTERNAL_STORAGE: 외부 저장소에 파일 쓰기

시스템 퍼미션 목록 공식 문서

https://developer.android.com/reference/android/Manifest.permission.html

 

Manifest.permission  |  Android 개발자  |  Android Developers

 

developer.android.com

 

 

안드로이드 6 (API Level 23) 변경사항

  • 안드로이드 6 이전

사용자에게 위험한 권한이라도 AndroidManifest.xml 파일에 <user-permission>으로 등록만 하면 실행하는 데 문제가 없었다.

  • 안드로이드 6 이후

사용자에게 위험한 권한은 사용자가 거부할 수 있음

→ 개발자는 사용자가 권한을 거부하는 상황을 고려해야 함

 

권한을 승인받는 흐름

퍼미션 상태를 확인 - checkSelfPermission() 함수 이용

int checkSelfPermission (Context context, String permission)

 

두 번째 매개변수는 퍼미션의 이름입니다.

반환 값은 둘 중 하나입니다.

  • PackageManager.PERMISSION_GRANTED: 퍼미션이 부여된 상태
  • PackageManager.PERMISSION_DENIED: 펴미션이 부여되지 않은 상태
if (ActivityCompat.checkSelfPermission(context,
 Manifest.pemission.CAMERA) ==
 PackageManager.PERMISSION_GRANTED) {
	// 카메라에 대한 권한 승인받음
}

퍼미션 허용을 요청하기 - requestPermissions() 함수 이용

void requestPermissions(Activity activity, String[] permissions, int requestCode)

퍼미션 허용 여부를 묻는 대화상자(dialog)를 띄웁니다.

두 번째 매개변수는 퍼미션의 이름이며 문자열 배열로 여러 개의 퍼미션을 한꺼번에 요청할 수 있습니다.

세 번째 매개변수는 상태코드 값으로 개발자가 설정한 임의의 숫자입니다. 퍼미션 조정 결과를 확인할 때 사용합니다.

퍼미션을 허용했는지 확인하기 - onRequestPermissionsResult() 함수 사용

void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults)

첫 번째 매개변수는 요청한 상태 코드 값입니다.

두 번째 매개변수는 요청한 퍼미션의 이름입니다.

세 번째 매개변수는 사용자가 허용한 결과 값입니다.