為何出現此錯誤訊息?Setting Exact alarms with setExact requires the SCHEDULE_EXACT_ALARM permission or power exemption from user; it is intended for applications where the user knowingly schedules actions to happen at a precise time such as alarms, clocks, calendars, etc. Check out the javadoc on this permission to make sure your use case is valid.

 你的 setExact() 需要 SCHEDULE_EXACT_ALARM 權限,因為 Android 12 (API 31) 之後,精確鬧鐘 (Exact Alarm) 需要特別授權。你可以用以下方式解決這個錯誤。


解決方案

1. 在 AndroidManifest.xml 內加入 SCHEDULE_EXACT_ALARM 權限

AndroidManifest.xml 檔案內加入:

xml
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM"/>

🔹 這允許應用使用 精確鬧鐘,但 Android 12+ 仍需要使用者手動授權


2. 確保使用者已授權 SCHEDULE_EXACT_ALARM

MainActivityApplication 啟動時檢查:

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) } }

🔹 這段程式碼會引導使用者進入 系統設定頁面,手動允許應用程式使用精確鬧鐘。


3. 使用 setAndAllowWhileIdle() 來替代 (Android 6+ 可用)

如果你的鬧鐘不需要 極度精準的時間,可以改用:

kotlin
alarmManager.setAndAllowWhileIdle( AlarmManager.RTC_WAKEUP, triggerTime, pendingIntent )

🔹 這樣就 不需要 SCHEDULE_EXACT_ALARM 權限,但 Android 6+ 進入 Doze 模式時,可能有誤差


結論

方法需要權限進入 Doze 模式後可用適用版本
setExact()SCHEDULE_EXACT_ALARM❌ 可能不執行Android 5+
setAndAllowWhileIdle()❌ 不需要權限✅ 允許低耗電模式Android 6+
setExactAndAllowWhileIdle()SCHEDULE_EXACT_ALARM✅ 允許低耗電模式Android 6+

👉 建議方案

  • 如果你 需要超精準的鬧鐘 → 使用 setExact() + SCHEDULE_EXACT_ALARM 並提示使用者授權

  • 如果 允許些微時間誤差 → 直接使用 setAndAllowWhileIdle()不需要額外權限 🎯

沒有留言:

張貼留言

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

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