From 149d7358f00f6378da892d6a2db776363862f7c5 Mon Sep 17 00:00:00 2001 From: klaus Date: Fri, 24 Oct 2025 00:45:11 +0900 Subject: [PATCH] =?UTF-8?q?build,=20fix(app):=20targetSdk=2035=20=EC=97=85?= =?UTF-8?q?=EA=B7=B8=EB=A0=88=EC=9D=B4=EB=93=9C=20=EC=A0=90=EA=B2=80=20?= =?UTF-8?q?=EB=B0=8F=20Android=2015=20=EC=A0=95=ED=99=95=20=EC=95=8C?= =?UTF-8?q?=EB=9E=8C=20=ED=98=B8=ED=99=98=EC=84=B1=20=EB=B3=B4=EC=99=84,?= =?UTF-8?q?=20Android=2015=20=EB=8C=80=EC=9D=91=20=EB=B3=B4=EC=99=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 정확 알람 예외 처리 및 백그라운드 서비스 시작 회피 - setAlarmClock 호출부 SecurityException 처리 추가(1회/반복 알람) - 401 응답 시 startService → stopService로 변경해 O+/15 백그라운드 서비스 제약 회피 --- .../mypage/alarm/scheduler/AlarmScheduler.kt | 14 ++++++++++++-- .../sodalive/network/TokenAuthenticator.kt | 19 +++++++++---------- 2 files changed, 21 insertions(+), 12 deletions(-) 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)