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 не может найти разрешение.
Ответы
Ответ 1
У меня была такая же проблема, но потом я понял, что после добавления разрешения на загрузку у меня не было переустановлено. Таким образом, приложение никогда не получало возможность запросить требуемое разрешение, когда оно было установлено.
Как только я удалю и заново установлю приложение, он работает.
Примечание. Я понимаю, что приложения должны получить свое разрешение во время установки. Однако я буду исправлен здесь.
Ответ 2
Так же, как 43matthew, это, вероятно, вызвано кэшем JobScheduler.
Он решается после перезагрузки устройства.
PS: Убедитесь, что у вас есть следующие разрешения в вашем XML.
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
Ответ 3
Похоже, что 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 не обновил кеш?
Ответ 4
Я заметил, что если планировщик заданий настроен на сохранение, вы можете попасть в эту ошибку, удалите
setPersist(true);
из планировщика
Ответ 5
У меня была такая же проблема, я думаю, ваша проблема в том, что вы начинаете услугу намерения. Вам также нужно добавить разрешение BIND_JOB к вашему сервису намерения.
<service
android:name=".your.intent.service"
android:enabled="true"
android:exported="false"
android:permission="android.permission.BIND_JOB_SERVICE"/>