2010-08-24 12 views
5

Ho una configurazione ricevitore broadcast in modo che un messaggio popup venga visualizzato all'utente dopo ogni aggiornamento della mia app o se questa è la prima volta che il pacchetto viene installato. Ho provato questo sul mio Droid con Android 2.2 sia come una nuova installazione e dopo aver aggiornato la mia app, sia nell'emulatore con 1.5 e 1.6, e vedo che tutto funziona alla perfezione.Errore ricevitore broadcast Android: eccezione di classe non trovata

Tuttavia, ho ricevuto una segnalazione di errore da un utente che elenca la seguente eccezione:

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 

Qualcuno mi può dire perché uno dei miei utenti ha ricevuto questa eccezione?

Nel mio file manifesto, ho cose configurazione come questa:

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

Il FirstRunBroadcastReceiver classe è messa a punto come questo:

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

C'era una prima volta l'installazione, il valore predefinito per la condivisione prefs è impostato in modo che venga visualizzato il messaggio pop-up, ma non penserei che avrebbe nulla a che fare con questa eccezione.

L'ho testato di nuovo e non ricevo un'eccezione. Grazie per tutto l'aiuto che potete fornire.

+0

È una cosa continua per questo utente? O è successo una volta sola? – Falmarri

+0

Ciao Falmarri, sfortunatamente non ho idea se questa sia un'eccezione continua o meno. Ho ricevuto il rapporto attraverso l'Android Market. Chiunque abbia riscontrato questo errore non mi ha mandato un'email, sarebbe stato bello. Quindi non lo so. C'è solo un rapporto di errore per questo nel mio account Market, ma questo non significa necessariamente nulla. – Michael

+0

Hai risolto questo? - Pubblica una risposta. – levi

risposta

0

La dichiarazione del pacchetto è nella classe FirstRunBroadcastReceiver come segue?

package com.name.pkg.app_name; 

Secondo lo stack delle eccezioni, dovrebbe essere così.

+0

Ciao radek-k, sì, la mia dichiarazione di pacco è in FirstRunBroadcastReceiver. È la prima riga del file sorgente. Aggiornerò il mio post originale e aggiungerò questo. – Michael

+0

La mia domanda era: la dichiarazione del pacchetto è esattamente la stessa di cui ho scritto sopra? – plugmind

+0

Esattamente come hai scritto? Se stai parlando del nome effettivo dell'app, ovviamente il nome dell'app non è chiamato "nome_app" e, a parte questo, ho modificato il mio post per mostrare esattamente cosa dice il codice sorgente. – Michael

3

dalla documentazione Android su "Android: esportato" attributo per un ricevitore:

o meno il ricevitore di broadcast può ricevere i messaggi provenienti da fonti esterne sua applicazione - "true" se si può, e "false" se non. Se "falso", gli unici messaggi che il destinatario della trasmissione può ricevere sono quelli inviati da componenti della stessa applicazione o delle applicazioni con lo stesso ID utente. Il valore predefinito dipende dal fatto che il ricevitore di trasmissione contenga filtri di intent. L'assenza di filtri significa che può essere invocato solo da oggetti Intent che specificano il suo nome di classe esatto. Ciò implica che il ricevitore è inteso solo per uso interno all'applicazione (dato che altri normalmente non conoscono il nome della classe). Quindi in questo caso, il valore predefinito è "falso". D'altro canto, la presenza di almeno un filtro implica che il destinatario della trasmissione è destinato a ricevere intenti trasmessi dal sistema o da altre applicazioni, quindi il valore predefinito è "vero"

Poiché il destinatario ha intenzioni figlio di default valore per android:exported è vero. Basta dichiararlo esplicitamente e dovrebbe funzionare bene.

cioè,

<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

Sono un novizio con lo sviluppo Android e la mia soluzione era semplice ha causato la mia stupidità. Ho rinominato il mio file broadcastreceiver e quando ho provato a eseguire l'applicazione ho ricevuto l'errore classdefnotfound. Ho finito per pulire e ricostruire il progetto e l'errore è stato rimosso.

Problemi correlati