2015-04-15 48 views
14

我正在嘗試Android Lollipop附帶的新JoScheduler API。到目前爲止,我已經成功地創建了一個延遲6000毫秒的作業,並且沒有網絡要求而沒有問題。Android JobScheduler - 無法創建持久作業

但是,我剛剛嘗試通過使用setPersisted(true)函數來堅持相同的工作。只要調用作業build()函數,它現在會失敗,說我需要Manifest文件中的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. 

我的代碼來創建和添加t他工作到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無法找到權限的原因。

回答

15

我有同樣的問題,但後來意識到我沒有重新安裝我的應用程序添加啓動權限後。所以應用程序從來沒有機會在安裝時請求所需的權限。

一旦我卸載並重新安裝了它的應用程序。

注意:我的理解是,應用程序需要在安裝時獲得他們的許可。不過,我要糾正這裏。

8

就像43matthew表示,這可能是由JobScheduler緩存引起的。

設備重啓後就解決了。 PS:請確保您在XML中擁有以下權限。

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

正如@RajiithAttapattu您需要重新安裝應用程序 –

+0

重啓注意解決這個問題對我來說。無需重新安裝應用程序。 – Stanislav

0

我注意到,如果作業調度器設置爲持續,那麼你可能會陷入這樣的錯誤,從調度器內刪除

setPersist(true); 

0

我有同樣的問題,我覺得你的問題是你正在開始一項意向服務。您還需要將BIND_JOB權限添加到您的意向服務。

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