19

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

但是,我刚刚尝试通过使用 setPersisted(true) 函数来坚持相同的工作。一旦调用了作业 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 找不到权限的原因。

4

5 回答 5

28

我有同样的问题,但后来意识到我在添加启动权限后没有重新安装我的应用程序。因此,该应用程序在安装时从未有机会请求所需的权限。

一旦我卸载并重新安装该应用程序,它就可以工作。

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

于 2015-11-10T18:14:12.990 回答
18

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

设备重启后即可解决。

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

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
于 2016-03-02T08:44:52.880 回答
5

看起来 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 没有更新其缓存?

于 2015-07-19T03:19:00.200 回答
2

我遇到了同样的问题,我认为您的问题是您正在启动意图服务。您还需要将 BIND_JOB 权限添加到您的意图服务。

    <service
        android:name=".your.intent.service"
        android:enabled="true"
        android:exported="false"
        android:permission="android.permission.BIND_JOB_SERVICE"/>
于 2017-10-30T20:07:53.937 回答
-4

我注意到如果作业调度程序设置为持续存在,那么您可能会遇到此错误,请删除

setPersist(true);

从调度程序

于 2017-07-03T09:01:05.160 回答