Android JobScheduler - 无法创建持久作业

时间:2015-04-15 15:06:16

标签: android android-permissions android-jobscheduler

我正在尝试Android Lollipop附带的新JoScheduler API。到目前为止,我已经成功创建了一个工作,并且延迟了6000毫秒,没有网络要求而没有问题。

但是,我刚尝试通过使用setPersisted(true)函数来保持相同的工作。一旦调用了job build()函数,它就会失败,说我需要在Manifest文件中获得RECEIVED_BOOT_COMPLETED权限。

但我已经添加了许可:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  package="com.android" >

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

我甚至在添加作业之前添加了以下代码,以查看应用是否已注册权限:

PackageManager pm = context.getPackageManager();
int hasPerm = pm.checkPermission(Permission.RECEIVE_BOOT_COMPLETED, 
context.getPackageName());
if (hasPerm == PackageManager.PERMISSION_GRANTED)
{
   // Goes into here every time
}

但是,在构建作业时,我收到以下错误:

java.lang.IllegalArgumentException: Error: requested job be persisted without holding RECEIVE_BOOT_COMPLETED permission.

我创建并将作业添加到JobSchedular的代码:

ComponentName serviceComponent = new ComponentName(getApplicationContext(), MyJobService.class);
JobInfo.Builder builder = new JobInfo.Builder(1, serviceComponent)
        .setMinimumLatency(6000)
        .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
        .setPersisted(true);
JobScheduler jobScheduler = (JobScheduler) getApplicationContext().getSystemService(Context.JOB_SCHEDULER_SERVICE);
jobScheduler.schedule(builder.build());

我的JobService清单声明:

<service
        android:name=".service.MyJobService"
        android:permission="android.permission.BIND_JOB_SERVICE"
        android:exported="true" >
    </service>

所以我想知道我是否在做其他人可以发现的错误。我注意到的唯一一件事就是它确实有所不同,因为代码是在IntentService中运行的,所以我想知道这是否是JobScheduler无法找到权限的原因。

5 个答案:

答案 0 :(得分:21)

我遇到了同样的问题,但后来发现在添加启动权限后我没有重新安装我的应用。因此,应用程序永远不会有机会在安装时请求所需的权限。

卸载并重新安装应用程序后,它就能正常运行。

注意:我的理解是应用需要在安装时获得他们的许可。但是我要在这里纠正。

答案 1 :(得分:15)

正如 43matthew 所说,这可能是由JobScheduler缓存引起的。

设备重启后它已解决。

PS:确保您的XML具有以下权限。

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

答案 2 :(得分:4)

看起来JobScheduler会保留拥有此权限的uid缓存: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.0.0_r1/com/android/server/job/JobSchedulerService.java#736

也许你添加了权限,但手机没有重启,因此JobScheduler没有更新其缓存?

答案 3 :(得分:0)

我有同样的问题,我认为你的问题是你正在开始一个意向服务。您还需要将BIND_JOB权限添加到意图服务中。

    <service
        android:name=".your.intent.service"
        android:enabled="true"
        android:exported="false"
        android:permission="android.permission.BIND_JOB_SERVICE"/>

答案 4 :(得分:-2)

我注意到如果将作业计划程序设置为持久,那么您可能会遇到此错误,请删除

setPersist(true);

来自调度程序