android融云消息免打扰

刚刚接到这个需求,感觉应该特别简单,看了下,网上有例子,但是说的不是特别详细,在官网上看了一下,然后总结了一下,终于也是被搞定,

不得不说官网也是比较坑,官网上给的例子的一些方法好多都已经过期了,一开始写的时候,发现长按事件之后怎么也出发不了回调,后来找到了融云官方的jdk,才发现已经过期了,新的融云列表事件监听用的是

RongIM.setConversationListBehaviorListener();

一共有四个回调方法分别是:

头像点击事件

@Override
public boolean onConversationPortraitClick(Context context, Conversation.ConversationType conversationType, String s) {
                return false;
 }

头像长按事件

 @Override
 public boolean onConversationPortraitLongClick(Context context, Conversation.ConversationType conversationType, String s) {
    return false; 
 }

消息点击事件

@Override
public boolean onConversationClick(Context context, View view, UIConversation uiConversation) {
       return false;
}

消息长按事件

@Override
public boolean onConversationLongClick(final Context context, View view, final UIConversation uiConversation) {
       return false;
}

我们需要处理的就是onConversationLongClick()方法,首先把返回值更改为true,调用的时候就会调用我们自定义的弹框,而不是融云提供的


首先我们需要先自定好弹窗代码如下:

/*聊天浮层*/
public static void Chatshow(final Context mContext, String title,final OnFloatingLayerClickLisenter onOKClickLisenter) {
    AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
    final AlertDialog alertDialog = builder.create();
    alertDialog.show();
    alertDialog.getWindow().setContentView(R.layout.chatlist_dia);
    TextView closeBtn = (TextView) alertDialog.getWindow().findViewById(R.id.btn_delete);
    TextView upgradeText = (TextView) alertDialog.getWindow().findViewById(R.id.nomsg);
    upgradeText.setText(title);
    upgradeText.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            alertDialog.dismiss();
            onOKClickLisenter.onOkClick();
        }
    });
    closeBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            alertDialog.dismiss();
            onOKClickLisenter.onDismiss();

        }
    });
    alertDialog.setCancelable(true);
    alertDialog.setCanceledOnTouchOutside(true);
    alertDialog.show();
}


布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:background="@color/white"
    android:layout_height="wrap_content">
    <TextView
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:gravity="center"
        android:textSize="15sp"
        android:id="@+id/btn_delete"
        android:textColor="#504f60"
        android:text="删除"
        />

    <View style="@style/lineView"/>
    <TextView
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:gravity="center"
        android:id="@+id/nomsg"
        android:textSize="15sp"
        android:textColor="#504f60"
        android:text="免打扰"
        />

</LinearLayout>


效果图就是这样子:



接下来我们需要在长按事件中处理我们的操作了,首先第一步,我们需要获取到当前消息是否免打扰

 RongIM.getInstance().getConversationNotificationStatus(Conversation.ConversationType.PRIVATE,
                        uiConversation.getConversationTargetId(), new RongIMClient.ResultCallback<Conversation.ConversationNotificationStatus>() {
                            @Override
                            public void onSuccess(final Conversation.ConversationNotificationStatus conversationNotificationStatus) {
                                

                            }




                            @Override
                            public void onError(RongIMClient.ErrorCode errorCode) {


                            }

                        });

成功之后返回了一个conversationNotificationStatus对象,这个对象是干嘛用的呢,里面就包含了当前的是否免打扰的信息,他有一个getvalue()方法,返回值是一个int型的,1=未开启免打扰,0=开启免扰,也就是说是1的时候点击出现弹窗显示的是开启免打扰,0的时候关闭免打扰。但是此处有一个小坑就是,你获取到这个值之后,点击设置免打扰,会发现无效,先来看看如果设置免打扰的方法吧;

RongIM.getInstance().setConversationNotificationStatus(Conversation.ConversationType.PRIVATE,
                                                uiConversation.getConversationTargetId(), conversationNotificationStatus1, new RongIMClient.ResultCallback<Conversation.ConversationNotificationStatus>() {
                                                    @Override
                                                    public void onSuccess(Conversation.ConversationNotificationStatus conversationNotificationStatus) {
                                                        showToast("设置成功");
                                                    }


                                                    @Override
                                                    public void onError(RongIMClient.ErrorCode errorCode) {
                                                        showToast("设置失败");
                                                    }

                                                });


调用此方法后会发现结果一直不变,这是为什么呢;后来查看了源码之后,才发现融云会把conversationNotificationStatus对象里面的getValue()的值拿出来,但是值一直都是1,所以会没有效果,此时此刻或许你就会明白了,咱们可以手动给他设置,

这个对象既然有gevalue方法,那么久会有setvalue方法,而且这个方法又会返回一个conversationNotificationStatus对象,于是我们再把这个对象设置进去,运行代码,ok没问题啦。贴出此处整体代码吧:

RongIM.getInstance().getConversationNotificationStatus(Conversation.ConversationType.PRIVATE,
        uiConversation.getConversationTargetId(), new RongIMClient.ResultCallback<Conversation.ConversationNotificationStatus>() {
            @Override
            public void onSuccess(final Conversation.ConversationNotificationStatus conversationNotificationStatus) {
                final int value = conversationNotificationStatus.getValue();
                String title;
                final Conversation.ConversationNotificationStatus conversationNotificationStatus1;
                if(value==1){
                    conversationNotificationStatus1=conversationNotificationStatus.setValue(0);
                    title="免打扰";
                }else{
                    conversationNotificationStatus1=conversationNotificationStatus.setValue(1);
                    title="取消免打扰";
                }
                AgreementDialog.Chatshow(context,title, new OnFloatingLayerClickLisenter() {
                    @Override
                    public void onOkClick() {
                        RongIM.getInstance().setConversationNotificationStatus(Conversation.ConversationType.PRIVATE,
                                uiConversation.getConversationTargetId(), conversationNotificationStatus1, new RongIMClient.ResultCallback<Conversation.ConversationNotificationStatus>() {
                                    @Override
                                    public void onSuccess(Conversation.ConversationNotificationStatus conversationNotificationStatus) {
                                        showToast("设置成功");
                                    }

                                    @Override
                                    public void onError(RongIMClient.ErrorCode errorCode) {
                                        showToast("设置失败");
                                    }
                                });
                    }

                    @Override
                    public void onDismiss() {

                        RongIM.getInstance().getRongIMClient().removeConversation(Conversation.ConversationType.PRIVATE,
                                uiConversation.getConversationTargetId(), new RongIMClient.ResultCallback<Boolean>() {
                                    @Override
                                    public void onSuccess(Boolean aBoolean) {
                                        showToast("删除成功");
                                    }

                                    @Override
                                    public void onError(RongIMClient.ErrorCode errorCode) {
                                        showToast("删除失败");
                                    }
                                });

                    }
                });
            }

            @Override
            public void onError(RongIMClient.ErrorCode errorCode) {

            }
        });
好了,这个功能到这里也就结束了,还是比较简单的,但是没做过的,可能就会采一些坑,希望这篇博客会对你们开发有帮助。










发布了16 篇原创文章 · 获赞 14 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/liulong_/article/details/80800195