最近项目中要求实现即时通讯的功能,于是就找到了环信的即时通讯。下面我就来分享一下如何简单快速的集成环信EaseUI以及我在集成中遇到的问题。
ps:想要快速方便的集成最好不要按照官方文档的要求来做,因为你会发现全是坑啊!!!无力吐槽......
首先:我们需要到官网去注册并创建应用。会生成我们自己的AppId,这个需要记下来,我们会在Manifest文件中写入我们自己的AppId
然后下载SDK
登录到环信的官网首页-->下载-->即时通讯云,然后选择下载Android的SDK+Demo。
下载完成后的文件夹
然后我们需要打开examples文件夹将easeui文件夹导入AS中(AS中:File-->New-->ImportModule,然后选择easeui对应的路径即可)。
之后我们需要将easeui同步到我们的项目中
点击后然后ok就可以了。ps:这里需要值得一提的是在导入和同步的过程中,我们要尽量把easeui的grale版本修改为和我们自己工程的版本一致,不然会很容易出错。
一丶代码部分(按照官方文档在Manifest文件中添加对应的权限以及添加我们自己的AppID):
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<-------------------------------------------------华丽的分割线------------------------------------->
<meta-data android:name="EASEMOB_APPKEY" android:value="Your AppKey" />
<service android:name="com.hyphenate.chat.EMChatService" android:exported="true"/>
<service android:name="com.hyphenate.chat.EMJobService"
android:permission="android.permission.BIND_JOB_SERVICE"
android:exported="true"
/>
<receiver android:name="com.hyphenate.chat.EMMonitorReceiver">
<intent-filter>
<action android:name="android.intent.action.PACKAGE_REMOVED"/>
<data android:scheme="package"/>
intent-filter>
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<action android:name="android.intent.action.USER_PRESENT" />
intent-filter>
receiver>
二丶初始化EaseUI: 我们需要在项目最开始运行的时候对其进行初始化,所以要写在app里
public class MyApp extends Application{ @Override public void onCreate() { super.onCreate(); EaseUI.getInstance().init(this, null); EMClient.getInstance().setDebugMode(true); } }三丶登录注册界面(布局自己随意画就可以),下面是我写的Demo
//注册的方法,这里需要注意的是这步是异步操作,所以我们需要把它写在子线程中private void register() {new Thread(new Runnable() { @Override public void run() { try { EMClient.getInstance().createAccount(nameEt.getText().toString().trim(), passwordEt.getText().toString().trim()); Log.d("TalkFragment", "注册成功"); } catch (HyphenateException e) { e.printStackTrace(); Log.e("TalkFragment", "注册失败"+e.getMessage()); } } }).start();}
//登录的方法 private void login() { EMClient.getInstance().login(nameEt.getText().toString().trim(), passwordEt.getText().toString().trim(), new EMCallBack() { @Override public void onSuccess() { startActivity(new Intent(getContext(),TalkActivity.class)); //Toast.makeText(getContext(), "登录成功", Toast.LENGTH_SHORT).show(); } @Override public void onError(int i, String s) { Log.d("TalkFragment", i + " " + s.toString()); } @Override public void onProgress(int i, String s) { } }); }四丶登录成功后我们想要跳转到会话界面:这个是退出的方法,哪里需要写哪里~~~ private void logout() { EMClient.getInstance().logout(false, new EMCallBack() { @Override public void onSuccess() { startActivity(new Intent(getContext(),MainActivity.class)); getActivity().finish(); } @Override public void onError(int i, String s) { } @Override public void onProgress(int i, String s) { } }); }
//启动会话列表 EaseConversationListFragment conversationListFragment = new EaseConversationListFragment(); conversationListFragment.setConversationListItemClickListener(new EaseConversationListFragment.EaseConversationListItemClickListener() { @Override public void onListItemClicked(EMConversation conversation) { startActivity(new Intent(TalkActivity.this, ChatActivity.class).putExtra(EaseConstant.EXTRA_USER_ID, conversation.conversationId())); } });这里需要注意的是传入的第二个参数
conversation.conversationId()官方文档给出的是conversation.getUserName(),但是不知道我的为什么没有这个方法,后来研究发现返回的就是这个conversationId,所以直接填入就可以了
五丶跳转到联系人界面(坑来了~~~~)
//直接启动联系人列表 contactListFragment = new EaseContactListFragment(); //需要设置联系人列表才能启动fragment new Thread(new Runnable() { @Override public void run() { contactListFragment.setContactsMap(getContacts()); } }).start(); //设置item点击事件 contactListFragment.setContactListItemClickListener(new EaseContactListFragment.EaseContactListItemClickListener() { @Override public void onListItemClicked(EaseUser user) { startActivity(new Intent(TalkActivity.this, ChatActivity.class).putExtra(EaseConstant.EXTRA_USER_ID, user.getUsername())); } });你会发现这样写完并没有显示联系人,这是因为我们需要再添加好友申请后的回调中再设置一遍联系人并且刷新一下 ps:这是个巨坑~~~当时集成的时候已然崩溃!!!
所以需要在其下方添加如下代码:
EMClient.getInstance().contactManager().setContactListener(new EMContactListener() { @Override public void onContactInvited(String username, String reason) { //收到好友邀请 Log.e(TAG, "onContactInvited: " + username); } @Override public void onFriendRequestAccepted(String s) { Log.e(TAG, "onFriendRequestAccepted: " + s); } @Override public void onFriendRequestDeclined(String s) { Log.e(TAG, "onFriendRequestDeclined: " + s); } @Override public void onContactDeleted(String username) { //被删除时回调此方法 Log.e(TAG, "onContactDeleted: " + username); } @Override public void onContactAdded(String username) { //增加了联系人时回调此方法 Log.e(TAG, "onContactAdded: " + username); new Thread(new Runnable() { @Override public void run() { contactListFragment.setContactsMap(getContacts()); contactListFragment.refresh(); } }).start(); } });到这里我们就可以实现简单的即时通讯功能了~~~如果还有什么需求只需要自己添加就可以了
运行一下:
注意:1,百度地图会和easeui冲突 2,发送定位或者打开大图的时候程序会崩掉,这是因为我们没有在Manifest文件中注册easeui中的两个Activity