获取值时Firebase实时数据库错误

时间:2017-02-15 09:26:14

标签: android firebase firebase-realtime-database firebase-authentication

我正在使用Firebase制作聊天应用。我创建了一个名为Chat Activity的类,用户可以在其中发送或接收消息。与此同时,我正在创建通知。在初始阶段,我在创建ChatActivity时立即构建通知。

正文的内容是发送的最后一条消息。但是,当我将通知的标题发送给用户的名称时,它不会显示标题。我使用名为“getNameFromRoll()”的新函数获取用户的名称。但是这也会返回null。

当用户在应用程序中注册时,不仅会在firebase用户列表中注册,而且还会在名为“profiles”的内部子项中名为“students”的数据库中的子项中注册。 getNameFromRoll()从这个子节点读取数据。

以下是代码:

ChatActivity:

package com.app.shubhamjhunjhunwala.heritagecompanion_students;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.provider.Settings;
import android.support.annotation.Nullable;
import android.support.design.widget.FloatingActionButton;
import android.support.v4.app.NotificationCompat;
import android.support.v4.graphics.BitmapCompat;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.ForwardingListener;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.text.InputType;
import android.view.View;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;

import com.google.firebase.database.ChildEventListener;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;

import java.security.PublicKey;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

/**
 * Created by shubham on 03/02/17.
 */

public class ChatActivity extends AppCompatActivity {

    public String chatName;
    public String chatRoll;
    public String messageText;
    public String time;
    public String name;

    public String senderRoll;

    public String mId;
    public List<Messages> mMessages;
    public List<Chats> mChats;
    public RecyclerView mMessagesListView;
    public MessageAdapter mMessageAdapter;

    public EditText mMessageEditText;
    public FloatingActionButton mSendFAB;

    public FirebaseDatabase mDatabase;
    public DatabaseReference mSenderDatabaseReference;
    public DatabaseReference mRecieverDatabaseReference;
    public DatabaseReference mRecieverChatsDatabaseReference;
    public DatabaseReference mUsersDatabaseReference;
    public ChildEventListener mChildEventListener;
    public ChildEventListener mChatsChildEventListener;
    public ChildEventListener mUserChildEventListener;

    public Intent mServiceIntent;

    public String IS_NAME_KEY = "com.app.shubhamjhunjhunwala.heritagecompanion_students.IS_NAMEKEY";
    public String IS_MESSAGE_KEY = "com.app.shubhamjhunjhunwala.heritagecompanion_students.IS_MESSAGEKEY";


