android - Twilio 安卓 : Issue in joining a channel : "Member already exists"

标签 android twilio chat channel-api

我在 android 中使用 Twilio 可编程聊天 API 进行一对一聊天。

以下是我的用例:

1) I create a unique channel name
2) Check if the channel already exists or not
   if channel exists:
     user joins channel
   else
     create a channel with unique name
     user joins channel
   end

现在,发生的事情是,当我尝试加入 channel 时,出现错误:“成员已存在”。因此,此时如果我尝试检查 channel 的成员,我会得到 Member 对象为空。 在这一点上我有两个疑问:

1) 如果这个成员已经是 channel 的一部分,用户对象不应该包含这个成员吗? 2) 如果用户已经是 channel 的一部分,我应该能够通过添加 channelListener 向 channel 发送消息,在这种情况下不会发生这种情况。

我不明白这个问题。以下是我的代码 fragment :

ChatClient.Properties props = new ChatClient.Properties.Builder()
            .createProperties();
ChatClient.create(ChatActivity.this, accessToken, props, mChatClientCallback);

private CallbackListener<ChatClient> mChatClientCallback =
    new CallbackListener<ChatClient>() {
        @Override
        public void onSuccess(ChatClient chatClient) {
            mChatClient = chatClient;
            //loadChannels();
            Log.i(TAG, "Success creating Twilio Chat Client");
            createOrJoinChannel();
        }

        @Override
        public void onError(ErrorInfo errorInfo) {
            Log.i(TAG,"Error creating Twilio Chat Client: " + errorInfo.getMessage());
        }
    };


 private void createOrJoinChannel(){
    //Only SID or unique name of channel can be supplied as parameter
      mChatClient.getChannels().getChannel(UNIQUE_CHANNEL_NAME, new CallbackListener<Channel>() {
        @Override
        public void onSuccess(Channel channel) {
            if (channel != null) {
                joinChannel(channel);
            } else {
                Log.i(TAG, "Error occurred in getting channel");
            }
        }

        @Override
        public void onError(ErrorInfo errorInfo) {
            Log.i(TAG,"Error retrieving channel: " + errorInfo.getMessage());
            createChannel();
        }
    });
}

 private void joinChannel(final Channel channel) {
    Log.i(TAG, "inside join channel" + channel.getUniqueName());
    Log.i(TAG, "channel status: " + channel.getStatus());

    Members members = channel.getMembers();
    if(members!=null){
        ArrayList<Member> list = (ArrayList<Member>) members.getMembersList();
        for(int i=0; i<list.size(); i++){
            Log.i(TAG, "member " + i + list.get(i).getIdentity());
        }
    }else{
        Log.i(TAG, "null object"); //Getting this even when I get 
                                   //"Member already exists" error
    }

    channel.join(new StatusListener() {
        @Override
        public void onSuccess() {
            mGeneralChannel = channel;
            mGeneralChannel.addListener(mDefaultChannelListener);
        }

        @Override
        public void onError(ErrorInfo errorInfo) {
            //Error joining channel: Member already exists
            Log.i(TAG,"Error joining channel: " + errorInfo.getMessage());
    });
}

 private void createChannel(){
    mChatClient.getChannels().createChannel(FRIENDLY_CHANNEL_NAME,
        Channel.ChannelType.PUBLIC, new CallbackListener<Channel>() {
            @Override
            public void onSuccess(Channel channel) {
                if (channel != null) {
                   setUniqueNameAndJoin(channel);
                }
            }

            @Override
            public void onError(ErrorInfo errorInfo) {
                Log.i(TAG,"chats: " + "Unique name could not be set: " + errorInfo.getMessage());
            }
        });
 }

 private void setUniqueNameAndJoin(final Channel channel){
    channel.setUniqueName(UNIQUE_CHANNEL_NAME, new StatusListener() {
        @Override
        public void onSuccess() {
            Log.i(TAG, "channel with unique name created " + channel.getUniqueName());
            joinChannel(channel);
        }

        @Override
        public void onError(ErrorInfo errorInfo) {
            super.onError(errorInfo);
        }
    });

}


private ChannelListener mDefaultChannelListener = new ChannelListener() {
    @Override
    public void onMessageAdded(final Message message) {
        Log.i(TAG, "Message added");
        ChatActivity.this.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                // need to modify user interface elements on the UI thread
                mMessages.add(message);
                mMessagesAdapter.notifyItemInserted(mMessages.size()-1);
            }
        });
    }

    @Override
    public void onMessageUpdated(Message message, Message.UpdateReason updateReason) {
        Log.i(TAG, "Message updated: " + message.getMessageBody());
    }

    @Override
    public void onMessageDeleted(Message message) {
        Log.d(TAG, "Message deleted");
    }

    @Override
    public void onMemberAdded(Member member) {
        Log.i(TAG, "Member added: " + member.getIdentity());
    }

    @Override
    public void onMemberUpdated(Member member, Member.UpdateReason updateReason) {
    }

    @Override
    public void onMemberDeleted(Member member) {

    }

    @Override
    public void onTypingStarted(Channel channel, Member member) {

    }

    @Override
    public void onTypingEnded(Channel channel, Member member) {

    }

    @Override
    public void onSynchronizationChanged(Channel channel) {

    }
};

有人可以向我解释一下,我做错了什么或者正确的做事方式应该是什么?提前致谢!

最佳答案

此处为 Twilio 开发人员布道师。

您需要检查当前用户的 channel 状态,使用 channel.getStatus() . Android chat tutorial 中有一个很好的例子.

if (this.currentChannel.getStatus() == Channel.ChannelStatus.JOINED) {
    // already in the channel, load the messages
} else {
    // join the channel
}

关于android - Twilio 安卓 : Issue in joining a channel : "Member already exists",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50736285/

相关文章:

安卓聊天应用开发

android - 如果应用程序在前台,则替代操作的设计模式?

android - LinearLayout 没有设置所需的 layout_height 属性

java - 在另一个 JFrame 表单中获取一个 JFrame 表单的原始 boolean 类型的值?

python - 如何向python脚本发送短信?

c# - 如何跳过库函​​数中的某些可选参数

ios - observables 和 UItableview 可见单元格

java - 如何构建具有相同源代码但不同资源的不同 APK

android - Xamarin android AsyncTaskLoad 类

twilio - 是否可以在 Twilio Studio 中连接流?