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

你是否已在manifest.xml和android:exported =「true」中定義了具有相同權限的ContentProvider? –

+1

是的,內容提供者權限在androidmanifest和用法中都是相同的,內容uri在測試中正確解析。內容提供商僅限內部使用,因此我們的導出設置爲false。 –

+0

你如何定義你的ContentProvider? – rds

回答

3

當我在自定義Application對象中執行ContentResolver操作時,我有罕見的IllegalArgumentException與未知的URI問題。

例如,我試圖刪除應用程序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接收器類似的行爲。我有大約70個報告的崩潰,這個例外(大多數Infinix設備〜43%,幾乎沒有三星設備)每月約20萬活躍用戶。 IllegalArguementException Device Stats

我把它移到了後臺計劃的工作中,並沒有看到崩潰。我曾經只能在我使用過的Nexus設備上重現過這個問題,但從未再一次。

我猜想也許有時在某些設備上Application/BOOT_COMPLETE接收機的ContentProvider前初始化的Android的一些版本完全初始化的,因此當它試圖訪問它,它沒有正確設置呢。

有一對夫婦計算器職位,做國家的到底是什麼創造了第一,如何OS 應該的行爲:

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

你可以進入一些關於背景預定工作的更多細節嗎?此外,您是否碰巧看到這種情況發生在更主流的設備上(例如Motorola/Samsung /等)? –

+0

@DavidLiu我已經用更多的信息更新了答案 - 但是總的來說,我沒有真正在三星設備上看到它,但能夠在Nexus仿真器上獲得它。我還使用evernote作業調度程序在後臺處理它,但我認爲將它移動到任何後臺操作都將有所幫助,即IntentService或Service。 – riggaroo

+0

我在包括samsungs在內的一些設備上使用了此功能。在我的情況下,ContentProvider是在後臺線程中訪問的,但該線程可以很早啓動。我讀到了這個答案,並決定在該線程中延遲1秒的工作。但它運行不好,我仍然收到這些崩潰。我錯過了什麼嗎? – hqzxzwb

相關問題