為何出現此錯誤訊息?Missing permissions required by Builder.setPersisted: android.permission.RECEIVE_BOOT_COMPLETED,Call requires API level 23 (current min is 21): android.content.Context#getSystemService

 你遇到的問題主要有兩個:

  1. 缺少權限 (android.permission.RECEIVE_BOOT_COMPLETED),導致 setPersisted(true) 無法運作。

  2. API 兼容性問題getSystemService(JobScheduler::class.java) 需要 API 23 以上,但你的 minSdkVersion 是 21。


解決方案

1. 添加 RECEIVE_BOOT_COMPLETED 權限

AndroidManifest.xml <manifest> 標籤內 加入:

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

並在 <application> 標籤內 註冊 BootReceiver

xml
<receiver android:name=".BootReceiver" android:exported="false"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"/> </intent-filter> </receiver>

2. 創建 BootReceiver.kt

新增一個 BootReceiver 來確保手機重開機後,仍能排程 JobScheduler

kotlin
import android.content.BroadcastReceiver import android.content.Context import android.content.Intent class BootReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent?) { if (intent?.action == Intent.ACTION_BOOT_COMPLETED) { scheduleAppCloseJob(context) // 重新排程關閉 App 任務 } } }

3. 修改 scheduleAppCloseJob()

因為 getSystemService(JobScheduler::class.java) 在 API 23+ 可用,所以我們要做兼容處理:

kotlin
import android.app.job.JobInfo import android.app.job.JobScheduler import android.content.ComponentName import android.content.Context import android.os.Build fun scheduleAppCloseJob(context: Context) { val componentName = ComponentName(context, CloseAppJobService::class.java) val jobInfo = JobInfo.Builder(123, componentName) .setMinimumLatency(5 * 60 * 1000) // 5 分鐘後執行 .setOverrideDeadline(5 * 60 * 1000) // 最晚 5 分鐘內執行 .setRequiresDeviceIdle(false) .setRequiresCharging(false) .apply { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) { setPersisted(true) // 確保重啟後仍有效 } } .build() val jobScheduler = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { context.getSystemService(JobScheduler::class.java) } else { context.getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler } jobScheduler?.schedule(jobInfo) }

4. 確保 CloseAppJobService.kt 正確

kotlin
import android.app.job.JobParameters import android.app.job.JobService import android.os.Process class CloseAppJobService : JobService() { override fun onStartJob(params: JobParameters?): Boolean { // 立即關閉應用 Process.killProcess(Process.myPid()) System.exit(0) return false } override fun onStopJob(params: JobParameters?): Boolean { return false } }

完整流程

  1. App 進入背景後,5 分鐘後自動關閉

  2. 手機重新啟動後,仍會排程自動關閉 App

  3. 適配 minSdkVersion 21,不會導致 getSystemService 崩潰

  4. 解決 setPersisted(true) 需要權限的問題

現在,你的 App 進入背景 5 分鐘後,就會自動關閉,下次點開時一定會重新啟動! 🎯

沒有留言:

張貼留言

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

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