我正在尝试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无法找到权限的原因。
答案 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);
来自调度程序