Android JobScheduler - 无法创建持久作业

Ric*_*win 17 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" />
Run Code Online (Sandbox Code Playgroud)

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

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

但是,当作业生成时,我收到以下错误:

java.lang.IllegalArgumentException: Error: requested job be persisted without holding RECEIVE_BOOT_COMPLETED permission.
Run Code Online (Sandbox Code Playgroud)

我的代码创建并将作业添加到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());
Run Code Online (Sandbox Code Playgroud)

我的JobService清单声明:

<service
        android:name=".service.MyJobService"
        android:permission="android.permission.BIND_JOB_SERVICE"
        android:exported="true" >
    </service>
Run Code Online (Sandbox Code Playgroud)

所以我想知道我是否在做其他任何人都无法发现的错误.我唯一注意到它确实会产生影响的是,代码是在IntentService中运行的,所以我想知道这是否是JobScheduler无法找到权限的原因.

小智 27

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

卸载并重新安装应用程序后,它就可以运行了.

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


Cod*_*ody 15

正如43matthew所说,这可能是由JobScheduler缓存造成的.

它在设备重启后解决了.

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

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
Run Code Online (Sandbox Code Playgroud)


43m*_*hew 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 没有更新它的缓存?