0

3日前、私はこのようなものについて尋ねましたMy Question 3 days Ago。今私は新しい問題を抱えています。以下の私のコードを見てください。BootServiceを使用して再起動した後でAlarmManagerを再起動します

私はそれが私に通知を与え、正常な活動でこれを呼び出すと、私は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) { 

     } 
    }); 
} 

を持っています。私は

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

BootService からこれを呼び出すときに、私は

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ライン160

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

BootServiceライン19自分の携帯電話を再起動したときに、それは私にエラーを与えます

  addBabyActivity.startAlarm(this); 

最後の日、私は、データベースfirebaseをインポートせずstartAlarmとして静的を作り、それが私の再起動後に成功した通知を与えます。しかし、のスタティックは、startAlarmメソッドのすべての行で多くのエラーが発生するため、削除する必要があります。誰かがこのエラーで私を助けることができますか?

答えて

0

あなたのIDはnullと思われますが、これはエラーの内容です。その方向を見てください。必要であれば、ローカルのアプリケーションメモリにUIDを保存するか、可能であればサーバーから取得する必要があります。

+0

をいいえ、私はそれはのonCreateメソッドで宣言している: '保護され、ボイドのonCreate(バンドルsavedInstanceState){ スーパー.onCreate(savedInstanceState); setContentView(R.layout.activity_add_baby); Firebaseユーザーのユーザー= FirebaseAuth.getInstance()。getCurrentUser(); uId = user.getUid(); } ' –

+0

@EMFarih呼び出しを行う前にSystem.out.println(uId)を試してください。nullであるかどうかを知ることができます。エラーには子パスにNULLパス文字列があります。 –

+1

素晴らしいです。私はちょうどstartAlarm()の内部にあなたの宣言を置く必要があります; ...ありがとう... –

0

サービスからのアクティビティメソッドの呼び出しは、実装した方法ではなくバインダーサービスを使用することをお勧めします。

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

リンク以下のホープに役立ちます:

Calling activity class method from Service class

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

+0

私はまだ初心者です:)あなたが共有したリンクについて理解できません...詳細を説明できますか?ありがとうございました.. –

関連する問題