2010-08-24 10 views
5

Tengo una configuración de receptor de difusión para que se muestre un mensaje emergente al usuario después de cada actualización de mi aplicación, o si esta es la primera vez que se instala el paquete. Probé esto en mi Droid con Android 2.2 como una instalación nueva y luego de actualizar mi aplicación, así como en el emulador con 1.5 y 1.6, y veo que todo funciona bien.Android Broadcast Receiver Error: Clase no encontrada excepción

Sin embargo, he recibido un informe de error de un usuario que enumera la siguiente excepción:

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 

Puede alguien decirme por qué uno de mis usuarios recibieron esta excepción?

En mi archivo de manifiesto, tengo cosas configuración como esta:

<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> 

El FirstRunBroadcastReceiver clase se configura como esto:

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 
     } 
    } 
} 

Tras un primer momento de la instalación, el valor por defecto para el compartida Preferencias está configurado para que se muestre el mensaje emergente, pero no creo que tenga nada que ver con esta excepción.

Lo probé de nuevo y no recibo ninguna excepción. Gracias por cualquier ayuda que usted nos pueda proporcionar.

+0

¿Es esto algo continuo para este usuario? ¿O simplemente sucedió una vez? – Falmarri

+0

Hola, Falmarri, desafortunadamente no tengo idea de si esto es una excepción continua o no. Recibí el informe a través del Android Market. Quien encontró este error no me envió un correo electrónico, lo que hubiera sido agradable. Entonces, simplemente no lo sé. Solo hay un informe de error para esto en mi cuenta de Market, pero eso no significa necesariamente nada. – Michael

+0

¿Has resuelto esto? - Publica una respuesta. – levi

Respuesta

0

¿Es la declaración del paquete en su clase FirstRunBroadcastReceiver de la siguiente manera?

package com.name.pkg.app_name; 

Según su pila de excepción, debería ser así.

+0

Hola radek-k, sí, mi declaración del paquete está en FirstRunBroadcastReceiver. Es la primera línea en el archivo fuente. Actualizaré mi publicación original y agregaré esto. – Michael

+0

Mi pregunta era: ¿la declaración del paquete es exactamente la misma que escribí anteriormente? – plugmind

+0

Exactamente como usted escribió? Si está hablando del nombre real de la aplicación, obviamente el nombre de la aplicación no se llama "nombre_aplicación" y, aparte de eso, edité mi publicación para mostrar exactamente lo que dice el código fuente. – Michael

3

de la documentación de Android en "android: exportado" atributo para un receptor:

Sea o no el receptor de radiodifusión pueda recibir mensajes desde fuentes externas a su aplicación - "verdadero" si se puede, y "falso" si no. Si es "falso", los únicos mensajes que el receptor de difusión puede recibir son aquellos enviados por componentes de la misma aplicación o aplicaciones con el mismo ID de usuario. El valor predeterminado depende de si el receptor de difusión contiene filtros de intención. La ausencia de filtros significa que solo puede invocarse mediante objetos de Intento que especifiquen su nombre de clase exacto. Esto implica que el receptor está destinado solo para el uso interno de la aplicación (ya que otros normalmente no conocerían el nombre de la clase). Entonces, en este caso, el valor predeterminado es "falso". Por otro lado, la presencia de al menos un filtro implica que el receptor de difusión está destinado a recibir intenciones transmitidas por el sistema u otras aplicaciones, por lo que el valor predeterminado es "verdadero"

Dado que su receptor tiene intenciones secundarias, el valor predeterminado el valor para android:exported es verdadero. Simplemente dígalo explícitamente y debería funcionar bien.

es decir,

<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

yo soy un novato con el desarrollo androide y mi solución era simple causó mi estupidez. Cambié el nombre de mi archivo receptor de transmisión y cuando traté de ejecutar la aplicación, recibí el error classdefnot found. Terminé limpiando y reconstruyendo el proyecto y el error fue eliminado.

Cuestiones relacionadas