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

使用 Java 登录 www.messenger.com

如何从 android 应用程序将纯文本共享到 facebook messenger

Android进程间的通信之Messenger