diff --git a/app/src/main/java/kr/co/vividnext/sodalive/mypage/alarm/scheduler/AlarmScheduler.kt b/app/src/main/java/kr/co/vividnext/sodalive/mypage/alarm/scheduler/AlarmScheduler.kt index be6b829e..8f56e51a 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/mypage/alarm/scheduler/AlarmScheduler.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/mypage/alarm/scheduler/AlarmScheduler.kt @@ -35,7 +35,13 @@ class AlarmScheduler(private val context: Context) { } val info = AlarmManager.AlarmClockInfo(calendar.timeInMillis, alarmIntent) - alarmManager.setAlarmClock(info, alarmIntent) + try { + // Android 12(S)+: setAlarmClock는 정확 알람 권한 없이도 허용되지만, 보수적으로 예외를 처리한다. + alarmManager.setAlarmClock(info, alarmIntent) + } catch (_: SecurityException) { + // Android 15(targetSdk 35) 호환성: 예외 발생 시 앱이 크래시하지 않도록 방어적으로 무시/로그 처리한다. + // 필요 시 설정 화면 유도는 UI 계층(AlarmListActivity 등)에서 수행. + } } private fun setRepeatingAlarm(alarm: Alarm) { @@ -56,7 +62,11 @@ class AlarmScheduler(private val context: Context) { } val info = AlarmManager.AlarmClockInfo(calendar.timeInMillis, alarmIntent) - alarmManager.setAlarmClock(info, alarmIntent) + try { + alarmManager.setAlarmClock(info, alarmIntent) + } catch (_: SecurityException) { + // Android 15(targetSdk 35) 보완: 예외 발생 시 크래시 방지 + } } } diff --git a/app/src/main/java/kr/co/vividnext/sodalive/network/TokenAuthenticator.kt b/app/src/main/java/kr/co/vividnext/sodalive/network/TokenAuthenticator.kt index 48316284..06f3f590 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/network/TokenAuthenticator.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/network/TokenAuthenticator.kt @@ -18,16 +18,15 @@ class TokenAuthenticator( @UnstableApi override fun authenticate(route: Route?, response: Response): Request? { if (response.code == 401) { - context.startService( - Intent(context, AudioContentPlayService::class.java).apply { - action = AudioContentPlayService.MusicAction.STOP.name - } - ) - context.startService( - Intent(context, AudioContentPlayerService::class.java).apply { - action = "STOP_SERVICE" - } - ) + val stopAudioIntent = Intent(context, AudioContentPlayService::class.java).apply { + action = AudioContentPlayService.MusicAction.STOP.name + } + context.stopService(stopAudioIntent) + + val stopPlayerIntent = Intent(context, AudioContentPlayerService::class.java).apply { + action = "STOP_SERVICE" + } + context.stopService(stopPlayerIntent) SharedPreferenceManager.clear() val intent = Intent(context, LoginActivity::class.java)