為何出現此錯誤訊息?Call requires API level 23 (current min is 21): android.app.AlarmManager#setAndAllowWhileIdle

 你的 minSdkVersion 設定為 21 (Android 5.0 Lollipop),但 setAndAllowWhileIdle() 需要 API 23 (Android 6.0 Marshmallow),因此編譯時會報錯。


解決方法

1. 加入 API 檢查 (Build.VERSION.SDK_INT)

你可以加上條件判斷,讓 API 23 以上 使用 setAndAllowWhileIdle(),而 API 21-22 則使用 setExact()

kotlin
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // API 23+ alarmManager.setAndAllowWhileIdle( AlarmManager.RTC_WAKEUP, triggerTime, pendingIntent ) } else { // API 21-22 alarmManager.setExact( AlarmManager.RTC_WAKEUP, triggerTime, pendingIntent ) }

🔹 這樣可以確保 低於 API 23 的裝置仍然可以執行鬧鐘


2. (可選) 提高 minSdkVersion 至 23

如果你的應用 不需要支援 Android 5 (Lollipop),可以直接在 build.gradle 修改 minSdkVersion

gradle
android { defaultConfig { minSdkVersion 23 // 提高最低版本至 Android 6.0 } }

🔹 這樣就可以直接使用 setAndAllowWhileIdle(),不需要額外的 API 檢查。


最佳解法

如果你 希望支援 API 21 (Android 5)又要在 API 23 以上降低耗電,建議這樣寫:

kotlin
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { // Android 12+ 需要特別權限 val alarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager if (!alarmManager.canScheduleExactAlarms()) { val intent = Intent(Settings.ACTION_REQUEST_SCHEDULE_EXACT_ALARM) startActivity(intent) } } val alarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // API 23+ alarmManager.setAndAllowWhileIdle( AlarmManager.RTC_WAKEUP, triggerTime, pendingIntent ) } else { // API 21-22 alarmManager.setExact( AlarmManager.RTC_WAKEUP, triggerTime, pendingIntent ) }

🔹 這樣可以:

  • API 21-22:使用 setExact(),保證準時執行

  • API 23+:使用 setAndAllowWhileIdle(),允許低耗電模式

  • API 31+ (Android 12+):自動請求 SCHEDULE_EXACT_ALARM 權限

這樣你的鬧鐘就能在 各個 Android 版本 上正常運作 🎯

沒有留言:

張貼留言

excel 最大值用max,取最小值但要排除0,要怎麼寫?

 =MIN(IF(A1:A10<>0, A1:A10))