Autore Topic: Problema: Didn't find class "...." on path: ".."  (Letto 605 volte)

Offline punticci

  • Utente junior
  • **
  • Post: 78
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus 4
Problema: Didn't find class "...." on path: ".."
« il: 17 Luglio 2013, 15:56:41 CEST »
0
Ciao a tutti..Ho un piccolo problema. Voglio che una notifica appaia al ACTION_BATTERY_LOW. Per testare se il mio codice funziona sto usando RECEIVE_BOOT_COMPLETED. Quindi quello che mi aspetto è che appena finito il boot del telefono parta una notifica. Sfortunatamente l'unica cosa che appare è un bel crash dell'applicazione. Guardando nel logcato mi trovo questo messaggio:

Codice: [Seleziona]
Didn't find class "com.dd.batterystats.MyScheduleReceiver" on path: /data/app/com.dd.batterystats-1
Praticamente io ho creato due classi. Una è MyScheduleReceiver mentre l'altra è service. Le posto
MyScheduleReceiver
Codice (Java): [Seleziona]
public class MyScheduleReceiver extends BroadcastReceiver {


    // Restart service every 30 min
    private static final long REPEAT_TIME = 30*1000*4;//1800000 ;

    @Override
    public void onReceive(Context context, Intent intent) {
Intent service = new Intent(context, service.class);
context.startService(service);
}}
service.java
Codice (Java): [Seleziona]
public class service extends Service {

    NotificationManager mNotificationManager;
      @Override public IBinder onBind(Intent intent) {
        // Not used
        return null;
      }

      @Override public void onCreate() {
        super.onCreate();
  mNotificationManager= (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
checkPref();
}
@Override
      public void onDestroy() {
        super.onDestroy();

      }

private void checkPref(){
        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(
                                service.this);
                notificationBuilder.setContentTitle("Title");
                notificationBuilder.setContentText("Context");
                notificationBuilder.setTicker("TickerText");
                notificationBuilder.setWhen(System.currentTimeMillis());
                notificationBuilder.setSmallIcon(R.drawable.ic_stat_icon);

                Intent notificationIntent = new Intent(this, service.class);
                PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
                                notificationIntent, 0);

                notificationBuilder.setContentIntent(contentIntent);

                notificationBuilder.setDefaults(Notification.DEFAULT_SOUND
                                | Notification.DEFAULT_LIGHTS | Notification.DEFAULT_VIBRATE);

                mNotificationManager.notify(1,
                                notificationBuilder.build());
    }   }
e la parte del manifest che mi interessa con chiaramente prima i vari permessi in primis:
Codice: [Seleziona]
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED">e poi il resto
Codice: [Seleziona]
<receiver android:name="MyScheduleReceiver" >
     <intent-filter>
         <action android:name="android.intent.action.BOOT_COMPLETED" />
     </intent-filter>

 </receiver>
 <service android:name="service" >
 </service>
Chiaramente sono compresi i permessi della vibrazione ecc ecc. Spero in aiuto. Grazie

Offline crbin1

  • Utente junior
  • **
  • Post: 61
  • Respect: +6
    • labeltodo
    • Mostra profilo
    • Do Androids Dream of Electric Sheep?
  • Dispositivo Android:
    Galaxy Nexus
Re:Problema: Didn't find class "...." on path: ".."
« Risposta #1 il: 17 Luglio 2013, 16:18:22 CEST »
0

Nella riga
Codice: [Seleziona]
<receiver android:name="MyScheduleReceiver" >prova a mettere il path completo, che immagino sia "com.dd.batterystats.MyScheduleReceiver", controllando che sia corretto, con maiuscole, minuscole ecc...


