Android 融云IM集成以及使用详解(二)

Android 融云IM集成以及使用详解(二)

上篇讲解了集成和好友列表和消息记录的使用,这篇将讲解聊天界面和群聊界面的使用

  • 先附上一张效果图

    聊天界面

  • 先介绍布局文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/white"
    android:orientation="vertical"
    tools:context=".im.activity.ChatActivity">  //这里要注意

	//自行在这里添加自己的头部

    <View
        android:layout_width="match_parent"
        android:layout_height="0.3dp"
        android:background="#ededed" />

    <fragment
        android:id="@+id/conversation"
        android:name="io.rong.imkit.fragment.ConversationFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/white" />
</LinearLayout>
  • 代码中的使用

    targetId = getIntent().getData().getQueryParameter("targetId");  //传递的融云的id
    String title = getIntent().getData().getQueryParameter("title"); //传递的融云名称/用户昵称
    //需要先设置用户数据提供者  上篇博客有讲解
    
  • 监听器的设置

    //融云发送消息的监听
    RongIM.getInstance().setSendMessageListener(new RongIM.OnSendMessageListener() {
        @Override
        public Message onSend(Message message) {
            Log.e("tag", "------------------------------message----message-----------------------------");
        @Override
        public boolean onSent(Message message, RongIM.SentMessageErrorCode sentMessageErrorCode) {
            return false;
        }
    });
    //融云消息的点击监听
     RongIM.setConversationClickListener(this);
     
     
       @Override
        public boolean onUserPortraitClick(Context context, Conversation.ConversationType conversationType, UserInfo userInfo, String targetId) {
        	//点击用户头像的监听
            String rongUserId = userInfo.getUserId();
            return false;
        }
    
        @Override
        public boolean onUserPortraitLongClick(Context context, Conversation.ConversationType conversationType, UserInfo userInfo, String s) {
            return false;
        }
    
        @Override
        public boolean onMessageClick(Context context, View view, Message message) {
    		//在这里可以判断点击消息的类型 进行不同的跳转  
            if (message.getContent() instanceof LocationMessage) {
                Intent intent = new Intent(ChatActivity.this, GuideActivity.class);
                intent.putExtra("location", message.getContent());
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(intent);
                return true;
            } else {
                return false;
            }
    
    
        }
    
    
  • 群聊消息的界面

    还是先附上一张效果图

    群聊界面效果图

    注意需要在配置清单里面配置界面,在聊天记录界面初始化列表时开启聚合会话

    下面是XML

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent" android:layout_height="match_parent"
        android:orientation="vertical">
    
    
    
        <com.leyongleshi.ljd.view.HeadTitleLinearView
            android:id="@+id/mHeadView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>
        <FrameLayout
            android:id="@+id/rong_content"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </LinearLayout>
    

再附上全部代码

/**
 * Created by Bob on 15/11/3.
 * 聚合会话列表
 */
public class SubConversationListActivity extends BaseActivity {

    @BindView(R.id.mHeadView)
    HeadTitleLinearView mMHeadView;
    @BindView(R.id.rong_content)
    FrameLayout mRongContent;

    @Override
    public int getResId() {
        return R.layout.activity_rong;
    }

    @Override
    public void initView() {
        SubConversationListFragment fragment = new SubConversationListFragment();
        fragment.setAdapter(new SubConversationListAdapterEx(RongContext.getInstance()));
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        transaction.add(R.id.rong_content, fragment);
        transaction.commit();

        Intent intent = getIntent();
        if (intent.getData() == null) {
            return;
        }
        //聚合会话参数
        String type = intent.getData().getQueryParameter("type");



        if (type == null)
            return;

        if (type.equals("group")) {
            mMHeadView.setTitle("群组");
        } else if (type.equals("private")) {
            mMHeadView.setTitle("私人会话");
        } else if (type.equals("discussion")) {
            mMHeadView.setTitle("我的讨论组");
        } else if (type.equals("system")) {
            mMHeadView.setTitle("系统消息");
        } else {
            mMHeadView.setTitle("聊天");
        }
    }

    @Override
    public void initData() {

    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ButterKnife.bind(this);

    }

    @Override
    public void initPresenter() {

    }
}

上面就算是基本的融云IM的使用了 下面再附上一些自定义的功能

  • 底部按钮的添加 注意:需要在初始化时把自定义的按钮添加进去

    /**
     * 添加自定义按钮
     */
    public class RecognizeExtensionModule2 extends DefaultExtensionModule {
    
        private static RecognizeExtensionModule2 singleInstance = null;
    
        private RecognizeExtensionModule2() {
        }
    
        public static RecognizeExtensionModule2 getInstence(){
            if (singleInstance == null) {
                synchronized (RecognizeExtensionModule.class) {
                    if (singleInstance == null) {
                        singleInstance = new RecognizeExtensionModule2();
                    }
                }
            }
            return singleInstance;
        }
    
        @Override
        public void onInit(String appKey) {
    
        }
    
        @Override
        public void onConnect(String token) {
    
        }
    
        @Override
        public void onAttachedToExtension(RongExtension extension) {
    
        }
    
        @Override
        public void onDetachedFromExtension() {
    
        }
    
        @Override
        public void onReceivedMessage(Message message) {
    
        }
    
        @Override
        public List<IPluginModule> getPluginModules(Conversation.ConversationType conversationType) {
            List<IPluginModule> pluginModules = new ArrayList<>();
    
            //创建位置按钮
            LocationPlugin recognizePlugin = new LocationPlugin();
            //添加位置
            pluginModules.add(recognizePlugin);
            //自定义的按钮
            SignInPlugin signInPlugin = new SignInPlugin();
            if (conversationType.equals(Conversation.ConversationType.GROUP)){
                pluginModules.add(signInPlugin);
            }
    
    
            return pluginModules;
        }
    
        @Override
        public List<IEmoticonTab> getEmoticonTabs() {
            return super.getEmoticonTabs();
        }
    
        @Override
        public void onDisconnect() {
    
        }
    }
    
  • 按钮的界面

    /**
     * 发送位置按钮
     */
    
    public class LocationPlugin implements IPluginModule {
        private Conversation.ConversationType conversationType;
        private String targetId;
    
        @Override
        public Drawable obtainDrawable(Context context) {
        	//按钮的资源
            Drawable drawable = BaseApplication.getContext().getResources().getDrawable(R.mipmap.icon_rm_postion);
            return drawable;
        }
    
        @Override
        public String obtainTitle(Context context) {
            return "位置";  //名称
        }
    
        @Override
        public void onClick(Fragment fragment, RongExtension rongExtension) {
            //示例获取 会话类型、targetId、Context,此处可根据产品需求自定义逻辑,如:开启新的 Activity 等。
            conversationType = rongExtension.getConversationType();
            targetId = rongExtension.getTargetId();
            //只有通过 extension 中的 startActivityForPluginResult 才会返回到本类中的 onActivityResult
            rongExtension.startActivityForPluginResult(new Intent(fragment.getActivity(),BaiDuLocationActivity.class),5, this);
    
        }
    
        @Override
        public void onActivityResult(int i, int i1, Intent data) {
            if (data != null) {
                double latitude = data.getDoubleExtra("latitude",0.00);
                double longitude = data.getDoubleExtra("longitude",0.00);
                String address = data.getStringExtra("address");
                String uri = data.getStringExtra("locuri");
                //发送位置消息
                LocationMessage locationMessage = LocationMessage.obtain(latitude,longitude,address, Uri.parse(uri));
                RongIM.getInstance().sendLocationMessage(Message.obtain(targetId, conversationType, locationMessage), null, null, null);
            }
    
        }
    }
    
  • 添加融云客服功能

    CSCustomServiceInfo.Builder csBuilder = new CSCustomServiceInfo.Builder();
    CSCustomServiceInfo csInfo = csBuilder.nickName("融云").build();
    RongIM.getInstance().startCustomerServiceChat(getActivity(), "key", "name", csInfo);
    
  • 点击融云推送的聊天消息 需要在配置文件中配置

    public class SealNotificationReceiver extends PushMessageReceiver {
        /* push 通知到达事件*/
        @Override
        public boolean onNotificationMessageArrived(Context context, PushNotificationMessage message) {
            return false; // 返回 false, 会弹出融云 SDK 默认通知; 返回 true, 融云 SDK 不会弹通知, 通知需要由您自定义。
        }
    
        /* push 通知点击事件 */
        @Override
        public boolean onNotificationMessageClicked(Context context, PushNotificationMessage message) {
            return false; // 返回 false, 会走融云 SDK 默认处理逻辑, 即点击该通知会打开会话列表或会话界面; 返回 true, 则由您自定义处理逻辑。
        }
    }
    

以上就是对项目融云的一个简单总结 各位仅做参考 还有许多融云功能未用到,有需要的朋友可以去参考融云的官方文档以及下载推荐的Dome研究

猜你喜欢

转载自blog.csdn.net/qq_38605423/article/details/84929143