In the chat functionality of the application, I am able to send and receive text messages. I am trying to implement where I am able to send and receive image messages and I am running into errors.
StudentChatActivity.java
public class StudentChatActivity extends AppCompatActivity {
private FirebaseListAdapter<ChatMessage> adapter;
private ListView listView;
public static String tutorID = "";
public String tutorName = "";
private String mChatUser;
private FirebaseAuth mAuth;
private DatabaseReference mRootRef;
FirebaseDatabase database;
private MessageAdapter mAdapter;
private static final int TOTAL_ITEMS_TO_LOAD = 10;
private int mCurrentPage = 1;
private static final int GALLERY_PICK = 1;
private FirebaseUser mCurrentUser;
private StorageReference mImageStorage;
private int itemPos = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_chat);
Intent intt = getIntent();
Bundle b = intt.getExtras();
if (b != null) {
tutorID = (String) b.get("tutorID");
tutorName = (String) b.get("tutorName");
}
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
listView = (ListView) findViewById(R.id.list);
ImageButton imagebutton = (ImageButton) findViewById(R.id.image_button);
mImageStorage = FirebaseStorage.getInstance().getReference();
mCurrentUser = FirebaseAuth.getInstance().getCurrentUser();
String current_uid = mCurrentUser.getUid();
final EditText input = (EditText) findViewById(R.id.input1);
mRootRef.child("Chat").child(String.valueOf(mCurrentUser)).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if(!dataSnapshot.hasChild(mChatUser)){
Map chatAddMap = new HashMap();
chatAddMap.put("seen",false);
chatAddMap.put("timestamp", ServerValue.TIMESTAMP);
Map chatUserMap = new HashMap();
chatUserMap.put("Chat/" + mCurrentUser + "/" + mChatUser, chatAddMap);
chatUserMap.put("Chat/" + mChatUser + "/" + mCurrentUser, chatAddMap);
mRootRef.updateChildren(chatUserMap, new DatabaseReference.CompletionListener() {
@Override
public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) {
if (databaseError != null)
Log.d( "Chat_log: ", databaseError.getMessage().toString());
}
});
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
showAllOldMessages();
imagebutton.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view){
Intent galleryIntent = new Intent();
galleryIntent.setType("image/*");
galleryIntent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(galleryIntent,"SELECT IMAGE"),GALLERY_PICK);
}
});
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (input.getText().toString().trim().equals("")) {
Toast.makeText(StudentChatActivity.this, "Please enter some texts!", Toast.LENGTH_SHORT).show();
} else {
FirebaseDatabase.getInstance()
.getReference()
.push()
.setValue(
new ChatMessage(input.getText().toString(),
StudentHome.info.etFirstname,
FirebaseAuth.getInstance().getCurrentUser().getUid(),
StudentChatActivity.this.tutorName,
StudentChatActivity.this.tutorID,
FirebaseAuth.getInstance().getCurrentUser().getUid()
)
);
input.setText("");
//send notification
}
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){
super.onActivityResult(requestCode,resultCode,data);
mRootRef = database.getReference();
// mAuth = FirebaseAuth.getInstance();
final EditText input = (EditText) findViewById(R.id.input1);
if(requestCode == GALLERY_PICK && resultCode == RESULT_OK){
Uri imageUri = data.getData();
final String current_user_ref = "messages/" + mCurrentUser + "/" + mChatUser;
final String chat_user_ref = "messages/" + mChatUser + "/" + mCurrentUser;
DatabaseReference user_message_push = mRootRef.child("messages").child(String.valueOf(mCurrentUser)).child(mChatUser).push();
final String push_id = user_message_push.getKey();
StorageReference filepath = mImageStorage.child("message_images").child(push_id + ".jpg");
filepath.putFile(imageUri).addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>() {
@Override
public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task) {
if(task.isSuccessful()){
String download_url = task.getResult().getDownloadUrl().toString();
Map messageMap = new HashMap();
messageMap.put("message",download_url);
messageMap.put("seen",false);
messageMap.put("type","image");
messageMap.put("time", ServerValue.TIMESTAMP);
messageMap.put("from",mCurrentUser);
Map messageUserMap = new HashMap();
messageUserMap.put(current_user_ref + "/" + push_id,messageMap);
messageUserMap.put(chat_user_ref + "/" + push_id,messageMap);
input.setText("");
mRootRef.updateChildren(messageUserMap, new DatabaseReference.CompletionListener() {
@Override
public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) {
if (databaseError != null)
Log.d( "Chat_log: ", databaseError.getMessage().toString());
}
});
/* mRootRef.updateChildren(messageUserMap, databaseError, databaseReference){
if (databaseError != null){
Log.d("CHAT_LOG", databaseError.getMessage().toString());
}
}); */
}
}
});
}
}
private void showAllOldMessages() {
try {
adapter = new MessageAdapter(this, ChatMessage.class, R.layout.item_in_message,
FirebaseDatabase.getInstance().getReference());
listView.setAdapter(adapter);
} catch (Exception er) {
System.out.print(er.getMessage());
}
}
}
ChatMessage.Java
package com.rough.tuber.tuber;
import android.media.Image;
import java.util.Date;
public class ChatMessage {
private String messageText;
private String studentName;
private String studentID;
private String tutorName;
private String tutorID;
private String senderId;
private long messageTime;
public ChatMessage(String messageText, String studentName, String studentID, String tutorName, String tutorID, String senderId) {
this.messageText = messageText;
this.studentName = studentName;
this.studentID = studentID;
messageTime = new Date().getTime();
this.tutorID = tutorID;
this.tutorName = tutorName;
this.senderId = senderId;
}
public ChatMessage() {
}
public String getStudentID() {
return studentID;
}
public void setStudentID(String studentID) {
this.studentID = studentID;
}
public String getSenderId() {
return senderId;
}
public String getTutorID() {
return tutorID;
}
public void setSenderId(String senderId) {
this.senderId = senderId;
}
public void setTutorID(String tutorID) {
this.tutorID = tutorID;
}
public String getTutorName() {
return tutorName;
}
public void setTutorName(String tutorName) {
this.tutorName = tutorName;
}
public String getMessageText() {
return messageText;
}
public void setMessageText(String messageText) {
this.messageText = messageText;
}
public String getStudentName() {
return studentName;
}
public void setStudentName(String studentName) {
this.studentName = studentName;
}
public long getMessageTime() {
return messageTime;
}
public void setMessageTime(long messageTime) {
this.messageTime = messageTime;
}
}
MessageAdapter.Java
package com.rough.tuber.tuber;
import android.text.format.DateFormat;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.firebase.ui.database.FirebaseListAdapter;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.database.DatabaseReference;
public class MessageAdapter extends FirebaseListAdapter<ChatMessage> {
private StudentChatActivity activity;
public MessageAdapter(StudentChatActivity activity, Class<ChatMessage> modelClass, int modelLayout, DatabaseReference ref) {
super(activity, modelClass, modelLayout, ref);
this.activity = activity;
}
@Override
protected void populateView(View v, ChatMessage model, int position) {
if (v != null) {
TextView messageText = (TextView) v.findViewById(R.id.message_text);
TextView messageUser = (TextView) v.findViewById(R.id.message_user);
TextView messageTime = (TextView) v.findViewById(R.id.message_time);
// ImageView messagaImage = (ImageView) v.fin
messageText.setText(model.getMessageText());
if (model.getSenderId() != null && model.getSenderId().equals(FirebaseAuth.getInstance().getCurrentUser().getUid())) {
messageUser.setText("You");
} else {
messageUser.setText(model.getTutorName());
}
// Format the date before showing it
messageTime.setText(DateFormat.format("dd-MM-yyyy (HH:mm:ss)", model.getMessageTime()));
}
}
@Override
public View getView(int position, View view, ViewGroup viewGroup) {
ChatMessage chatMessage = getItem(position);
if (chatMessage.getTutorID() != null && chatMessage.getStudentID() != null && chatMessage.getSenderId() != null && chatMessage.getStudentID().equals(FirebaseAuth.getInstance().getCurrentUser().getUid()) && chatMessage.getTutorID().equals(StudentChatActivity.tutorID)) {
if (chatMessage.getSenderId() != null && chatMessage.getSenderId().equals(FirebaseAuth.getInstance().getCurrentUser().getUid())
)
view = activity.getLayoutInflater().inflate(R.layout.item_out_message, viewGroup, false);
else
view = activity.getLayoutInflater().inflate(R.layout.item_in_message, viewGroup, false);
//generating view
populateView(view, chatMessage, position);
return view;
}
view = activity.getLayoutInflater().inflate(R.layout.item_empty, viewGroup, false);
return view;
}
@Override
public int getViewTypeCount() {
// return the total number of view types. this value should never change
// at runtime
return 2;
}
@Override
public int getItemViewType(int position) {
// return a value between 0 and (getViewTypeCount - 1)
return position % 2;
}
}
I am receiving this error.
This the error message. FATAL EXCEPTION: main Process: com.rough.tuber.tuber, PID: 3931 java.lang.NullPointerException: Attempt to invoke interface method 'int java.lang.CharSequence.length()' on a null object reference at java.util.regex.Matcher.reset(Matcher.java:1052) at java.util.regex.Matcher.(Matcher.java:180) at java.util.regex.Pattern.matcher(Pattern.java:1006) at com.google.android.gms.internal.zzelv.zzqh(Unknown Source:2) at com.google.firebase.database.DataSnapshot.hasChild(Unknown Source:12) at com.rough.tuber.tuber.StudentChatActivity$1.onDataChange(StudentChatActivity.java:92) at com.google.android.gms.internal.zzegf.zza(Unknown Source:13) at com.google.android.gms.internal.zzeia.zzbyc(Unknown Source:2) at com.google.android.gms.internal.zzeig.run(Unknown Source:71) at android.os.Handler.handleCallback(Handler.java:790) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:164) at android.app.ActivityThread.main(ActivityThread.java:6494) at java.lang.reflec t.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
Firebase enter image description here enter image description here
On your onCreate() method, you are calling valueEventListener on mRootRef though you have not initialized it. Also database path should be from 'current_uid' as per your database structure.
Instead of initializing mRootRef on onActivityResult initialize it on onCreateMethod():
.......
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_chat);
........
mRootRef = FirebaseDatabase.getInstance().getReference();
.......
mRootRef.child("Chat").child(current_uid)
.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
.........
Updated for your persisting error.
From your error log its clear.
com.google.firebase.database.DatabaseException: Invalid Firebase Database path: com.google.firebase.auth.internal.zzh@329c22b. Firebase Database paths must not contain '.', '#', '$', '[', or ']'
Your Database path is containing some non expected characters in path. you need to avoid that .
So print your database path and ensure that there is no any '.', '#', '$', '[', or ']'
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.