Android(11) - API 레벨 & 퍼미션 설정
1. API 레벨 호환성 고려하기
build.gradle에 SDK 버전을 설정하는 targetSdk와 minSdk를 봤었다.
여기에 설정하는 값은 API 레벨을 의미하며 targetSdk는 여기에 설정한 버전의 API로 앱을 개발한다는 의미이고
minSdk는 여기에 설정한 버전의 기기부터 설처할 수 있다는 의미이다.
즉 targetSdk로 앱을 개발하지만 minSdk까지 오류가 발생하지 않고 동작해야한다.
앱을 개발할 때 minSdk 설정값보다 상위 버전에서 제공하는 API를 사용한다면 호환성을 고려해야 한다.
API 레벨 호환성 문제가 발생하는 클래스나 함수를 사용하면 안드로이드 스튜디오에서 경고나 오류메세지를 표시함.
API 레벨 호환성에 문제가 있는 API를 사용할 때는 @ 기호로 시작하는 애너테이션을 추가해 오류를 해결할 수 있다.
@RequiresApi(Build.VERSION_CODES.S)
fun noti() {
...
val builder: Notification.Builder = Notification.Builder(this, "1")
.setStyle(
Notification.CallStyle.forIncomingCall(caller, declineIntent, answerIntent)
)
...
}
API 레벨 호환성에 문제가 있는 API를 사용한 함수나 클래스 선언부 위에 @RequiresApi 애너테이션을 추가하면
안드로이드 스튜디오에서 오류가 발생하지 않고 @RequiresApi 대신 @TargetApi를 이용해도 된다.
API 호환성 애너테이션은 오류를 무시하는 설정일 뿐이며 앱이 실행될 때 API 레벨 호환성을 막으려면
직접 코드로 처리해야 한다.
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.S){
val builder: Notification.Builder = Notification.Builder(this, "1")
.setStyle(
Notification.CallStyle.forIncomingCall(caller, declineIntent, answerIntent)
)
}
Build.VERSION.SDK_INT는 앱이 실행되는 기기의 API 레벨이다.
2. 퍼미션 설정하기
퍼미션이란 앱의 특정 기능에 부여하는 접근을 의미한다.
-
퍼미션 설정과 사용 설정
어느 앱에 퍼미션을 설정하려면 해당 앱의 매니패스트 파일에 permission 태그로 퍼미션을 설정해야 한다.
그리고 퍼미션을 설정한 컴포넌트를 다른 앱에서 사용하고자 할 때 매니패스트 파일에 uses-permission 태그를 설정해야 한다.- permission: 기능을 보호하려는 앱의 매니페스트 파일에 설정
- uses-permission: 퍼미션으로 보호된 기능을 사용하려는 앱의 매니페스트 파일에 설정
매니페스트 파일에 퍼미션을 설정할 때는 permission 태그와 다음 속성을 사용.
- name: 퍼미션 이름
- label, description: 퍼미션 설명
- protectionLevel: 보호 수준
<permission android:name="com.example.permission.TEST_PERMISSION" android:label="Test Permission" android:description="@string/permission_desc" android:protectionLevel="dangerous"/>
name은 퍼미션을 구별하는 식별자 역할을 하며, 개발자가 직접 작성함.
label과 description은 이 퍼미션을 이용하는 외부 앱에서 권한 인증 화면에 출력할 퍼미션의 정보.
protectionLevel 속성은 보호 수준을 의미하고 다음과 같은 값을 지정할 수 있다.- normal: 낮은 수준의 보호, 사용자에게 권한 요청을 하지 않아도 된다.
- dangerous: 높은 수준의 보호, 사용자에게 권한 요청을 해야한다.
- signature: 같은 키로 인증한 앱만 실행
- signatureOrSystem: 안드로이드 시스템 앱이거나 같은 키로 인증한 앱만 실행.
보통 위에 3개만 사용함. 모든 protectionLevel의 속성값들은 퍼미션 사용 설정은 해야함.
매니페스트 파일에 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>
위 컴포넌트는 설정한 퍼미션에 의해 보호되고 이 컴포넌트를 이용하는 곳에서는 매니페스트 파일에 uses-permission을 선언해야 정상으로 실행된다.
<uses-permission android:name="com.example.TEST_PERMISSION"/>
외부 앱과 연동하는 거 말고도 안드로이드 시스템에서 보호하는 기능을 사용할 때도 마찬가지로 해줘야한다.
(시스템이 보호하는 기능은 검색) -
퍼미션 허용 확인
사용자가 퍼미션을 허용했는지 확인하려면 checkSelfPermission() 함수를 이용한다.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 == PackManager.PERMISSION_GRANTED) { Log.d(...) }else { Log.d(...) }
퍼미션이 거부된 상태라면 퍼미션을 허용해 달라고 요청해야 하는데, ActivityResultLauncher를 이용하면 된다.
이 클래스는 액티비티에서 결과를 돌려받아야 할 때 사용하고 대표적으로 퍼미션 허용 요청과 다른 액티비를 실행하고 결과를 돌려받을 때이다.
ActivityResultLauncher 객체는 registerForActivityResult() 함수를 호출해서 만든다.public final <I, O> Activity
댓글남기기