0

3 days ago, I have asked about something like this My Question 3 days Ago. Now I'm having a new issues. Please see my code below.

I have a startAlarm() method

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

        }
    });
}

When I call this at Normal Activity, it give me a notification. But when I call this from 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;
}

It give me an error when I reboot my 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 Line 160

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

BootService Line 19

            addBabyActivity.startAlarm(this);

Last day, I make startAlarm as static without importing database firebase and it give me a successfull notification after reboot. But Now, I must remove the static because it will give a many error at all line in startAlarm method. Can someone help me with this error?

KENdi
  • 7,576
  • 2
  • 16
  • 31
EM Farih
  • 67
  • 1
  • 9

2 Answers2

0

It seems your uId is null, that's what error says. Look in that direction. If needed then u will have to save uId in local app memory or retrieve it from server if possible

Janusz Hain
  • 597
  • 5
  • 18
  • No, i have it declared at onCreate method: `protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_add_baby); FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser(); uId = user.getUid(); }` – EM Farih Aug 14 '17 at 06:33
  • @EMFarih try to System.out.println(uId) before making call and you will know if it is null.Error says there is null path String in child() – Janusz Hain Aug 14 '17 at 06:44
  • 1
    awesome, you are right,. i just need to place the uId declaration inside startAlarm();... thanks.. – EM Farih Aug 14 '17 at 06:52
0

Calling Activity method from service the way you implemented is not recommended one you should use Binder Service rather this.

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

Hope below links will help :

Calling activity class method from Service class

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

Jeelan
  • 173
  • 1
  • 11
  • sorry I'm still beginner :), i can't understand about the link you shared... could you explain more detail? thank you.. – EM Farih Aug 14 '17 at 06:40