19

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 がアクセス許可を見つけられない理由であるかどうか疑問に思っています。

4

5 に答える 5

28

同じ問題がありましたが、起動許可を追加した後にアプリを再インストールしていないことに気付きました。そのため、アプリがインストールされたときに、必要な許可を要求する機会がありませんでした。

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

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

于 2015-11-10T18:14:12.990 に答える
18

43matthewさんのおっしゃる通り、JobSchedulerのキャッシュが原因と思われます。

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

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

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
于 2016-03-02T08:44:52.880 に答える
5

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 がキャッシュを更新していませんか?

于 2015-07-19T03:19:00.200 に答える
-4

ジョブ スケジューラが持続するように設定されている場合、このエラーが発生する可能性があることに気付きました。

setPersist(true);

スケジューラから

于 2017-07-03T09:01:05.160 に答える