Android JobScheduler – не удается создать постоянную работу

Я пробую новый API JoScheduler, который поставляется с Android Lollipop. До сих пор мне удавалось успешно создавать и запускать задание с задержкой в ​​6000 миллисекунд без каких-либо требований к сети без проблем.

Однако я только что попытался сохранить ту же работу с помощью функции setPersisted(true). Как только вызывается функция job build(), теперь она не сообщает, что мне нужно разрешение 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 не может найти разрешение.


person Richard Lewin    schedule 15.04.2015    source источник


Ответы (5)


У меня была та же проблема, но потом я понял, что не переустанавливал свое приложение после добавления разрешения на загрузку. Таким образом, у приложения никогда не было возможности запросить необходимое разрешение при установке.

После удаления и переустановки приложение работает.

Примечание. Насколько я понимаю, приложения должны получать разрешение во время установки. Однако тут меня поправят.

person Rajith Attapattu    schedule 10.11.2015

Как сказал 43matthew, это, вероятно, вызвано кешем JobScheduler.

Решается после перезагрузки устройства.

PS: Убедитесь, что у вас есть следующие разрешения в вашем XML.

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
person Cody    schedule 02.03.2016
comment
Как отметил @RajiithAttapattu, вам необходимо переустановить приложение. - person Felice Pollano; 13.11.2016
comment
Перезагрузка решила проблему для меня. Нет необходимости переустанавливать приложение. - person Stanislav; 24.05.2017

Похоже, что 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 не обновил свой кеш?

person 43matthew    schedule 19.07.2015

У меня была та же проблема, я думаю, ваша проблема в том, что вы запускаете службу намерений. Вам также необходимо добавить разрешение BIND_JOB в службу намерений.

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

Я заметил, что если планировщик заданий настроен на сохранение, вы можете столкнуться с этой ошибкой, удалите

setPersist(true);

из планировщика

person blackHawk    schedule 03.07.2017