5

शायद ही कभी हो रही: शायद ही कभी परछिटपुट IllegalArgumentException: अज्ञात URL सामग्री: //

Fatal Exception: java.lang.IllegalArgumentException: Unknown URL content://com.example.provider/info 
    at android.content.ContentResolver.insert(ContentResolver.java:1252) 

Fatal Exception: java.lang.IllegalArgumentException: Unknown authority com.example.provider 
    at android.content.ContentResolver.applyBatch(ContentResolver.java:1247) 

जोर। आम तौर पर बिना किसी मुद्दे के ठीक काम करते हैं, इसलिए अधिकारियों को ठीक से स्थापित किया जाता है, लेकिन यह बिना किसी कारण के हर बार एक बार दिखा रहा है। क्या ऐसे कारण हैं जिनसे ContentResolver कोई ContentProvider नहीं ढूंढ सकता है (यानी यदि अभी तक सेट नहीं किया गया है)?

+0

क्या आपने manifestSxml और android में उसी प्राधिकरण के साथ अपना ContentProvider परिभाषित किया है: exported = "true"? –

+1

हाँ, सामग्री प्रदाता प्राधिकरण एंड्रॉइडमैन और उपयोग दोनों में समान है, जो परीक्षण के तहत सही ढंग से हल करने वाली सामग्री यूरी द्वारा सिद्ध किया जाता है। सामग्री प्रदाता केवल एक आंतरिक उपयोग है, इसलिए हमारे निर्यात को गलत पर सेट किया गया है। –

+0

आप अपने ContentProvider को कैसे परिभाषित करते हैं? – rds

उत्तर

3

मेरे पास अज्ञात यूआरआई मुद्दे के साथ दुर्लभ IllegalArgumentException था जब मैं कस्टम Application ऑब्जेक्ट में ContentResolver संचालन कर रहा था।

उदाहरण के लिए, मैं आवेदन onCreate विधि में मेरी सामग्री प्रदाता से आइटम हटाना कोशिश कर रहा था जो होगा बहुत कभी कभी दुर्घटना:

public class CustomApplication extends Application { 

    @Override 
    public void onCreate() { 
     //.. 
     context.getContentResolver().delete(ReminderEntry.getContentURI(), null, null, null, null); 
     //.. 
    } 
} 

जो कभी कभी निम्न क्रैश प्रस्तुत करना होगा:

Fatal Exception: java.lang.RuntimeException: Unable to create application com.myapp.CustomApplication: java.lang.IllegalArgumentException: Unknown URL content://com.myapp.db.CustomContentProvider/reminder 
    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6431) 
    at android.app.ActivityThread.access$1800(ActivityThread.java:229) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1887) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:148) 
    at android.app.ActivityThread.main(ActivityThread.java:7331) 
    at java.lang.reflect.Method.invoke(Method.java) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 
Caused by java.lang.IllegalArgumentException: Unknown URL content://com.myapp.db.CustomContentProvider/reminder 
     at android.content.ContentResolver.delete(ContentResolver.java:1376) 
     at com.myapp.ReminderEntryDao.delete(Unknown Source) 
     at com.myapp.CustomApplication.onCreate(Unknown Source) 
     at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1037) 
     at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6428) 
     at android.app.ActivityThread.access$1800(ActivityThread.java:229) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1887) 
     at android.os.Handler.dispatchMessage(Handler.java:102) 
     at android.os.Looper.loop(Looper.java:148) 
     at android.app.ActivityThread.main(ActivityThread.java:7331) 
     at java.lang.reflect.Method.invoke(Method.java) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 

मैंने BOOT_COMPLETE रिसीवर के साथ समान व्यवहार भी देखा। मेरे पास लगभग 200 000 मासिक सक्रिय उपयोगकर्ताओं के इस अपवाद (ज्यादातर इन्फिनिक्स डिवाइस ~ 43%, शायद ही कोई सैमसंग डिवाइस) के साथ लगभग 70 रिपोर्ट दुर्घटनाएं हुईं। IllegalArguementException Device Stats

