1. 현재 시간보다 이전으로 알람을 설정하면 바로 울림
당연한 사실일 수도 있겠지만 현재 시간보다 이전으로 알람 시간을 설정하게 되면, 설정 즉시 알람이 울리게 된다.
만약에 현재 시간 이후에 알람을 실행하려고 했던 의도라면, 다음과 같이 코드를 작성해서 하루를 더해주면 된다.
if(calendar.before(java.util.Calendar.getInstance())) {
calendar.add(java.util.Calendar.DAY_OF_MONTH,1)
}
2. 반복적인 알람을 만들고 싶은데 정확한 시간을 설정하고 싶다면
API 33 이전 버전에서는 setRepeat()를 통해 정확한 시간에도 알람이 잘 작동했었다.
하지만 33버전에서는 정확한 시간을 반복을 할 수 없었다.
해당 이유는 13부터 생긴 권한 체크 문제이다.
요약하면 API 33을 타게팅하는 앱은 SCHEDULE_EXACT_ALARM 권한을 거부한다.
이전 버전에는 메니페스트 파일에 권한을 추가해주면 앱을 설치시 자동으로 권한이 설정이 되었다면, 33버전에서는 보호 수준이 'Normal | appop'에서 'appop'으로 변경되어 설치시 권한이 자동부여가 되지 않는다. 그렇기에 해당 권한을 통해 정확한 알람을 설정 받아왔다면, 13 이후에는 불가능하다는 것이다.
권한을 수동으로 요청해야 한다는 점인데. 해당 방법은 아래의 링크를 참조하면 된다.
https://www.esper.io/blog/android-13-exact-alarm-api-restrictions
How Android 13's new restrictions on alarm APIs will improve battery life
www.esper.io
그 외에 반복적인 알람을 설정한다면, 꼼수는 아니지만, receiver에 의해 알람이 호출될때 기존의 Calender 시간에 하루를 더해 알람을 재등록 해주면 된다.
3. 티라미슈 이상의 버전에서는 POST_NOTIFICATIONS 권한을 얻어야 하는 문제
티라미슈 이상에서는 위의 2번과 마찬가지로 권한을 얻어야만 사용이 가능하다.
https://developer.android.com/develop/ui/views/notifications/notification-permission
Notification runtime permission | Android Developers
Notification runtime permission Stay organized with collections Save and categorize content based on your preferences. Android 13 (API level 33) and higher supports a runtime permission for sending non-exempt (including Foreground Services (FGS)) notific
developer.android.com
위의 공식 문서를 참고하면, `티라미슈 - (SDK 33)` 이상에서는 `POST_NOTIFICATIONS` 권한을 요구한다. 그렇기에 기기의 버전 체크를 하여 `티라미슈` 버전 이상의 기기에서 권한 체크를 진행해주면 된다.
4. 티리미슈 이상에서는 재등록이 안되는 문제
Notification
의 경우 Android 8.0
이상에서는 체널
을 등록해야만, 알림이 도착하는 문제는 알고 있었다.notification channel
을 구현했지 만 재부팅시 알람이 재등록되지 않았다.
그렇다면 무엇이 문제일까 ?
바로 내가 사용하는 기기의 버전은 티라미슈(Android 10)
이기에 관련하여 공식 문서를 찾아보았다.
https://developer.android.com/guide/components/activities/background-starts?hl=ko
위의 공식문서를 보면 다음과 같다.
백그라운드에서 Activity 시작에 대한 제한 사항 | Android 개발자 | Android Developers
백그라운드에서 Activity 시작에 대한 제한 사항 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. Android 10 (API 레벨 29) 이상은 앱이 백그라운드에서 실행될 때 A
developer.android.com
요약하면, SYSTEM_ARERT_WINDOW 권한을 필요로 한다는 것이다. 이를 위해,
아래의 코드를 추가하여, 권한 체크를 해준다. 만약에 오버레이 권한이 없는 경우 권한을 얻는 설정 화면으로 이동한다.
// 오버레이 권한
if (!Settings.canDrawOverlays(this)){
val intent = Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:${packageName}"))
startActivity(intent)
}
또한 Manifest
파일에 다음과 같이 추가해준다.
<receiver
android:directBootAware="true"
android:enabled="true"
android:exported="true"
android:name=".receiver.AlarmReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
'안드로이드' 카테고리의 다른 글
Retrofit에서 Interceptor와 Converter란 (0) | 2023.10.06 |
---|---|
[Android] await()이 안될 때 (0) | 2023.09.01 |
[Android] - zxing 라이브러리를 이용한 바코드 스캔 (0) | 2023.08.29 |
[Kotlin] 화면 캡쳐 기능 구현하기 (with Hilt, MVVM) (0) | 2023.08.27 |
[Android] Hilt - Retrofit + ViewModel로 이해해보기 (0) | 2023.08.25 |