Offline punticci

  • Utente junior
  • **
  • Post: 78
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus 4
Re:Problema: Didn't find class "...." on path: ".."
« Risposta #2 il: 17 Luglio 2013, 16:23:24 CEST »
0
Nella riga
Codice: [Seleziona]
<receiver android:name="MyScheduleReceiver" >prova a mettere il path completo, che immagino sia "com.dd.batterystats.MyScheduleReceiver", controllando che sia corretto, con maiuscole, minuscole ecc...
Argh!!!! Scusa colpa mia!! nel codice ho copiato male e "MyScheduleReceiver" è diventato "MyscheduleReceiver" con la s minuscola. Ovio che non trovava nulla. Grazie comunque :) secondo te ora che ho capito il problema posso togliere il path completo?

Offline crbin1

  • Utente junior
  • **
  • Post: 61
  • Respect: +6
    • labeltodo
    • Mostra profilo
    • Do Androids Dream of Electric Sheep?
  • Dispositivo Android:
    Galaxy Nexus
Re:Problema: Didn't find class "...." on path: ".."
« Risposta #3 il: 17 Luglio 2013, 16:55:13 CEST »
0
Argh!!!! Scusa colpa mia!! nel codice ho copiato male e "MyScheduleReceiver" è diventato "MyscheduleReceiver" con la s minuscola. Ovio che non trovava nulla. Grazie comunque :) secondo te ora che ho capito il problema posso togliere il path completo?

Prova  :-)
Io comunque lo lascerei, male non fa

Offline punticci

  • Utente junior
  • **
  • Post: 78
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus 4
Re:Problema: Didn't find class "...." on path: ".."
« Risposta #4 il: 17 Luglio 2013, 17:01:48 CEST »
0
Prova  :-)
Io comunque lo lascerei, male non fa
Ottimo grazie..Devo ancora capire le varie differenze tipo scrivere: com.dd.batterystats.MyScheduleReceiver o solo MyScheduleReceiver oppure .MyScheduleReceiver o anche MainActivity&MyScheduleReceiver.

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Problema: Didn't find class "...." on path: ".."
« Risposta #5 il: 17 Luglio 2013, 17:14:30 CEST »
0
se scrivi solo il nome, lui prende il package root dal manifest e ci fa 'package' + "."+"NOMERECEIVER"
se scrivi il .nome fa la stessa cosa senza il punto
se scrivi il package completo fa il lookup della classe avendo il package completo

E' abbastanza classica come pratica, viene dalla logica dei classloader, ai quali, se dai il nome di una classe senza package, cercano tra il classpath se trovano quella classe. Se la trovano e non ci sono ambiguità (doppioni) instanziano quella che c'è, se ci sono ambiguità ma risolvibili dai parametri che hai dato o dal contesto allora non ci sono problemi, se invece non riescono a risolvere le ambiguità schioppano.

Nel tuo caso, se non dai il path, ma il tuo receiver è in un altro sottopackage, la cosa non funzionerà, se però definisci il receiver name come ".sottopackage.NOMERECEIVER" viene trovato correttamente.
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline punticci

  • Utente junior
  • **
  • Post: 78
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus 4
Re:Problema: Didn't find class &quot;....&quot; on path: &quot;..&quot;
« Risposta #6 il: 17 Luglio 2013, 17:49:09 CEST »
0
se scrivi solo il nome, lui prende il package root dal manifest e ci fa 'package' + "."+"NOMERECEIVER"
se scrivi il .nome fa la stessa cosa senza il punto
se scrivi il package completo fa il lookup della classe avendo il package completo

E' abbastanza classica come pratica, viene dalla logica dei classloader, ai quali, se dai il nome di una classe senza package, cercano tra il classpath se trovano quella classe. Se la trovano e non ci sono ambiguità (doppioni) instanziano quella che c'è, se ci sono ambiguità ma risolvibili dai parametri che hai dato o dal contesto allora non ci sono problemi, se invece non riescono a risolvere le ambiguità schioppano.

Nel tuo caso, se non dai il path, ma il tuo receiver è in un altro sottopackage, la cosa non funzionerà, se però definisci il receiver name come ".sottopackage.NOMERECEIVER" viene trovato correttamente.
Ti ringrazio ottima spiegazione :-)

Inviato dal mio Nexus 4