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

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

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

Solutions Collecting From Web of "Android JobScheduler – не может создать постоянную работу"

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

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

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

Так же, как сказал 43-х человек , это, вероятно, вызвано кэшем JobScheduler.

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

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

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

Похоже, что JobScheduler хранит кэш uids, которые поддерживают это разрешение: 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 не обновил свой кеш?

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

 setPersist(true); 

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