मैंने इसे पृष्ठभूमि निर्धारित नौकरी में स्थानांतरित कर दिया और तब से दुर्घटना नहीं देखी है। मैं कभी भी एक नेक्सस डिवाइस पर एक बार इस मुद्दे को पुन: उत्पन्न करने में सक्षम था जिसे मैंने उपयोग किया लेकिन कभी नहीं।

मैं शायद संदेह कभी कभी कुछ उपकरणोंApplication/BOOT_COMPLETE रिसीवर ContentProvider से पहले initializes पर Android के कुछ संस्करणों पर पूरी तरह से आरंभ और इसलिए जब यह तक पहुँचने के लिए कोशिश करता है, यह ठीक से अभी तक सेट नहीं किया गया है।

stackoverflow पदों है कि राज्य कर के एक जोड़े वास्तव में क्या पहले बनाई गई है कर रहे हैं और कैसे ओएस चाहिए व्यवहार:

Is the Application class guaranteed to be instantiated before a defined boot receiver is called

लेकिन जैसे मैंने कहा, मैं नहीं तो और आगे बढ़ संचालन देखा है पृष्ठभूमि शेड्यूलर में कक्षाओं में से समस्या को ठीक करने लगता है (शायद यह इसलिए है क्योंकि सेटअप करने में थोड़ा समय लगता है)। उम्मीद है कि मेरा अनुभव आपकी मदद करेगा।

संपादित करें: मैंने evernote job dispatcher का उपयोग किया और यदि आवश्यक हो तो मेरे ContentResolver संचालन को कार्य में स्थगित कर दिया। (लेकिन मुझे लगता है कि किसी भी प्रकार की पृष्ठभूमि प्रसंस्करण के लिए सामग्री प्रदाता ऑपरेशन को परिभाषित करने से यह ठीक हो सकता है क्योंकि सेटअप करने के लिए थोड़ा और समय था - ये केवल मेरे संदेह हैं)।

class DeleteRemindersJob extends Job { 
    @NonNull 
    @Override 
    protected Result onRunJob(final Params params) { 
     cursor = getContext().getContentResolver().delete(ReminderEntry.getContentURI(), null, null, null, null); 
     //.. 
     return Result.SUCCESS; 
    } 
} 
+0

क्या आप पृष्ठभूमि निर्धारित नौकरी के बारे में कुछ और जानकारी में जा सकते हैं? साथ ही, क्या आप यह देखने के लिए अधिक मुख्यधारा के उपकरणों (यानी मोटोरोला/सैमसंग/आदि) पर होते हैं? –

+0

@ डेविड लियू मैंने अधिक जानकारी के साथ उत्तर अपडेट किया है - लेकिन संक्षेप में, मैंने इसे सैमसंग डिवाइस पर वास्तव में नहीं देखा था, लेकिन इसे एक बार नेक्सस एमुलेटर पर प्राप्त करने में सक्षम था। मैंने पृष्ठभूमि में इसे संसाधित करने के लिए ईवर्नोट जॉब डिस्पैचर का भी उपयोग किया लेकिन मुझे लगता है कि इसे किसी भी पृष्ठभूमि ऑपरेशन में ले जाने से मदद मिलेगी, यानी एक इरादा सेवा या सेवा। – riggaroo

+0

मुझे सैमसंग सहित कुछ उपकरणों पर यह मिला। मेरे मामले में, ContentProvider पृष्ठभूमि थ्रेड में उपयोग किया जाता है, लेकिन धागा बहुत जल्दी शुरू किया जा सकता है। मैंने इस जवाब के बारे में पढ़ा और 1 थ्रेड के लिए उस थ्रेड में नौकरियों में देरी करने का फैसला किया। लेकिन यह अच्छी तरह से काम नहीं किया और मैं अभी भी इन दुर्घटनाओं को प्राप्त कर रहा हूं। क्या मैं कुछ भूल रहा हूँ? – hqzxzwb