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研究