web-dev-qa-db-fra.com

Android JobScheduler - impossible de créer un travail persistant

J'essaie la nouvelle API JoScheduler fournie avec Android Lollipop. Jusqu'à présent, j'ai réussi à créer et à exécuter un travail avec un retard de 6000 millisecondes sans aucune exigence réseau sans problème.

Cependant, je viens d'essayer de conserver le même travail en utilisant la fonction setPersisted (true). Dès que la fonction job build () est appelée, elle échoue et indique que j'ai besoin de l'autorisation RECEIVED_BOOT_COMPLETED dans le fichier Manifest.

Mais j'ai ajouté la permission:

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

J'ai même ajouté le code suivant avant l'ajout du travail pour voir si l'application est dotée de l'autorisation enregistrée:

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

Cependant, lorsque le travail est créé, l'erreur suivante apparaît:

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

Mon code pour créer et ajouter le travail au 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());

Ma déclaration de manifeste JobService:

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

Je me demande donc si je fais quelque chose de mal que tout le monde peut remarquer. La seule chose que je noterai au cas où cela ferait une différence, c’est que le code est exécuté dans un service IntentService. Je me demande donc si cela pourrait être une raison pour laquelle JobScheduler ne peut pas trouver l’autorisation.

15
Richard Lewin

J'avais le même problème, mais j'ai alors réalisé que je n'avais pas réinstallé mon application après avoir ajouté l'autorisation de démarrage. Ainsi, l'application n'a jamais eu l'occasion de demander l'autorisation requise lors de son installation.

Une fois que je désinstalle et que je réinstalle l'application, cela fonctionne.

Remarque: D'après ce que j'ai compris, les applications doivent obtenir leur autorisation au moment de l'installation. Cependant, je risque d'être corrigé ici.

19
Rajith Attapattu

Tout comme 43matthew a dit, C'est probablement dû au cache de JobScheduler.

Il est résolu après le redémarrage de l'appareil.

PS: Assurez-vous que vous disposez des autorisations suivantes dans votre code XML.

<uses-permission Android:name="Android.permission.RECEIVE_BOOT_COMPLETED" />
14
Cody

Il semble que JobScheduler conserve un cache des ID utilisateur qui possèdent cette autorisation: http://grepcode.com/file/repository.grepcode.com/Java/ext/com.google.Android/android/ 5.0.0_r1/com/Android/server/job/JobSchedulerService.Java # 736

Peut-être avez-vous ajouté l'autorisation, mais le téléphone n'a pas redémarré et par conséquent, JobScheduler n'a pas mis à jour son cache?

4
43matthew

J'ai eu le même problème, je pense que votre problème est que vous démarrez un service d'intention. Vous devez également ajouter l'autorisation BIND_JOB à votre service d'intention.

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