2015-04-15 13 views
14

मैं एंड्रॉइड लॉलीपॉप के साथ आने वाले नए जोसेड्यूलर एपीआई को आजमा रहा हूं। मैंने अभी तक 6000 मिलीसेकंड की देरी के साथ सफलतापूर्वक निर्माण और नौकरी चलाने में कामयाब रहा है, बिना किसी समस्या के नेटवर्क आवश्यकताएं।एंड्रॉइड जॉबशेड्यूलर - एक सतत नौकरी नहीं बना सकता

हालांकि, मैंने सेटपर्सिड (सत्य) फ़ंक्शन का उपयोग करके एक ही नौकरी को जारी रखने की कोशिश की है। जैसे ही जॉब बिल्ड() फ़ंक्शन को कॉल किया जाता है, अब यह कहने में विफल रहता है कि मुझे मेनिफेस्ट फ़ाइल में 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> 

अगर मैं कुछ और गलत है कि किसी को देखा जा सकता है कर रहा हूँ तो मैं सोच रहा हूँ। केवल एक चीज जिसे मैं ध्यान में रखूंगा, इससे कोई फर्क पड़ता है कि कोड एक इंटेंट सेवा में चलाया जाता है, इसलिए मुझे आश्चर्य है कि यह एक कारण हो सकता है कि जॉबशेड्यूलर को अनुमति क्यों नहीं मिल रही है।

उत्तर

2

ऐसा लगता है कि JobScheduler तरह UIDs है कि इस अनुमति है की एक कैश रखता है: 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 अपने कैश अद्यतन नहीं किया?

15

मुझे एक ही समस्या थी, लेकिन फिर मुझे एहसास हुआ कि मुझे बूट अनुमति जोड़ने के बाद मेरे ऐप को पुनः स्थापित नहीं किया गया था। तो ऐप को स्थापित होने पर आवश्यक अनुमति का अनुरोध करने का अवसर कभी नहीं मिला।

एक बार जब मैं ऐप को अनइंस्टॉल और पुनः स्थापित करता हूं तो यह काम करता है।

नोट: मेरी समझ यह है कि ऐप्स को इंस्टॉल समय पर उनकी अनुमति प्राप्त करने की आवश्यकता है। हालांकि मैं यहां सुधारने के लिए खड़ा हूं।

8

बस 43matthew ने कहा, यह शायद जॉबशेड्यूलर कैश के कारण होता है।

डिवाइस रीबूट के बाद इसे हल किया गया है।

पीएस: सुनिश्चित करें कि आपके पास अपने एक्सएमएल में निम्नलिखित अनुमति है।

<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"/> 
संबंधित मुद्दे