0

Il ya 3 jours, j'ai demandé à propos de quelque chose comme My Question 3 days Ago. Maintenant, j'ai de nouveaux problèmes. S'il vous plaît voir mon code ci-dessous.Redémarrez AlarmManager après le redémarrage en utilisant BootService

J'ai une méthode startAlarm()

public void startAlarm(final Context context){ 
    myRef.child("users").child(uId).addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot babyDataSnapshot) { 
      for (DataSnapshot babySnapshot: babyDataSnapshot.getChildren()) { 
       final Baby baby = babySnapshot.getValue(Baby.class); 
       uBabyName = baby.getuBabyName(); 
       myRef.child("users").child(uId).child(uBabyName).child("Vaccines").addValueEventListener(new ValueEventListener() { 
        @Override 
        public void onDataChange(DataSnapshot vaccineDataSnapshot) { 
         for (DataSnapshot vaccineSnapshot: vaccineDataSnapshot.getChildren()){ 
          Vaccine vaccine = vaccineSnapshot.getValue(Vaccine.class); 

          calendar = Calendar.getInstance(); 
          year = calendar.get(Calendar.YEAR); 
          month = calendar.get(Calendar.MONTH)+1; 
          day = calendar.get(Calendar.DAY_OF_MONTH); 
          today = day + "/" + month + "/" + year; 
          vaccineDate = vaccine.getVaccineDate(); 
          String [] dateParts = vaccineDate.split("/"); 
          int vDay = Integer.parseInt(dateParts[0]); 
          int vMonth = Integer.parseInt(dateParts[1]); 
          int vYear = Integer.parseInt(dateParts[2]); 


          SimpleDateFormat myFormat = new SimpleDateFormat("dd/MM/yyyy"); 

          try { 
           Date dVaccine = myFormat.parse(vaccineDate); 
           Date dToday = myFormat.parse(today); 
           long diffD = calculateDays(dToday, dVaccine); 

           if(diffD>=0){ 
            AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 

            Intent notificationIntent = new Intent("android.media.action.DISPLAY_NOTIFICATION"); 
            notificationIntent.putExtra("Content", "Waktunya Imunisasi "+ vaccine.getVaccineName() + " untuk " + baby.getuBabyName()); 
            notificationIntent.addCategory("android.intent.category.DEFAULT"); 

            android.icu.util.Calendar cal = android.icu.util.Calendar.getInstance(); 

            PendingIntent broadcast = PendingIntent.getBroadcast(context, NotificationID.getID(), notificationIntent,PendingIntent.FLAG_UPDATE_CURRENT); 
            cal.set(android.icu.util.Calendar.YEAR, vYear); 
            cal.set(android.icu.util.Calendar.MONTH, vMonth-1); 
            cal.set(android.icu.util.Calendar.DAY_OF_MONTH, vDay); 
            cal.set(android.icu.util.Calendar.HOUR_OF_DAY, 6); 
            cal.set(android.icu.util.Calendar.MINUTE, 00); 
            cal.set(android.icu.util.Calendar.SECOND, 00); 

            alarmManager.setExact(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), broadcast); 
           } 
           else { 
            //TextView desc = (TextView) findViewById(R.id.desc); 
            //desc.setText("<0"); 
           } 

          } catch (ParseException e) { 
           e.printStackTrace(); 
          } 
         } 
        } 

        @Override 
        public void onCancelled(DatabaseError databaseError) { 

        } 
       }); 
      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 
} 

Quand j'appelle cela à une activité normale, il me donne une notification. Mais quand j'appelle cela de BootService

