2015-04-15 29 views
14

Próbuję nowego interfejsu API JoScheduler, który jest dostarczany z Androidem Lollipop. Do tej pory udało mi się pomyślnie utworzyć i uruchomić zadanie z opóźnieniem 6000 milisekund bez wymagań sieciowych bez problemu.Android JobScheduler - nie można utworzyć trwałej pracy

Jednak próbowałem utrzymać tę samą pracę za pomocą funkcji setPersisted (true). Zaraz po wywołaniu funkcji budowania zadań (job build) nie powiedzie się, że potrzebuję uprawnienia RECEIVED_BOOT_COMPLETED w pliku manifestu.

Ale dodałem gość:

<?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" /> 

Mam nawet dodawali następujący kod zanim zadanie zostanie dodane do sprawdzenia, czy aplikacja ma uprawnienia Zarejestrowano

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

Jednak, gdy Zadanie jest zbudowane Otrzymuję następujący błąd:

java.lang.IllegalArgumentException: Error: requested job be persisted without holding RECEIVE_BOOT_COMPLETED permission. 

Mój kod do tworzenia i dodawania t że praca z 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()); 

Moja JobService manifest deklaracja:

<service 
     android:name=".service.MyJobService" 
     android:permission="android.permission.BIND_JOB_SERVICE" 
     android:exported="true" > 
    </service> 

Więc zastanawiam się czy ja robię coś innego złego, że ktoś może zauważyć. Jedyną rzeczą, na którą zwrócę uwagę, jest to, że robi się różnicę, że kod jest uruchamiany w IntentService, więc zastanawiam się, czy to może być powód, dla którego JobScheduler nie może znaleźć pozwolenia.

Odpowiedz

15

Miałem ten sam problem, ale potem zdałem sobie sprawę, że nie mam ponownie zainstalowanej mojej aplikacji po dodaniu uprawnienia do rozruchu. Dzięki temu aplikacja nigdy nie uzyskała pozwolenia na zainstalowanie.

Po odinstalowaniu i ponownym zainstalowaniu aplikacji działa.

Uwaga: rozumiem, że aplikacje muszą uzyskać zezwolenie podczas instalacji. Jednak mogę tu sprostować.

8

Tak jak 43matthew powiedział, Prawdopodobnie jest to spowodowane przez bufor pamięci JobScheduler.

Został rozwiązany po ponownym uruchomieniu urządzenia.

PS: Upewnij się, że masz następujące uprawnienia w swoim XML.

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

Jak zauważył @RajiithAttapattu trzeba ponownie zainstalować aplikację –

+0

Reboot rozwiązać ten problem dla mnie. Nie musisz ponownie instalować aplikacji. – Stanislav

0

Zauważyłem, że jeśli harmonogram pracy jest ustawiony utrzymują to może wpaść tego błędu, należy usunąć

setPersist(true); 

od planującego

0

miałem ten sam problem, myślę, że problem jest że rozpoczynasz intencyjną usługę. Musisz również dodać uprawnienia BIND_JOB do swojej usługi intencji.

<service 
     android:name=".your.intent.service" 
     android:enabled="true" 
     android:exported="false" 
     android:permission="android.permission.BIND_JOB_SERVICE"/> 
Powiązane problemy