Probleme avec attachChildListener

Résolu
CR16_Padawan Messages postés 54 Date d'inscription mercredi 7 juin 2023 Statut Membre Dernière intervention 24 avril 2024 - 7 oct. 2023 à 12:30
CR16_Padawan Messages postés 54 Date d'inscription mercredi 7 juin 2023 Statut Membre Dernière intervention 24 avril 2024 - 7 oct. 2023 à 15:36

Bonjour le forum,

une fois de plus j'ai besoin de vous. 

mon problème est que après l'authentification sur firebase ma page sur android studio s'ouvre et se ferme instantanement.

voici ce qui est dans mon code

private void attachChildListener() {
        if (childEventListener == null) {
            childEventListener = new ChildEventListener() {
                @Override
                public void onChildAdded(DataSnapshot dataSnapshot, String s) {

                    Message message = dataSnapshot.getValue(Message.class);
                    message.setUid(dataSnapshot.getKey());
                    adapter.addMessage(message);
                    recycler.scrollToPosition(adapter.getItemCount() - 1);
                }

Logcat

Process: fr.xxx.xxx, PID: 7741
com.google.firebase.database.DatabaseException: Failed to convert a value of type java.lang.String to long
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertLong(CustomClassMapper.java:385)
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToPrimitive(CustomClassMapper.java:296)
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToClass(CustomClassMapper.java:215)
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToType(CustomClassMapper.java:179)
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.access$100(CustomClassMapper.java:48)
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper$BeanMapper.deserialize(CustomClassMapper.java:593)
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper$BeanMapper.deserialize(CustomClassMapper.java:563)
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertBean(CustomClassMapper.java:433)
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToClass(CustomClassMapper.java:232)
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertToCustomClass(CustomClassMapper.java:80)
at com.google.firebase.database.DataSnapshot.getValue(DataSnapshot.java:202)
at fr.xxx.xxx.activities.TchatActivity$3.onChildAdded(TchatActivity.java:177)
at
com.google.firebase.database.core.ChildEventRegistration.fireEvent(ChildEventRegistration.java:79)
at com.google.firebase.database.core.view.DataEvent.fire(DataEvent.java:63)
at com.google.firebase.database.core.view.EventRaiser$1.run(EventRaiser.java:55)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)

D'aprés le rapport Logcat, l'erreur a l'air de se situer sur la ligne "message.setUid(dataSnapshot.getKey());" et serait un soucis de convertion entre String et Long.

Je ne vois pas comment résoudre ce probléme.

Demandé moi ce que vous avez besoin pour y voir plus clair.

Merci d'avance.


1 réponse

CR16_Padawan Messages postés 54 Date d'inscription mercredi 7 juin 2023 Statut Membre Dernière intervention 24 avril 2024
7 oct. 2023 à 15:36

Re: alors maintenant je peux ouvrir ma page, sauf que mes messages ne s'affichent pas avec les bonnes infos et pire tout le monde peut lire les messages!!

explications:

j'utilise 3 utilisateurs différents, (id unique a l'inscription), pour tester mon affichage.

seul 2 utilisateurs ont des messages enregistré sur firebase realtime et pour lesquels les donnés récupérés sont partiellement correct:

1ere erreur: (valeur du message=Ok; mais nom de l'utilisateur=message)

2eme erreur: le 3eme utilisateur affiche tous les messages avec l'erreur1!!

Deplus lors de l'envoi d'un message mon affichage se modifie bien mais rien ne s'inscrit dans firebase.

integralité du code:

package fr.xxx.xxx.activities;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import androidx.appcompat.widget.Toolbar;

import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
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 java.util.ArrayList;

import fr.xxx.xxx.Adapters.TchatAdapter;
import fr.xxx.xxx.R;
import fr.xxx.xxx.utilities.Constants;
import fr.xxx.xxx.utilities.Message;

public class TchatActivity extends AppCompatActivity {

    private EditText etMessage;
    private ImageButton sendButton;
    private FirebaseAuth mAuth;
    private FirebaseDatabase mDatabase;
    private DatabaseReference mRef;
    private FirebaseAuth.AuthStateListener authStateListener;
    private ChildEventListener childEventListener;
    private RecyclerView recycler;
    private SharedPreferences prefs;
    private String username;
    private String userId;
    private TchatAdapter adapter;

    private static final String TAG ="TCHAT";

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

        // initialisation de toolbar

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        toolbar.setTitle("?? Tchat");
        ;
        setSupportActionBar(toolbar);

        // initialisation des vues
        initViews();
        initFirebase();

        prefs = getSharedPreferences("PreferenceManager",MODE_PRIVATE);

        authStateListener = new FirebaseAuth.AuthStateListener() {
            @Override
            public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
                FirebaseUser user = firebaseAuth.getCurrentUser();
                if (user != null) {

                    attachChildListener();
                    username = prefs.getString("NAME", null);
                    userId = user.getUid();
                    adapter.setUser(user);

                } else {
                    startActivity(new Intent(getApplicationContext(), Next.class));
                    finish();
                }
            }
        };
    }
    private void initViews(){
        etMessage = (EditText) findViewById(R.id.etMessage);
        sendButton = (ImageButton) findViewById(R.id.sendButton);
        recycler = (RecyclerView) findViewById(R.id.recycler);

        LinearLayoutManager manager = new LinearLayoutManager(this);
        manager.setStackFromEnd(true);;
        recycler.setLayoutManager(manager);
        ArrayList<Message> messages = new ArrayList<>();
        adapter = new TchatAdapter(messages);
        recycler.setAdapter(adapter);


        sendButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                sendMessage();
        etMessage.setOnEditorActionListener(new TextView.OnEditorActionListener() {

            @Override
            public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) {

                if(i == EditorInfo.IME_ACTION_DONE){
                    sendMessage();
                    InputMethodManager imm = (InputMethodManager) textView.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
                    imm.hideSoftInputFromWindow(textView.getWindowToken(),0);
                    return true;
                }

                return false;
            }
        });

            }
        });

    }

    private void initFirebase(){
        mAuth = FirebaseAuth.getInstance();
        mDatabase = FirebaseDatabase.getInstance();
        mRef = mDatabase.getReference();
    }

    @Override
    public boolean onCreateOptionsMenu (Menu menu){
        getMenuInflater().inflate(R.menu.menu_deconnexion, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        if(item.getItemId() == R.id.logout){

            //TODO
        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    protected void onPause() {
        super.onPause();
        if(authStateListener !=null){
            mAuth.removeAuthStateListener(authStateListener);
        }
        detachChildListener();
    }

    @Override
    protected void onResume() {
        super.onResume();
        mAuth.addAuthStateListener(authStateListener);
    }
    private void attachChildListener() {
        if (childEventListener == null) {
            childEventListener = new ChildEventListener() {
                @Override
                public void onChildAdded(DataSnapshot dataSnapshot, String s) {

                    Log.w(TAG, "onChildAdded: ");
                    Message message = dataSnapshot.getValue(Message.class);
                    message.setUid(dataSnapshot.getKey());
                    adapter.addMessage(message);
                    recycler.scrollToPosition(adapter.getItemCount() - 1);
                }

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

                }

                @Override
                public void onChildRemoved(DataSnapshot dataSnapshot) {
                   /* Message message = dataSnapshot.getValue(Message.class);
                    message.setUid(dataSnapshot.getKey());
                    adapter.deleteMessage(message);*/
                }

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

                }

                @Override
                public void onCancelled(DatabaseError error) {

                }
            };

// ".limitToLast(100)" a ajouter apres "mRef.child(Constants.KEY_MESSAGES_DB)" pour limiter le nbre de messages a afficher

            mRef.child(Constants.KEY_MESSAGES_DB).addChildEventListener(childEventListener);
        }
    }

    private void detachChildListener(){
        if (childEventListener!=null){
            mRef.child(Constants.KEY_MESSAGES_DB).removeEventListener(childEventListener);
            childEventListener=null;

        }
    }
    private void sendMessage() {
        String content = etMessage.getText().toString();
        if(!TextUtils.isEmpty(content)){
            Message message= new Message(null,userId, content, null);
            mRef.child(Constants.KEY_MESSAGES_DB).push().setValue(message);
            etMessage.setText("");
        }
    }
}

Merci pour vos réponses.

0