簡體   English   中英

無法獲取提供程序:ClassNotFoundException

[英]Unable to get provider : ClassNotFoundException

我在我的應用程序中有MyContentProvider ,當我在調試模式下開發和運行時它工作正常。

<provider android:name=".MyContentProvider"
        android:authorities="com.contactcities"
        android:exported="false">
</provider>

但是當我導出應用程序,下載並運行它時,它會立即崩潰:

10-10 18:24:37.682 E/AndroidRuntime(10428): FATAL EXCEPTION: main
10-10 18:24:37.682 E/AndroidRuntime(10428): java.lang.RuntimeException: Unable to get provider com.contactcities.MyContentProvider: java.lang.ClassNotFoundException: com.contactcities.MyContentProvider in loader dalvik.system.PathClassLoader[/system/framework/com.google.android.maps.jar:/data/app/com.contactcities-1.apk]
10-10 18:24:37.682 E/AndroidRuntime(10428): at android.app.ActivityThread.installProvider(ActivityThread.java:4509)
10-10 18:24:37.682 E/AndroidRuntime(10428): at android.app.ActivityThread.installContentProviders(ActivityThread.java:4281)
10-10 18:24:37.682 E/AndroidRuntime(10428): at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4237)
10-10 18:24:37.682 E/AndroidRuntime(10428): at android.app.ActivityThread.access$3000(ActivityThread.java:125)
10-10 18:24:37.682 E/AndroidRuntime(10428): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2071)
10-10 18:24:37.682 E/AndroidRuntime(10428): at android.os.Handler.dispatchMessage(Handler.java:99)
10-10 18:24:37.682 E/AndroidRuntime(10428): at android.os.Looper.loop(Looper.java:123)

我可以在我的所有設備上重現它,2.2,4.0,4.1

我今天已閱讀了很多主題。 其中一些人指責ProGuard。 我試過添加

-keep public class com.contactcities.MyContentProvider

但沒有運氣。

當我禁用proguard時,不要在我的project.properties放入proguard.config=proguard.cfg 它仍然在發布版本中提供相同的錯誤。 調試再次沒問題。 也許這還不足以像那樣禁用proguard?

也許提示是它在這次崩潰中引用了maps.jar。 我不知道為什么會那樣做

in loader dalvik.system.PathClassLoader[/system/framework/com.google.android.maps.jar

任何線索將非常感激

唉,以為我試過了,但好像我沒有。

Project - > clean使它工作

面掌

我得到了同樣的錯誤,結果我在AndroidManifest.xml中為我的提供者標簽設置了錯誤的android:name屬性值:

<provider
    android:authorities="com.example.ProviderClass"
    android:name=".ProviderClass"
    android:exported="false" >
</provider>

所以仔細檢查這個值是否如上所述.ProviderClass或你的類名是什么(以點為前綴)。 然后做Project> Clean,它會起作用。

authority屬性需要匹配內容權限,而name屬性需要與Custom Provider類的類名匹配。

例如:

      <provider
         android:authorities="com.richa.myapp"
         android:name=".data.CustomProvider"/>

也許我的經驗不足會幫助其他人解決這個問題。 這對我來說是完全神秘的,但是就像你知道的那樣,計算機中的一切都很明顯。

我正在學習本教程,總體來說非常好: http//www.vogella.com/tutorials/AndroidSQLite/article.html

早期,他說要創建一個名為“contentprovider”的包,然后創建一個名為“MyTodoContentProvider”的類。 現在任何熟悉Java風格命名約定的人都會看到這應該是相對於主包的。 但我對這一切都很陌生,所以我在某處創造了它。

通過構建代碼,一切正常。 Eclipse找到並包含此包,並且沒有顯示任何錯誤。 然后崩潰和神秘的“無法獲取提供者”消息。 錯誤消息中的路徑,我現在理解的是代碼正在尋找類的不存在的路徑,是如此之長並且包含了很多“contentprovider”的迭代,很難看出它所指的是什么或者是什么這是錯的。

我懷疑問題出在清單文件中,但我確信它是在“android:authority”中。 這有點不直觀。 清單中此元素中的字符串對應於您在提供程序類中公開的公共成員。 該成員名為“CONTENT_URI”。 但兩者並不完全匹配。 例如:

private static final String AUTHORITY = "com.vegnab.provider";
private static final String BASE_PATH = "todos";
public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/" + BASE_PATH);

最終得到:

CONTENT_URI = "content://com.vegnab.provider/todos"

(請注意,AUTHORITY本身是私有成員,不是外部可用的。)

相應的清單行將是:

android:authorities="com.vegnab.provider"

這是方案“content://”和基本路徑之間的中間部分。

問題實際上在清單行中:

android:name=".contentprovider.MyTodoContentProvider"

我在一個名為“contentprovider”的包中有一個名為“MyTodoContentProvider”的無錯誤類,那么問題是什么? 問題是包裹在錯誤的地方。 它應該是相對於主要包裹。 這就是名字中首先出現的點。 它應該遵循與活動的“android:name”行相同的語法,在清單的各個部分中。

如果您覺得這很有用,請一次性。 一旦你解決了這個問題,就很容易忘記它是多么神秘。

在Android 5.0(API級別21)用ART取代DEX運行時之前,您可能已經通過了舊版操作系統版本的類限制。 如果您處於限制的邊緣,則可以通過編譯,但在啟動期間會出現此錯誤。

嘗試啟用multi-dex,如Android 啟用Multidex for Apps with Over 64K Methods文檔中所述。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM