Probleme avec attachChildListener
RésoluCR16_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.
1 réponse
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.