안드로이드 스튜디오, API 레벨 호환성 고려하기, 퍼미션 설정하기

2022. 12. 7. 19:41_Study/AndroidStudio

728x90

10-1 API 레벨 호환성 고려하기 🐇¸.•*¨*•¸.•*¨*•¸.•*¨*•¸.•*¨*•

해당 자료는 강의 학습자료이며, Do it! 깡샘의 안드로이드 앱 프로그래밍 with 코틀린을 참고하였습니다.


API 레벨 호환성 고려하기

build.gradle

midSdk 21

targetSdk 31

 

31 버전의 API로 개발하지만 21 버전 기기에서도 오류가 발생하지 않고 돌아간다는 의미이다.

minSdk 설정값보다 상위 버전에서 제공하는 API를 사용한다면 호환성을 고려한다.

 

@RequiresApi 애너테이션이나 @TargetApi 애너테이션을 이용하여 안드로이드 스튜디오에서 오류를 무시하는 설정을 할 수 있다.

오류가 발생하는데 왜 그런지는 모르지만 나중에 처리하기로 했다.

 

 

 

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)
    )
}

아마 forIncomingCall 의 변수는 있어야하는듯 오류뜬다.

 

 

 

10-2 퍼미션 설정하기 🐇¸.•*¨*•¸.•*¨*•¸.•*¨*•¸.•*¨*•


퍼미션 설정과 사용 설정

A앱의 컴포넌트를 B앱에서 사용할 때 만약 A앱의 컴포넌트에 퍼미션을 설정하면 B 앱에서 연동할 때 문제가 발생한다.

 

매니페스트 파일에 <permission> 태그로 퍼미션을 설정

매니페스트 파일에 <uses-permission> 태그로 해당 퍼미션을 이용하겠다고 설정

 

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

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

 

<permission> 태그와 속성

- name : 퍼미션 이름

개발자가 정하는 이름으로 퍼미션을 구별하는 식별자 역할

 

- label, description : 퍼미션을 설명

이 퍼미션을 이용하는 외부 앱에서 권한 인증 화면에 출력할 퍼미션의 정보

 

- protectionLevel : 보호수준

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

 

 

시스템에 선언된 퍼미션
-  ACCESS_NETWORK : 네트워크 정보 접근 권한. protectionLevel은 normal
- ACCESS_COARSE_LOCATION : 대략적인 위치 접근 권한. protectionLevel은 dangerous
- ACCESS_FINE_LOCATION : 정확한 위치 접근권한. protectionLevel은 dangerous

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

설정 - 앱 권한에서 확인 가능하다.

테스트를 위해 OneActivity 를 추가하고 퍼미션으로 보호하려는 컴포넌트에 적용하였다. 컴포넌트를 이용하는 메인에는 uses-permission을 추가

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

 

 

시스템에서 보호하는 기능을 사용할 때도 매니페스트 파일에 퍼미션 사용 설정
- ACCESS_FINE_LOCATION: 위치 정보 접근
- ACCESS_NETWORK_STATE: 네트워크 정보 접근
- ACCESS_WIFI_STATE: 와이파이 네트워크 정보 접근
- BATTERY_STATS: 배터리 정보 접근
- BLUETOOTH: 블루투스 장치에 연결

- BLUETOOTH_ADMIN: 블루투스 장치를 검색하고 페어링
- CAMERA: 카메라 장치에 접근
- INTERNET: 네트워크 연결
- READ_EXTERNAL_STORAGE: 외부 저장소에서 파일 읽기
- WRITE_EXTERNAL_STORAGE: 외부 저장소에 파일 쓰기
- READ_PHONE_STATE: 전화기 정보 접근
- SEND_SMS: 문자 메시지 발신
- RECEIVE_SMS: 문자 메시지 수신
- RECEIVE_BOOT_COMPLETED: 부팅 완료 시 실행
- VIBRATE: 진동 울리기

 

 

퍼미션 허용 확인

권한 화면에서 거부할 수 있기 때문에 설정창에서 확인이 필요하다.

 

사용자가 퍼미션을 허용했는지 확인하려면 checkSelfPermission() 함수를 이용하고 결괏값은 다음 중 하나의 상수로 전달한다.
- PackageManager.PERMISSION_GRANTED: 권한을 허용한 경우
- PackageManager.PERMISSION_DENIED: 권한을 거부한 경우

 

 

 

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

-  ActivityResultLauncher를 이용
- ActivityResultLauncher 객체는 registerForActivityResult() 함수를 호출해서 만듭니다.
- 첫 번째 매개변수는 어떤 요청인지를 나타내는 ActivityResultContract 타입 객체
- 두 번째 매개변수는 결과를 받았을 때 호출되는 콜백
- ActivityResultLauncher 객체의 launch() 함수를 호출하여 요청을 실행

val requestPermissionLauncher = registerForActivityResult(
    ActivityResultContracts.RequestPermission()
){isGranted ->
    if(isGranted){
        Log.d("kkang","callback Granted")
    }else{
        Log.d("kkang","callback denied..")
    }

}