Android Messenger 应用程序在登录后崩溃
Posted
技术标签:
【中文标题】Android Messenger 应用程序在登录后崩溃【英文标题】:Android messenger app crashes after signing in 【发布时间】:2018-10-16 04:40:34 【问题描述】:这在 logcat 中显示;如何解决?
com.google.firebase.database.DatabaseException:类 com.chatapp.ChatMessage 没有定义无参数构造函数。如果 您正在使用 ProGuard,请确保这些构造函数没有被剥离。 在 com.google.android.gms.internal.firebase_database.zzku.zza(未知 资源) 在 com.google.android.gms.internal.firebase_database.zzkt.zzb(未知 资源) 在 com.google.android.gms.internal.firebase_database.zzkt.zza(未知 资源) 在 com.google.firebase.database.DataSnapshot.getValue(未知来源) 在 com.firebase.ui.database.FirebaseListAdapter.parseSnapshot(FirebaseListAdapter.java:127) 在 com.firebase.ui.database.FirebaseListAdapter.getItem(FirebaseListAdapter.java:116) 在 com.firebase.ui.database.FirebaseListAdapter.getView(FirebaseListAdapter.java:146) 在 android.widget.AbsListView.obtainView(AbsListView.java:2370) 在 android.widget.ListView.makeAndAddView(ListView.java:1970) 在 android.widget.ListView.fillDown(ListView.java:704) 在 android.widget.ListView.fillFromTop(ListView.java:765) 在 android.widget.ListView.layoutChildren(ListView.java:1716) 在 android.widget.AbsListView.onLayout(AbsListView.java:2162) 在 android.view.View.layout(View.java:17663) 在 android.view.ViewGroup.layout(ViewGroup.java:5577) 在 android.widget.RelativeLayout.onLayout(RelativeLayout.java:1079) 在 android.view.View.layout(View.java:17663) 在 android.view.ViewGroup.layout(ViewGroup.java:5577) 在 android.widget.FrameLayout.layoutChildren(FrameLayout.java:323) 在 android.widget.FrameLayout.onLayout(FrameLayout.java:261) 在 android.view.View.layout(View.java:17663) 在 android.view.ViewGroup.layout(ViewGroup.java:5577) 在 android.support.v7.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:443) 在 android.view.View.layout(View.java:17663) 在 android.view.ViewGroup.layout(ViewGroup.java:5577) 在 android.widget.FrameLayout.layoutChildren(FrameLayout.java:323) 在 android.widget.FrameLayout.onLayout(FrameLayout.java:261) 在 android.view.View.layout(View.java:17663) 在 android.view.ViewGroup.layout(ViewGroup.java:5577) 在 android.widget.LinearLayout.setChildFrame(LinearLayout.java:1741) 在 android.widget.LinearLayout.layoutVertical(LinearLayout.java:1585) 在 android.widget.LinearLayout.onLayout(LinearLayout.java:1494) 在 android.view.View.layout(View.java:17663) 在 android.view.ViewGroup.layout(ViewGroup.java:5577) 在 android.widget.FrameLayout.layoutChildren(FrameLayout.java:323) 在 android.widget.FrameLayout.onLayout(FrameLayout.java:261) 在 com.android.internal.policy.DecorView.onLayout(DecorView.java:729) 在 android.view.View.layout(View.java:17663) 在 android.view.ViewGroup.layout(ViewGroup.java:5577) 在 android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2407) 在 android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2129) 在 android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1315) 在 android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6435) 在 android.view.Choreographer$CallbackRecord.run(Choreographer.java:876) 在 android.view.Choreographer.doCallbacks(Choreographer.java:688) 在 android.view.Choreographer.doFrame(Choreographer.java:623) 在 android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:862) 在 android.os.Handler.handleCallback(Handler.java:754) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:163) 在 android.app.ActivityThread.main(ActivityThread.java:6210) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:791)
这是我的代码-
private static int SIGN_IN_REQUEST_CODE = 1;
private FirebaseListAdapter<ChatMessage> adapter;
RelativeLayout activity_main;
FloatingActionButton fab;
@Override
public boolean onOptionsItemSelected(MenuItem item)
if(item.getItemId() == R.id.menu_sign_out)
AuthUI.getInstance().signOut(this).addOnCompleteListener(new OnCompleteListener<Void>()
@Override
public void onComplete(@NonNull Task<Void> task)
Snackbar.make(activity_main,"You have been signed out.", Snackbar.LENGTH_SHORT).show();
finish();
);
return true;
@Override
public boolean onCreateOptionsMenu(Menu menu)
getMenuInflater().inflate(R.menu.main_menu,menu);
return true;
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == SIGN_IN_REQUEST_CODE)
if(resultCode ==RESULT_OK)
Snackbar.make(activity_main,"Successfully signed in.Welcome!", Snackbar.LENGTH_SHORT).show();
displayChatMessage();
else
Snackbar.make(activity_main,"We couldn't sign you in.Please try again later", Snackbar.LENGTH_SHORT).show();
finish();
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
activity_main = (RelativeLayout) findViewById(R.id.activity_main);
fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View view)
EditText input = (EditText) findViewById(R.id.input);
FirebaseDatabase.getInstance().getReference().push().setValue(new ChatMessage(input.getText().toString(), FirebaseAuth.getInstance().getCurrentUser().getEmail()));
input.setText("");
);
//Check if not sign-in then navigate Signin page
if(FirebaseAuth.getInstance().getCurrentUser() == null)
startActivityForResult(AuthUI.getInstance().createSignInIntentBuilder().build(),SIGN_IN_REQUEST_CODE);
else
Snackbar.make(activity_main,"Welcome "+FirebaseAuth.getInstance().getCurrentUser().getEmail(),Snackbar.LENGTH_SHORT).show();
//Load content
displayChatMessage();
private void displayChatMessage()
ListView listOfMessage = (ListView) findViewById(R.id.list_of_message);
adapter = new FirebaseListAdapter<ChatMessage>(this,ChatMessage.class,R.layout.list_item,FirebaseDatabase.getInstance().getReference())
@Override
protected void populateView(View v, ChatMessage model, int position)
//Get references to the views of list_item.xml
TextView messageText,messageUser,messageTime;
messageText = (TextView) v.findViewById(R.id.message_text);
messageUser = (TextView) v.findViewById(R.id.message_user);
messageTime = (TextView) v.findViewById(R.id.message_time);
messageText.setText(model.getMessageText());
messageUser.setText(model.getMessageUser());
messageTime.setText(DateFormat.format("dd-MM-yyyy (HH:mm:ss)",model.getMessageTime()));
;
listOfMessage.setAdapter(adapter);
gradle-
//Add Library
implementation 'com.android.support:design:26.1.0'
implementation 'com.firebaseui:firebase-ui:1.1.1'
implementation 'com.google.firebase:firebase-core:15.0.2'
implementation 'com.google.firebase:firebase-storage:15.0.2'
implementation 'com.google.firebase:firebase-database:15.0.1'
implementation 'com.google.firebase:firebase-auth:15.1.0' // ADDED
implementation 'com.google.android.gms:play-services-auth:15.0.1' // ADDED
implementation 'com.firebaseui:firebase-ui-auth:2.3.0'
implementation('com.facebook.android:facebook-android-sdk:4.22.1')
ChatMessage.java -
public class ChatMessage
private String messageText;
private String messageUser;
private long messageTime;
public ChatMessage(String messageText, String messageUser)
this.messageText = messageText;
this.messageUser = messageUser;
messageTime = new Date().getTime();
public String getMessageText()
return messageText;
public String getMessageUser()
return messageUser;
public long getMessageTime()
return messageTime;
【问题讨论】:
【参考方案1】:您应该在 ChatMessage.java 中添加一个默认构造函数,如下所示。
public class ChatMessage
// an empty constructor for Firebase
public ChatMessage()
...
【讨论】:
你试过配置proguard吗?你可以找到一些说明here.以上是关于Android Messenger 应用程序在登录后崩溃的主要内容,如果未能解决你的问题,请参考以下文章
Android基础——Messenger在跨进程通信中的使用
在 Android 中打开 Facebook Messenger
Firebase 提供商登录在 facebook/messenger/instagram 应用内浏览器 webview 中不起作用。错误 403:disallowed_useragent