    public ChatActivity() {
    }

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_chat);

        final Intent intent = getIntent();
        Bundle extras = intent.getExtras();
        chatName = intent.getStringExtra(ChatsActivity.EXTRA_NAME);
        chatRoll = intent.getStringExtra(ChatsActivity.EXTRA_ROLL);

        setTitle(chatName);

        SharedPreferences sharedPreferences = getSharedPreferences("HCS", 0);
        senderRoll = sharedPreferences.getString(AuthenticationActivity.ROLL_SHARED_PREFERENCE_KEY, "");

        mDatabase = FirebaseDatabase.getInstance();
        mSenderDatabaseReference = mDatabase.getReference().child("chats").child(senderRoll).child("messages").child(chatRoll);
        mRecieverDatabaseReference = mDatabase.getReference().child("chats").child(chatRoll).child("messages").child(senderRoll);
        mRecieverChatsDatabaseReference = mDatabase.getReference().child("chats").child(chatRoll);
        mUsersDatabaseReference = mDatabase.getReference().child("students").child("profiles");

        mMessageEditText = (EditText) findViewById(R.id.message_edit_text);
        mSendFAB = (FloatingActionButton) findViewById(R.id.send_fab);

        mMessages = new ArrayList<>();
        mChats = new ArrayList<>();
        mMessagesListView = (RecyclerView) findViewById(R.id.messages_list_view);
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        mMessagesListView.setLayoutManager(layoutManager);

        mMessageAdapter = new MessageAdapter(mMessages, senderRoll, chatRoll);

        mMessagesListView.setAdapter(mMessageAdapter);

        mSendFAB.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                messageText = mMessageEditText.getText().toString().trim();
                Calendar c = Calendar.getInstance();
                SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                time = df.format(c.getTime());
                if (messageText != "") {
                    Messages message = new Messages(messageText, time, senderRoll, chatRoll, mId);
                    mSenderDatabaseReference.push().setValue(message);
                    mRecieverDatabaseReference.push().setValue(message);
                }
                mMessageEditText.setText("");
            }
        });

        message();
    }

    public void message() {
        mChildEventListener = new ChildEventListener() {
            int n;
            Chats chat;

            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                if (dataSnapshot != null && dataSnapshot.getValue() != null) {
                    Messages messages = dataSnapshot.getValue(Messages.class);
                    mMessages.add(messages);
                    mMessagesListView.scrollToPosition(mMessages.size() - 1);
                    mMessageAdapter.notifyItemInserted(mMessages.size() - 1);
                    notificationBuilder(ChatActivity.this, messages.getSender(), messages.getMessage());
                    n = setNewChatHeader();
                    if (n == 1) {
                        chat = new Chats(chatName, chatRoll);
                        mRecieverChatsDatabaseReference.setValue(chat);
                    }
                }
            }

            @Override
            public void onChildChanged(DataSnapshot dataSnapshot, String s) {

            }

            @Override
            public void onChildRemoved(DataSnapshot dataSnapshot) {

            }

            @Override
            public void onChildMoved(DataSnapshot dataSnapshot, String s) {

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        };

        mSenderDatabaseReference.addChildEventListener(mChildEventListener);
    }

    public int setNewChatHeader() {
        mChatsChildEventListener = new ChildEventListener() {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                if (dataSnapshot != null && dataSnapshot.getValue() != null) {
                    Chats chats = dataSnapshot.getValue(Chats.class);
                    if (chats.getName() != null) {
                        mChats.add(chats);
                    }
                }
            }

            @Override
            public void onChildChanged(DataSnapshot dataSnapshot, String s) {

            }

            @Override
            public void onChildRemoved(DataSnapshot dataSnapshot) {

            }

            @Override
            public void onChildMoved(DataSnapshot dataSnapshot, String s) {

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        };

        mRecieverChatsDatabaseReference.addChildEventListener(mChatsChildEventListener);

        if (mChats.size() != 0) {
            for (int i = 0; i < mChats.size(); i++) {
                Chats chat = mChats.get(i);
                String name = chat.getName();
                if (name.equals(chatName)) {
                    return 1;
                }
            }
        }
        return 0;
    }

    public String getSenderRoll() {
        return senderRoll;
    }

    public void notificationBuilder(Context context, String name, String message) {
        getNameFromRollNumber(name);
        NotificationCompat.Builder mBuilder =
                new NotificationCompat.Builder(this)
                        .setColor(getResources().getColor(R.color.colorPrimary))
                        .setSmallIcon(R.drawable.ic_message_notification_icon)
                        .setLargeIcon(largeIcon(context))
                        .setContentTitle(this.name)
                        .setContentText(message)
                        .setStyle(new NotificationCompat.BigTextStyle().bigText(message))
                        .setDefaults(Notification.DEFAULT_VIBRATE)
                        .setAutoCancel(true);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
            mBuilder.setPriority(Notification.PRIORITY_HIGH);
        }

        Intent resultIntent = new Intent(this, ChatActivity.class);

        PendingIntent resultPendingIntent = PendingIntent.getActivity(
                this,
                0,
                resultIntent,
                PendingIntent.FLAG_UPDATE_CURRENT
        );

        mBuilder.setContentIntent(resultPendingIntent);

        int mNotificationId = 001;

        NotificationManager mNotifyMgr = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

        mNotifyMgr.notify(mNotificationId, mBuilder.build());
    }

    public Bitmap largeIcon(Context context) {
        Resources res = context.getResources();
        Bitmap largeIcon = BitmapFactory.decodeResource(res, R.mipmap.ic_launcher);
        return largeIcon;
    }

    public void getNameFromRollNumber (String roll) {

        mUsersDatabaseReference = mUsersDatabaseReference.child(roll);

        mUserChildEventListener = new ChildEventListener() {

            ChatActivity chatActivity = new ChatActivity();

            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                UserDetails userDetails = dataSnapshot.getValue(UserDetails.class);
                chatActivity.setName(userDetails.getName());
            }

            @Override
            public void onChildChanged(DataSnapshot dataSnapshot, String s) {

            }

            @Override
            public void onChildRemoved(DataSnapshot dataSnapshot) {

            }

            @Override
            public void onChildMoved(DataSnapshot dataSnapshot, String s) {

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        };
        mUsersDatabaseReference.addChildEventListener(mUserChildEventListener);

        Toast.makeText(ChatActivity.this, name, Toast.LENGTH_SHORT).show();
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

UserDetails.class:

package com.app.shubhamjhunjhunwala.heritagecompanion_students;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;

/**
 * Created by shubham on 23/01/17.
 */

public class UserDetails {

    UserDetails() {}

    public String name;
    public String email;
    public String password;
    public String phone;
    public String roll;
    public String sharingKey;
    public String department;
    public String year;
    public String section;

    public UserDetails(String name, String email, String password, String phone, String roll, String sharingKey, String department, String year, String section) {
        this.name = name;
        this.email = email;
        this.password = password;
        this.phone = phone;
        this.roll = roll;
        this.sharingKey = sharingKey;
        this.department = department;
        this.year = year;
        this.section = section;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getRoll() {
        return roll;
    }

    public void setRoll(String roll) {
        this.roll = roll;
    }

    public String getDepartment() {
        return department;
    }

    public void setDepartment(String department) {
        this.department = department;
    }

    public String getYear() {
        return year;
    }

    public void setYear(String year) {
        this.year = year;
    }

    public String getSection() {
        return section;
    }

    public void setSection(String section) {
        this.section = section;
    }

    public String getSharingKey() {
        return sharingKey;
    }

    public void setSharingKey(String sharingKey) {
        this.sharingKey = sharingKey;
    }
}

数据库结构示例:

heritage-companion-students
     chats
     students
          -Kcgc88CAieCWCWPvA8D
          -KcgcNrZj2Saueyaejw5
          -Kcgce-x43DaaYiHjTpK
          -Kcgcqh1uJ8E_KgKDcq0
          -Kcgd36xoBcdsJriqMjS
          -KcgdHY9CxaoCQ9poEna
          profiles
               1657099
               1657102
               1657103
               1657108
                   -Kcgc87aRCL_D1KXJypP
                        department: 
                        email: 
                        name: 
                        password: 
                        phone: 
                        roll: 
                        sharingKey: 
               1657113
               1657120

0 个答案:

没有答案