오늘은 사용자 알림 중 API 레벨 호환성과 퍼미션에 대해 공부했다.
midSdk 21
targetSdk 33
API 레벨 호환성에 문제가 있는 API를 사용한 함수나 클래스 의 선언부 위에 @RequiresAPI
나 @TargetAPI
애너테이션을 사용하면 안드로이드 스튜디오에서 오류 발생을 피할 수 있다.
하지만, 이는 안드로이드 스튜디오에서 오류를 무시하는 설정일 뿐, 앱 실행시 API 호환성 문제를 막으려면 직접 코드로 처리해야 한다.
if문에 Build.VERSION.SDK_INT
를 사용해 앱이 실행되는 기기의 API 레벨을 알아내서 코드의 실행여부를 결정하면 된다.
퍼미션은 앱의 특정 기능에 부여하는 접근 권한이다.
내가 개발하는 앱이 다른 앱이나 안드로이드 시스템에서 보호하는 특정 기능을 이용할 때, 퍼미션 사용을 설정해야 한다.
반대로 내가 만든 기능을 다른 앱에서 사용할 수 없도록 보호하고, 권한을 얻은 앱만 허용하고 싶을 때 퍼미션을 설정하면 된다.
AndroidManifest.xml에서 설정 가능
<permission> : 기능을 보호하려는 앱의 매니페스트 파일에 설정
name - 퍼미션 이름. 퍼미션을 구별하는 식별자 역할
label, description - 퍼미션 설명. 외부 앱에서 권한 인증 화면에 출력됨
protectionLevel - 보호 수준
<permission android:name="com.example.permission.TEST_PERMISSION"
android:label="Test Permission"
android:description="@string/dermission_desc"
android:protectionLevel="dangerous"/>
android:permission
속성을 이용해 적용하면 된다.<activity android:name=".MainActivity"
android:permission="com.example.permission.TEST_PERMISSION" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
ACCESS_FINE_LOCATION : 위치 정보 접근
ACESS_NETWORK_STATE : 네트워크 정보 접근
ACCESS_WIFI_STATE : Wi-Fi 네트워크 정보 접근
BATTERY_STATS : 배터리 정보 접근
BLUETOOTH : 블루투스 장치에 연결
BLUETOOTH_ADMIN : 블루투스 장치를 검색하고 페어링
CAMERA : 카메라 장치에 접근
INTERNET : 네트워크 연결
READ_EXTERNAL_STORAGE : 외부 저장소에서 파일 읽기
WRITE_EXTERNAL_STORAGE : 외부 저장소에 파일 쓰기
READ_PHONE_STATE : 전화기로서의 각종 정보 접근
SEND_SMS : SMS 발신
RECEIVE_SMS : SMS 수신
RECEIVE_BOOT_COMPLETED : 부팅 완료 시 실행
VIBRATE : 진동 울리기
API레벨 23 이전 버전에서 퍼미션은 신고제로 유저가 거부할 수 없었다.
API레벨 23버전부터 허가제로, 사용자가 권한 화면에서 퍼미션을 거부할 수 있게 되었다.
유저가 권한을 거부했다면 다시 퍼미션을 허용해달라고 요청해야 한다.
checkSelfPermission()
함수를 통해 사용자가 퍼미션을 허용했는지 확인이 가능하다.
val status = ContextCompat.checkSelfPermission(this, "android.permission.ACCESS_FINE_LOCATION")
if (status == PackageManager.PERMISSION_GRANTED) {
Log.d("Permission", "permission granted")
} else {
Log.d("Permission", "permission denied")
}
// 객체 생성
val requestPermissionLauncher = registerForActivityResult(
ActivityResultContracts.RequestPermission()
) { isGranted ->
if (isGranted) {
Log.d("event", "callback, granted..")
} else {
Log.d("event", "callback, denied..")
}
}
// ...
// 객체를 이용해 퍼미션 허용 요청 실행 requestPermissionLauncher.launch("android.permission.ACCESS_FINE_LOCATION")