web-dev-qa-db-ja.com

Android JobScheduler-永続的なジョブを作成できません

Android Lollipopに付属している新しいJoScheduler APIを試しています。これまでのところ、問題なくネットワーク要件がなく、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が権限を見つけられない理由であるのかどうか疑問に思っています。

17
Richard Lewin

私は同じ問題を抱えていましたが、起動権限を追加した後、アプリが再インストールしていないことに気付きました。そのため、アプリはインストール時に必要な権限をリクエストする機会がありませんでした。

アプリをアンインストールして再インストールすると機能します。

注:私の理解では、アプリはインストール時に許可を得る必要があります。ただし、ここで修正する必要があります。

27

43matthewが言ったように、それはおそらくJobSchedulerキャッシュが原因です。

デバイスの再起動後に解決されます。

PS:XMLで次の権限があることを確認してください。

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

JobSchedulerがこの権限を保持するuidのキャッシュを保持しているようです: 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
43matthew

同じ問題がありましたが、インテントサービスを開始していることが問題だと思います。 BIND_JOB権限をインテントサービスにも追加する必要があります。

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