Search code examples
androidfirebasefirebase-realtime-databasebroadcastreceiver

How to save incoming messages to firebase DB


I tried to send the incoming messages to my android phone to be saved in a firebase. but it saves the last received one. it seems that some kind of overwriting happens to firebase db. could you please help me to figure out the problem. thanks in advance

import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;

    import com.google.firebase.database.DatabaseReference;
    import com.google.firebase.database.FirebaseDatabase;

    /**
     * Created by EngMohamed on 5/26/2017.
     */

    public class SMSReciever extends BroadcastReceiver{

        private DatabaseReference mFirebaseDatabase;
        private FirebaseDatabase mFirebaseInstance;

        @Override
        public void onReceive(Context context, Intent intent) {

            //—get the SMS message passed in—
            Bundle bundle = intent.getExtras();
            SmsMessage[] msgs = null;
            String messages = "";
            if (bundle != null)
            {
    //—retrieve the SMS message received—
                Object[] smsExtra = (Object[]) bundle.get("pdus");
                msgs = new SmsMessage[smsExtra.length];
                for (int i=0; i<msgs.length; i++)
                {
                    SmsMessage sms = SmsMessage.createFromPdu((byte[])smsExtra[i]);
    //take out content from sms
                    String body = sms.getMessageBody().toString();
                    String address = sms.getOriginatingAddress();
                    messages += "SMS from " + address + " :\n";
                    messages += body + "\n";
                }
                putSmsToFirebase(sms,context);

            }

        }

        public void putSmsToFirebase(SmsMessage sms, Context context)
        {
            String messageDate = java.text.DateFormat.getDateTimeInstance().format(Calendar.getInstance().getTime());
            String messageBody = sms.getMessageBody().toString();
            String messageSender= sms.getOriginatingAddress().toString();

            mFirebaseInstance = FirebaseDatabase.getInstance();
            mFirebaseDatabase = mFirebaseInstance.getReference("messages");
            mFirebaseDatabase.child("messagesender").push().setValue(messageSender);
            mFirebaseDatabase.child("messagebody").push().setValue(messageBody);
            mFirebaseDatabase.child("messagedate").push().setValue(messageDate);


        }
    }

Solution

  • You have the structure inverted. I think you want:

    public void putSmsToFirebase(SmsMessage sms, Context context)
    {
        String messageDate = java.text.DateFormat.getDateTimeInstance().format(Calendar.getInstance().getTime());
        String messageBody = sms.getMessageBody().toString();
        String messageSender= sms.getOriginatingAddress().toString();
    
        mFirebaseInstance = FirebaseDatabase.getInstance();
        mFirebaseDatabase = mFirebaseInstance.getReference("messages");
    
        DatabaseReference messageRef = mFirebaseDatabase.push();
        messageRef.child("messagesender").setValue(messageSender);
        messageRef.child("messagebody").setValue(messageBody);
        messageRef.child("messagedate").setValue(messageDate);
    }
    

    In the above messageRef is the location in the database where you store the new message, and you then set three values in properties under it.