2010-08-24 4 views
5

У меня есть настройка приемника Broadcast, чтобы после каждого обновления моего приложения отображалось всплывающее сообщение, или если это первый раз, когда пакет установлен. Я тестировал это на своем Droid под управлением Android 2.2 как в новой версии, так и после обновления моего приложения, а также в эмуляторе с 1.5 и 1.6, и я вижу, что все работает нормально.Ошибка приемника Android Broadcast: исключение класса не найдено

Однако, я получил сообщение об ошибке от пользователя, в котором перечислены следующие исключения:

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

+0

Привет, Фалмарри, к сожалению, я понятия не имею, если это непрерывное исключение или нет. Я получил отчет через Android Market. Кто бы ни столкнулся с этой ошибкой, не отправил мне электронное письмо, которое было бы неплохо. Поэтому я просто не знаю. В моей учетной записи Market есть только один отчет об ошибке, но это не обязательно означает ничего. – Michael

+0

Вы решили это? - Отправьте ответ. – levi

ответ

0

Является ли объявление пакета в вашем классе FirstRunBroadcastReceiver следующим образом?

package com.name.pkg.app_name; 

Согласно вашему стеку исключений, это должно быть так.

+0

Привет, radek-k, да, моя декларация пакета в FirstRunBroadcastReceiver. Это первая строка в исходном файле. Я обновлю свое оригинальное сообщение и добавлю это. – Michael

+0

Мой вопрос: было ли объявление пакета точно таким же, как я писал выше? – plugmind

+0

Точно как вы написали? Если вы говорите о фактическом имени приложения, то, очевидно, имя приложения не называется «имя_пользователя» и, кроме этого, я редактировал сообщение, чтобы точно показать, что говорит исходный код. – Michael

3

от андроида документации на «андроиде: экспортироваться» атрибут для приемника:

ли не радиовещательный приемник может принимать сообщения от источников за пределами его применения - «истина», если он может, и «ложь», если не. Если «false», единственными сообщениями, которые может принимать широковещательный приемник, являются те, которые отправляются компонентами одного и того же приложения или приложений с одинаковым идентификатором пользователя. Значение по умолчанию зависит от того, содержит ли широковещательный приемник фильтры намерений. Отсутствие каких-либо фильтров означает, что он может быть вызван только объектами Intent, которые определяют его точное имя класса. Это означает, что приемник предназначен только для внутреннего использования приложения (так как другие обычно не знают имя класса). Поэтому в этом случае значением по умолчанию является «false». С другой стороны, наличие, по меньшей мере, одного фильтра подразумевает, что широковещательный приемник предназначен для приема сигналов, передаваемых системой или другими приложениями, поэтому значение по умолчанию равно «true»

Поскольку у вашего приемника есть дочерние объекты по умолчанию значение для 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

Я новичок с андроида развития и мое решение было простым причиной моей глупостью. Я переименовал свой файл broadcastreceiver, и когда я попытался запустить приложение, я получил ошибку classdefnotfound. Я закончил уборку и восстановление проекта, и ошибка была удалена.

Смежные вопросы