Фон
Мое приложение позволяет пользователям публиковать изображения в определенных категориях, а затем позволяет пользователям нажимать на сообщения, чтобы вызвать функцию обмена сообщениями.
проблема
В настоящее время он настроен таким образом, что это глобальный чат (любой пользователь может присоединиться к нему, и он был одинаковым для всех сообщений, читающих и пишущих из одного и того же документа) для целей тестирования, но я хочу, чтобы он был личным чатом между двумя пользователи. Это было создано с использованием базы данных в реальном времени, в которой я нахожусь в процессе миграции в Firestore, поэтому мне также придется изменить код для "chatActivity"
Что я сделал
Когда сообщение создано, оно добавляет новый документ в коллекцию сообщений для этого сообщения. Имя документа сообщений, связанное с этим сообщением, затем сохраняется в сообщении.
Где я застрял
В своей работе в чате мне нужно иметь возможность получить идентификатор сообщения, чтобы затем можно было найти местоположение документа, содержащего сообщения, связанные с этим сообщением.
Задача
Чтобы пользователи могли публиковать изображения и иметь документ в коллекции "Сообщения", они должны быть созданы ЗАВЕРШЕНЫ, чтобы второй пользователь пришел и увидел упоминание упомянутого изображения, а затем смог открыть тот документ, который был создан для изображение, чтобы два пользователя могли затем обмениваться сообщениями друг с другом, делая его закрытым для двух пользователей, потому что они читают только из документа, связанного с этим сообщением
рабочий процесс приложения это должно устранить любую путаницу
База данных:
Код для записи поста в базу данных:
filePath.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
@Override
public void onSuccess(Uri uri) {
final String downloadUrl =
uri.toString();
Log.d("tag", downloadUrl);
FirebaseUser current_user = FirebaseAuth.getInstance().getCurrentUser();
String uid = Objects.requireNonNull(current_user).getUid();
final Map<String, Object> postMap = new HashMap<>();
// No thumb ?????
postMap.put("image_url", downloadUrl);
postMap.put("desc", desc);
postMap.put("user_id", current_user_id);
postMap.put("message Doc", uid + postCategory);
postMap.put("timestamp", FieldValue.serverTimestamp());
firebaseFirestore.collection(postCategory).add(postMap).addOnCompleteListener(new OnCompleteListener<DocumentReference>() {
@Override
public void onComplete(@NonNull Task<DocumentReference> task) {
if (task.isSuccessful()) {
firebaseFirestore.collection("Posts").add(postMap).addOnCompleteListener(new OnCompleteListener<DocumentReference>() {
@Override
public void onComplete(@NonNull Task<DocumentReference> task) {
FirebaseUser current_user = FirebaseAuth.getInstance().getCurrentUser();
String uid = Objects.requireNonNull(current_user).getUid();
final Map<String, String> chatMap = new HashMap<>();
postMap.put("timestamp", FieldValue.serverTimestamp());
postMap.put("name", current_user_id);
postMap.put("message", "");
firebaseFirestore.collection("Messages")
.document(uid + postCategory)
.set(chatMap)
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
}
});
Код для чата
public class ChatActivity extends AppCompatActivity {
public static final int DEFAULT_MSG_LENGTH_LIMIT = 1000;
private static final int GALLERY_PICK = 1;
private ListView mMessageListView;
private MessageAdapter mMessageAdapter;// This is to do with the file messageadapter\
private ProgressBar mProgressBar;
private ImageButton mPhotoPickerButton;
private EditText mMessageEditText;
private Button mSendButton;
private String mUsername;
private FirebaseDatabase mFirebaseDatabase;
private DatabaseReference mMessagedatabaseReference;
private ChildEventListener mChildEventListner;
private ValueEventListener mValueEventListner;
private FirebaseUser mCurrentUser;
private FirebaseStorage mFirebaseStorage;
private ProgressDialog mProgressDialog;
private StorageReference mChatPhotosStorageReference;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.chat_activity);
mFirebaseDatabase = FirebaseDatabase.getInstance();
mMessagedatabaseReference = mFirebaseDatabase.getReference().child("messages");
//new shit
// Map<String, Object> usersChat = new HashMap<>();
// usersChat.put("user 1 id", mCurrentUser);
// usersChat.put("user2Id", )
mFirebaseStorage = FirebaseStorage.getInstance();
mChatPhotosStorageReference = mFirebaseStorage.getReference().child("chat_photos");
// Initialize references to views
mProgressBar = (ProgressBar) findViewById(R.id.progressBar);
mMessageListView = (ListView) findViewById(R.id.messageListView);
mPhotoPickerButton = (ImageButton) findViewById(R.id.photoPickerButton);
mMessageEditText = (EditText) findViewById(R.id.messageEditText);
mSendButton = (Button) findViewById(R.id.sendButton);
mCurrentUser = FirebaseAuth.getInstance().getCurrentUser();
final String current_uid = mCurrentUser.getUid();
// Initialize progress bar
mProgressBar.setVisibility(ProgressBar.INVISIBLE);
//Initialize message ListView and its adapter
List<FriendlyMessage> friendlyMessages = new ArrayList<>();
mMessageAdapter = new MessageAdapter(this, R.layout.item_message, friendlyMessages);
mMessageListView.setAdapter(mMessageAdapter);
// ImagePickerButton shows an image picker to upload a image for a message
mPhotoPickerButton.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);
}
});
// Enable Send button when there text to send
mMessageEditText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
if (charSequence.toString().trim().length() > 0) {
mSendButton.setEnabled(true);
} else {
mSendButton.setEnabled(false);
}
}
@Override
public void afterTextChanged(Editable editable) {
}
});
mMessageEditText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(DEFAULT_MSG_LENGTH_LIMIT)});
// Send button sends a message and clears the EditText
mSendButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
FriendlyMessage friendlyMessage = new FriendlyMessage(mMessageEditText.getText().toString());
mMessagedatabaseReference.push().setValue(friendlyMessage);
// Clear input box
mMessageEditText.setText("");
}
});
mChildEventListner = new ChildEventListener() {
@Override
public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
FriendlyMessage friendlyMessage = dataSnapshot.getValue(FriendlyMessage.class);
mMessageAdapter.add(friendlyMessage);
}
@Override
public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
}
@Override
public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
};
mMessagedatabaseReference.addChildEventListener(mChildEventListner);
mSendButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
FriendlyMessage friendlyMessage = new FriendlyMessage(mMessageEditText.getText().toString(), current_uid, null);
mMessagedatabaseReference.push().setValue(friendlyMessage);
// Clear input box
mMessageEditText.setText("");
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == GALLERY_PICK && resultCode == RESULT_OK) {
Uri selectedImageUri = data.getData();
final StorageReference photoRef = mChatPhotosStorageReference.child(selectedImageUri.getLastPathSegment());
photoRef.putFile(selectedImageUri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
photoRef.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
@Override
public void onSuccess(Uri uri) {
String downloadUrl = uri.toString();
Log.d("tag", downloadUrl);
FriendlyMessage friendlyMessage = new FriendlyMessage(null, mUsername, downloadUrl);
mMessagedatabaseReference.push().setValue(friendlyMessage);
}
});
}
});
}
}
Где я застрял
В своей работе в чате мне нужно иметь возможность получить идентификатор сообщения, чтобы затем можно было найти местоположение документа, содержащего сообщения, связанные с этим сообщением.
я не уверен, вы хотите получить все идентификаторы или только один идентификатор?
если вы хотите получить документ ALL id
из music
коллекции из магазина, пожалуйста, добавьте это в свой код:
public void loadAlltQueries(){
Query loadAllQueryId = firebaseFirestore
.collection("music")
.orderBy("timestamp", Query.Direction.DESCENDING);
loadAllQueryId.addSnapshotListener(new EventListener<QuerySnapshot>(){
@Override
public void onEvent(QuerySnapshot documentSnapshots, FirebaseFirestoreException e){
for (DocumentChange doc : documentSnapshots.getDocumentChanges()){
if (doc.getType() == DocumentChange.Type.ADDED){
String musicId = doc.getDocument().getId();
FriendlyMessage friendlyMessage = doc.getDocument().toObject(FriendlyMessage.class).withId(musicId);
mMessageAdapter.add(friendlyMessage);
mMessageAdapter.notifyDataSetChanged(); //for update adapter
}
}
}
});
}
и сделать MusicId.class
public class MusicId{
@Exclude
public String MusicId;
public <T extends MusicId> T withId(@NonNull final String id) {
this.MusicId = id;
return (T) this;
}
}
не забудьте добавить это в Your FriendlyMessage.class
public class FriendlyMessage extends MusicId {
// your constructor
// your getter
}
и из вашего класса адаптера получить свой геттер
final String musicId = contentList.get(position).MusicId;
и теперь вы получите свой идентификатор CHur40Nr..
Если вы хотите получить идентификатор поста, который соответствует любому посту, выбранному из представления переработчика. Пожалуйста, сделайте класс holder.setMessage(message);
, потому что метод holder
получит ваше сообщение, которое вы выбрали в этом случае holder для holder.setMessage(message);
public class AdapterFriendlyMessage extends RecyclerView.Adapter<FriendlyMessage.ViewHolder> {
public List<FriendlyMessage> contentList;
public Context context;
private FirebaseFirestore firebaseFirestore;
private FirebaseAuth firebaseAuth;
public AdapterFriendlyMessage(List<FriendlyMessage> contentList){
this.contentList = contentList;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.content_friendly_message, parent, false);
context = parent.getContext(); FriendlyMessage(container.getContext(), contentList);
firebaseFirestore = FirebaseFirestore.getInstance();
firebaseAuth = FirebaseAuth.getInstance();
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.setRecyclable(false);
// GET MusicId
final String musicId = contentList.get(position). MusicId;
final String currentUserId = firebaseAuth.getCurrentUser().getUid();
String uid = contentList.get(position).getUid();
firebaseFirestore.collection(" Music").document( musicId).collection("FriendlyMessage").get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>(){
@Override
public void onComplete(@NonNull Task<DocumentSnapshot> task){
if (task.isSuccessful()) {
String message = task.getResult().getString("message");
holder.setMessage(message); // this is what you want
}
}
});
}
@Override
public int getItemCount() {
return contentList.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
private View mView;
private TextView txtMessage;
public ViewHolder(View itemView){
super(itemView);
mView = itemView;
}
public void setMessage(Sting text) {
txtMessage = mView.findViewById(R.id.text_view_mesage);
txtMessage.setText(text);
}
}
}
не забудьте передать id из firestore в открытый класс Adapter FriendlyMessageRoom extends Fragment {
private RecyclerView recyclerMessage;
private List<FriendlyMessage > contentList;
private AdapterFriendlyMessage adapterFriendlyMessage;
private FirebaseFirestore firebaseFirestore;
private FirebaseAuth mAuth;
public FriendlyMessageRoom() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_friendly_message_room, container, false);
mAuth = FirebaseAuth.getInstance();
firebaseFirestore = FirebaseFirestore.getInstance();
contentList = new ArrayList<>();
recyclerMessage = view.findViewById(R.id.recycler_message);
adapterFriendlyMessage = new AdapterFriendlyMessage(contentList);
recyclerMessage.setLayoutManager(new LinearLayoutManager(container.getContext()));
recyclerMessage.setAdapter(adapterFriendlyMessage);
return view;
}
@Override
public void onStart() {
super.onStart();
loadAlltQueries(); // please see firebase query that i write above
}
ПРИМЕЧАНИЕ: мой ответ может не дать точного ответа на ваш вопрос, так как трудно представить, что вы хотите в описании проблемы.