앱의 특정 기능에 부여하는 접근 권한을 말한다.
내가 개발하는 앱이 다른 앱이나 안드로이드 시스템에서 보호하는 특정 기능을 이용할 때 퍼미션 사용을 설정해야 한다.
앱의 컴포넌트를 보호하고 싶을 때 manifest 파일에서 퍼미션을 설정할 수 있다.
/*
name: 퍼미션의 이름
label, description: 퍼미션을 설명
protectionLevel: 보호 수준
*/
<permission android:name="com.example.permission.TEST_PERMISSION"
android:label="Test Permission"
android:description="@string/permission_desc"
android:protectionLevel="dangerous" />
// manifest 파일
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
ACCESS_NETWORK_STATE와 ACCESS_FINE_LOCATION은 시스템에 선언된 퍼미션으로 각각 네트워크에 접근하고 사용자 위치를 추적하는 데 필요하다.
각각의 protectionLevel은 normal과 dangerous이다.
manifest 파일에 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에 의해 보호되며 이 컴포넌트를 이용하는 곳에서는 manifest 파일에 uses-permission 태그를 선언해 줘야 정상적으로 실행이 된다.
퍼미션이 API 레벨 23버전부터 정책이 바뀌어서 그 이전 버전에서는 uses-permission 태그로 선언만 하면 기능을 사용하는 데 문제가 없었지만, 23버전부터 허가제로 바뀌었다.
개발자가 uses-permission 태그로 선언했더라도 사용자가 권한 화면에서 이를 거부할 수 있게 되었다.
open static fun checkSelfPermission(
@NonNull context: Context,
@NonNull permission: String
): Int
두 번째 매개변수가 퍼미션을 구분하는 이름이고, 결괏값은 상수로 전달된다.
- PackageManager.PERMISSION_GRANTED: 권한을 허용한 경우
- PackageManager.PERMISSION_DENIED: 권한을 거부한 경우
val status = ContextCompat.checkSelfPermission(this,
"android.permission.ACCESS_FINE_LOCATION")
if(status == PackageManager.PERMISSION_GRANTED) {
Log.d("gildong", "permission granted")
} else {
Log.d("gildong", "permission denied")
}
퍼미션을 거부한 상태라면 사용자에게 해당 퍼미션을 허용해 달라고 요청해야한다.
- ActivityResultLauncher를 사용
액티비티에서 결과를 돌려받아야 할 때 사용 대표적으로 퍼미션 허용 요청과 다른 액티비티를 실행하고 결과를 돌려받을 때 사용
- ActivityResultLauncher 객체는 registerForActivityResult() 함수를 호출해서 만듬
public final<I, O> ActivityResultLauncher<I> registerForActivityResult( @NonNull ActivityResultContract<I, O> contract, @NonNull ActivityResultCallback<O> callback)
- registerForActivityResult() 함수는 매개변수가 2개로
첫번째는 어떤 요청인지를 나타내는 객체이며, 다양한 요청에 대응하는 서브 클래스들이 있다.
- 다른 액티비티를 실행하고 결과를 돌려받을 때
StartActivityForResult- 퍼미션 허용을 요청할 때
RequestPermission- 두번째 매개변수는 결과를 받았을 때 호출되는 콜백이다.
val requestPermissionLauncher = registerForActivityResult(
ActivityResultContracts.RequestPermission()
) { isGranted ->
if (isGranted) {
Log.d("test", "callback, granted..")
} else {
Log.d("test", "callback, denied..")
}
}
requestPermissionLauncher.launch("android.permission.ACCESS_FINE_LOCATION")
요청 결과는 registerForActivityResult() 함수의 두 번째 매개변수로 등록한 콜백으로 전달된다.