2015-04-15 7 views
14

Ich probiere die neue JoScheduler API aus, die mit Android Lollipop geliefert wurde. Ich habe es bisher geschafft, erfolgreich einen Job zu erstellen und auszuführen, mit einer Verzögerung von 6000 Millisekunden ohne Netzwerkanforderungen ohne ein Problem.Android JobScheduler - kann keinen dauerhaften Job erstellen

Allerdings habe ich gerade versucht, den gleichen Job über die setPersisted (True) -Funktion zu bestehen. Sobald die Job build() - Funktion aufgerufen wird, schlägt es fehl, dass ich die RECEIVED_BOOT_COMPLETED-Berechtigung in der Manifest-Datei benötige.

Aber ich habe die Erlaubnis hinzugefügt:

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

Ich habe sogar hinzugefügt, um den folgenden Code vor der Arbeit zu sehen, wird hinzugefügt, wenn die App die Berechtigung hat, registriert:

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

Wenn jedoch der Job ist gebaut Ich erhalte folgende Fehlermeldung:

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

Mein Code zum Erstellen und Hinzufügen von t er Auftrag an den 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()); 

Mein Jobservice Manifest Erklärung:

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

Also ich frage mich, wenn ich etwas anderes falsch tue, dass jemand erkennen. Das einzige, was ich bemerken werde, wenn es einen Unterschied macht, ist, dass der Code in einem IntentService ausgeführt wird, also frage ich mich, ob dies ein Grund sein könnte, warum der JobScheduler die Erlaubnis nicht finden kann.

Antwort

15

Ich hatte das gleiche Problem, aber dann erkannte ich, dass ich nicht meine App nach dem Hinzufügen der Boot-Berechtigung neu installiert hatte. Die App hat also nie die Gelegenheit erhalten, die erforderliche Berechtigung bei der Installation anzufordern.

Sobald ich die App deinstalliert und neu installiert, funktioniert es.

Hinweis: Nach meinem Verständnis müssen Apps zur Installationszeit ihre Berechtigung erhalten. Allerdings stehe ich hier zur Korrektur.

8

Genau wie 43matthew sagte, es ist wahrscheinlich durch JobScheduler-Cache verursacht.

Es ist nach dem Neustart des Geräts gelöst.

PS: Stellen Sie sicher, dass Sie die folgende Berechtigung in Ihrem XML haben.

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

Wie von @RajiithAttapattu Sie die App –

+0

Reboot neu installieren müssen, das Problem für mich gelöst. Keine Notwendigkeit, die App neu zu installieren. – Stanislav

0

Ich habe bemerkt, dass, wenn Job-Scheduler gesetzt ist, dann bestehen bleiben Sie in diesen Fehler fallen, entfernen

setPersist(true); 

von Scheduler

0

ich hatte das gleiche Problem, ich denke, das Problem ist dass Sie einen Vorsatzdienst starten. Sie müssen Ihrem Intent-Service auch die BIND_JOB-Berechtigung hinzufügen.

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