public class BootService extends Service { 

@Override 
public void onCreate() { 
    try 
    { 
     AddBabyActivity addBabyActivity = new AddBabyActivity(); 
     addBabyActivity.startAlarm(this); 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 
} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    return START_NOT_STICKY; 
} 

@Override 
public IBinder onBind(Intent intent) { 
    return null; 
} 

Il me donne une erreur lorsque je redémarre mon téléphone

08-14 12:56:19.514 3977-3977/ga.crescere.mom W/System.err: java.lang.NullPointerException: Can't pass null for argument 'pathString' in child() 
08-14 12:56:19.515 3977-3977/ga.crescere.mom W/System.err:  at com.google.firebase.database.DatabaseReference.child(Unknown Source) 
08-14 12:56:19.515 3977-3977/ga.crescere.mom W/System.err:  at ga.crescere.mom.AddBabyActivity.startAlarm(AddBabyActivity.java:160) 
08-14 12:56:19.515 3977-3977/ga.crescere.mom W/System.err:  at ga.crescere.mom.BootService.onCreate(BootService.java:19) 
08-14 12:56:19.515 3977-3977/ga.crescere.mom W/System.err:  at android.app.ActivityThread.handleCreateService(ActivityThread.java:3216) 
08-14 12:56:19.515 3977-3977/ga.crescere.mom W/System.err:  at android.app.ActivityThread.-wrap5(ActivityThread.java) 
08-14 12:56:19.515 3977-3977/ga.crescere.mom W/System.err:  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1586) 
08-14 12:56:19.515 3977-3977/ga.crescere.mom W/System.err:  at android.os.Handler.dispatchMessage(Handler.java:102) 
08-14 12:56:19.515 3977-3977/ga.crescere.mom W/System.err:  at android.os.Looper.loop(Looper.java:154) 
08-14 12:56:19.515 3977-3977/ga.crescere.mom W/System.err:  at android.app.ActivityThread.main(ActivityThread.java:6186) 
08-14 12:56:19.515 3977-3977/ga.crescere.mom W/System.err:  at java.lang.reflect.Method.invoke(Native Method) 
08-14 12:56:19.515 3977-3977/ga.crescere.mom W/System.err:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889) 
08-14 12:56:19.515 3977-3977/ga.crescere.mom W/System.err:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779) 
08-14 12:56:19.527 3977-4034/ga.crescere.mom D/NetworkSecurityConfig: No Network Security Config specified, using platform default 
08-14 12:56:29.603 3977-3997/ga.crescere.mom W/DynamiteModule: Local module descriptor class for com.google.firebase.auth not found. 

AddBabyActivity Ligne 160

 myRef.child("users").child(uId).addValueEventListener(new ValueEventListener() { 

BootService Ligne 19

  addBabyActivity.startAlarm(this); 

Dernier jour, je fais startAlarm statique sans base de données importation firebase et il me donne une notification Successfull après le redémarrage. Mais maintenant, je dois supprimer le statique car il donnera une erreur à toute la ligne dans startAlarm méthode. Quelqu'un peut-il m'aider avec cette erreur?

Répondre

0

Il semble que votre uId soit nul, c'est ce que dit l'erreur. Regardez dans cette direction. Si nécessaire, vous devrez sauvegarder uId dans la mémoire de l'application locale ou le récupérer du serveur si possible.

+0

Non, je l'ai déclaré à la méthode onCreate: 'onCreate protégé void (Bundle savedInstanceState) { super .onCreate (savedInstanceState); setContentView (R.layout.activity_add_baby); FirebaseUser utilisateur = FirebaseAuth.getInstance(). GetCurrentUser(); uId = user.getUid(); } ' –

+0

@EMFarih essayer à System.out.println (uId) avant de faire appel et vous saurez si elle est nulle.Erreur dit qu'il y a un chemin nul Chaîne dans child() –

+1

génial, vous avez raison ,. J'ai juste besoin de placer la déclaration uId dans startAlarm(); ... merci .. –

0

La méthode d'activité d'appel du service comme vous l'avez implémentée n'est pas recommandée, vous devriez plutôt utiliser le service Binder.

AddBabyActivity addBabyActivity = new AddBabyActivity(); 
addBabyActivity.startAlarm(this); 

espoir liens ci-dessous vous aidera:

Calling activity class method from Service class

http://www.vogella.com/tutorials/AndroidBroadcastReceiver/article.html

+0

désolé, je suis toujours débutant :), je ne peux pas comprendre le lien que vous avez partagé ... pourriez-vous expliquer plus de détails? Je vous remercie.. –