240108 TIL #289 Android #12 사용자 알림

김춘복·2024년 1월 8일
0

TIL : Today I Learned

목록 보기
289/543
post-custom-banner

Today I Learned

오늘은 사용자 알림 중 API 레벨 호환성과 퍼미션에 대해 공부했다.


사용자 알림

API 레벨 호환성

  • build.gradle에는 API 레벨을 설정하는 부분이 있다.
    앱 개발시 minSdk~targetSDK까지 API 레벨에 대한 호환성 여부를 체크하고 개발해야 한다.
midSdk 21
targetSdk 33
  • API 레벨 호환성에 문제가 있는 API를 사용한 함수나 클래스 의 선언부 위에 @RequiresAPI@TargetAPI 애너테이션을 사용하면 안드로이드 스튜디오에서 오류 발생을 피할 수 있다.

  • 하지만, 이는 안드로이드 스튜디오에서 오류를 무시하는 설정일 뿐, 앱 실행시 API 호환성 문제를 막으려면 직접 코드로 처리해야 한다.

  • if문에 Build.VERSION.SDK_INT를 사용해 앱이 실행되는 기기의 API 레벨을 알아내서 코드의 실행여부를 결정하면 된다.


Permission

퍼미션은 앱의 특정 기능에 부여하는 접근 권한이다.

  • 내가 개발하는 앱이 다른 앱이나 안드로이드 시스템에서 보호하는 특정 기능을 이용할 때, 퍼미션 사용을 설정해야 한다.

  • 반대로 내가 만든 기능을 다른 앱에서 사용할 수 없도록 보호하고, 권한을 얻은 앱만 허용하고 싶을 때 퍼미션을 설정하면 된다.

퍼미션 설정

  • 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> : 퍼미션으로 보호된 기능을 사용하려는 앱의 매니페스트 파일에 설정
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
  • permissionLevel 종류
    normal : 앱이 퍼미션 사용은 요청해야 하지만, 유저에게 권한 부여 요청이 필요 없는 경우.
    dangerous : 높은 수준의 보호. 유저에게 권한 부여 요청이 필요한 경우.
    signature : 동일한 키로 인증된 앱만 실행.
    signatureOrSystem : 안드로이드 시스템 앱 이거나 같은 키로 사인된 앱만 실행.

시스템 퍼미션 종류

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")
}
  • 사용자에게 퍼미션 허용을 요청할 때는 ActivityResultLauncher를 이용한다. 해당 객체는 registerForActivityResult() 함수를 호출해서 만든다.
// 객체 생성
        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")
profile
Backend Dev / Data Engineer
post-custom-banner

0개의 댓글