2010-08-24 48 views
5

我有一個廣播接收器設置,以便在每次升級我的應用程序後,或者如果這是首次安裝該包時彈出消息顯示給用戶。我在我的運行Android 2.2的Droid上測試了這一點,既作爲全新安裝,也作爲升級我的應用程序之後,以及運行1.5和1.6的模擬器,並且我看到一切正常運行。安卓廣播接收器錯誤:類未找到異常

不過,我收到一個列出以下異常的用戶的錯誤報告:

java.lang.RuntimeException: Unable to instantiate receiver 
com.name.pkg.FirstRunBroadcastReceiver: java.lang.ClassNotFoundException: com.name.pkg.app_name.FirstRunBroadcastReceiver in loader dalvik.system.PathClassLoader[/data/app/com.name.pkg.app_name.apk] 
at android.app.ActivityThread.handleReceiver(ActivityThread.java:2789) 
at android.app.ActivityThread.access$3200(ActivityThread.java:125) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2083) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:123) 
at android.app.ActivityThread.main(ActivityThread.java:4627) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:521) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.ClassNotFoundException: com.name.pkg.app_name.FirstRunBroadcastReceiver in loader dalvik.system.PathClassLoader[/data/app/com.name.pkg.app_name.apk] 
at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:243) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:573) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:532) 
at android.app.ActivityThread.handleReceiver(ActivityThread.java:2780) 
... 10 more 

誰能告訴我爲什麼我的用戶之一收到此異常?

在我的清單文件,我有事情設置是這樣的:

<receiver android:name=".FirstRunBroadcastReceiver"> 
    <intent-filter> 
     <action android:name="android.intent.action.PACKAGE_REPLACE"/> 
     <data android:scheme="package" android:path="com.name.pkg.app_name"> 
    </intent-filter> 
</receiver> 

類FirstRunBroadcastReceiver是設置這樣的:

package com.name.pkg.app_name; 

public class FirstRunBroadcastReceiver extends BroadcastReceiver 
{ 
    @Override 
    public void onReceive(Contenxt context, Intent intent) 
    { 
     Uri uri = intent.getData(); 
     if(uri.toString().compareTo("package:com.name.pkg.app_name") == 0) 
     { 
      //set shared prefs data to determine if start-up message should be shown 
     } 
    } 
} 

在第一次安裝,用於共享的缺省值prefs被設置爲彈出消息將被顯示,但我不認爲這與這個異常有什麼關係。

我再次測試它,並且我沒有收到異常。感謝您的任何幫助,您可以提供。

+0

這是這個用戶的持續的事情嗎?還是隻發生過一次? – Falmarri 2010-08-24 17:49:35

+0

嗨Falmarri,不幸的是,我不知道這是否是一個連續的例外。我通過Android Market獲得了報告。無論誰遇到這個錯誤,都不會給我發電子郵件,這本來不錯。所以我只是不知道。在我的市場帳戶中只有一個錯誤報告,但這並不一定意味着什麼。 – Michael 2010-08-24 19:58:29

+0

你解決了這個問題嗎? - 發表一個答案。 – levi 2014-08-07 01:41:25

回答

0

您的FirstRunBroadcastReceiver類中的包裝聲明如下?

package com.name.pkg.app_name; 

根據你的異常棧應該是這樣的。

+0

嗨radek-k,是的,我的包聲明在FirstRunBroadcastReceiver中。這是源文件中的第一行。我會更新我的原始文章並添加此內容。 – Michael 2010-08-24 19:59:57

+0

我的問題是:包聲明和我上面寫的完全一樣嗎? – plugmind 2010-08-24 20:16:32

+0

正如你寫的那樣?如果你正在談論應用程序的實際名稱,那麼顯然應用程序名稱不稱爲「app_name」,除此之外,我編輯我的帖子以準確顯示源代碼的內容。 – Michael 2010-08-24 21:21:00

3

從android的文檔「機器人:出口」的一個接收器屬性:

無論廣播接收器可以接收來自應用外源的消息 - 如果它能夠「真」和「假」,如果不。如果是「假」,則廣播接收機可以接收的唯一消息是那些由具有相同用戶ID的相同應用程序或應用程序的組件發送的消息。 默認值取決於廣播接收器是否包含意圖過濾器。沒有任何過濾器意味着它只能由指定其確切類名的Intent對象調用。這意味着接收者僅用於應用程序內部使用(因爲其他人通常不會知道類名)。所以在這種情況下,默認值是「false」。另一方面,至少一個過濾器的存在意味着廣播接收機意在接收由系統或其他應用廣播的意圖,所以默認值爲「真」

由於您的接收機具有子意圖,所以默認值值爲android:exported爲真。只需明確說明並且它應該正常工作。

<receiver android:name=".FirstRunBroadcastReceiver" android:exported="true"> 
<intent-filter> 
    <action android:name="android.intent.action.PACKAGE_REPLACE"/> 
    <data android:scheme="package" android:path="com.name.pkg.app_name"> 
</intent-filter> 

0

我與Android開發新手,我的解決方案是一個簡單的引起了我的愚蠢。我重命名了我的broadcastreceiver文件,當我嘗試運行該應用程序時,收到了classdefnotfound錯誤。我最終清理並重建了該項目,並刪除了錯誤。