Probleme avec attachChildListener

Résolu
CR16_Padawan Messages postés 61 Date d'inscription   Statut Membre Dernière intervention   -  
CR16_Padawan Messages postés 61 Date d'inscription   Statut Membre Dernière intervention   -

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.


CR16_Padawan

1 réponse

  1. CR16_Padawan Messages postés 61 Date d'inscription   Statut Membre Dernière intervention   1
     

    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