Android如何快速集成环信EaseUI(最强修改版)

来源:互联网 发布:ubuntu anaconda 卸载 编辑:程序博客网 时间:2024/06/13 04:30

最近项目中要求实现即时通讯的功能,于是就找到了环信的即时通讯。

下面我就来分享一下如何简单快速的集成环信EaseUI以及我在集成中遇到的问题。
ps:想要快速方便的集成最好不要按照官方文档的要求来做,因为你会发现全是坑啊!!!无力吐槽……

  1. 首先:我们需要到官网去注册并创建应用。会生成我们自己的AppKey,这个需要记下来,我们会在Manifest文件中写入我们自己的AppKey。(不同app之间聊天只需要把appkey写成一样的就可以)
  2. 然后下载SDK
    登录到环信的官网首页–>下载–>即时通讯云,然后选择下载Android的SDK+Demo。
    下载完成后的文件夹
    这里写图片描述
  3. 然后我们需要打开examples文件夹将easeui文件夹导入AS中(AS中:File–>New–>ImportModule,然后选择easeui对应的路径即可(注意导入AS中的时候要把build.gradle文件删除))。
    之后我们需要将easeui同步到我们的项目中
    这里写图片描述
  4. 点击后然后ok就可以了。ps:这里需要值得一提的是在导入和同步的过程中,我们要尽量把easeui的grale版本修改为和我们自己工程的版本一致,不然会很容易出错。
    一丶代码部分(按照官方文档在Manifest文件中添加对应的权限以及添加我们自己的AppKey):
    <!-- Required -->
    <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" />
    <-------------------------------------------------华丽的分割线------------------------------------->
    <!-- 设置环信应用的AppKey -->
    <meta-data android:name="EASEMOB_APPKEY" android:value="Your AppKey" />
    <!-- 声明SDK所需的service SDK核心功能-->
    <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"
    />
    <!-- 声明SDK所需的receiver -->
    <receiver android:name="com.hyphenate.chat.EMMonitorReceiver">
    <intent-filter>
    <action android:name="android.intent.action.PACKAGE_REMOVED"/>
    <data android:scheme="package"/>
    </intent-filter>
    <!-- 可选filter -->
    <intent-filter>
    <action android:name="android.intent.action.BOOT_COMPLETED"/>
    <action android:name="android.intent.action.USER_PRESENT" />
    </intent-filter>
    </receiver>

    代码部分:
    初始化EaseUI:
    我们需要在项目最开始运行的时候对其进行初始化,所以要写在appication里(注意不要忘记去manifests文件中注册)
    public class MyApp extends Application{    @Override    public void onCreate() {        super.onCreate();        EaseUI.getInstance().init(this, null);        EMClient.getInstance().setDebugMode(true); }}

登录注册界面(布局自己随意画就可以),下面是我写的Demo(注意环信的聊天必须登录,不然会发送消息失败)
这里写图片描述

注册的方法,这里需要注意的是这步是异步操作,所以我们需要把它写在子线程中

//注册的方法 异步    public void register(){        new Thread(new Runnable() {            @Override            public void run() {                try {                    EMClient.getInstance().createAccount(nameEt.getText().toString().trim(), passwordEt.getText().toString().trim());                    Log.e("MainActivity", "注册成功");                } catch (HyphenateException e) {                    e.printStackTrace();                    Log.e("MainActivity", "注册失败");                }            }        }).start();    }``//登录的方法    public void login(){        EMClient.getInstance().login(nameEt.getText().toString().trim(), passwordEt.getText().toString().trim(), new EMCallBack() {            @Override            public void onSuccess() {                startActivity(new Intent(MainActivity.this,TalkActivity.class));            }            @Override            public void onError(int i, String s) {            }            @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) {                Log.e("TalkActivity", EaseConstant.EXTRA_USER_ID +" "+ conversation.conversationId());                startActivity(new Intent(TalkActivity.this, ChatActivity.class).putExtra(EaseConstant.EXTRA_USER_ID, conversation.conversationId()));            }        });

官方文档给出的是conversation.getUserName(),但是不知道我的为什么没有这个方法,后来研究发现返回的就是这个conversationId,所以直接填入就可以了

这里还要说一下的是:不是非要跳转到activity界面,因为easeui’的聊天界面就是EaseChatFragment,需要什么时候启动,只需要传入固定参数就可以了(这块好久才弄明白…)

ChatActivity:

public class ChatActivity extends AppCompatActivity {    @Override    protected void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_chat);                EaseChatFragment chatFragment = new EaseChatFragment();                //传入参数                chatFragment.setArguments(getIntent().getExtras());                getSupportFragmentManager().beginTransaction().add(R.id.container, chatFragment).commit();    }}

跳转到联系人界面(坑来了~~~~)

//直接启动联系人列表        contactListFragment = new EaseContactListFragment();//需要设置联系人列表才能启动fragment        new Thread(new Runnable() {            @Override            public void run() {                contactListFragment.setContactsMap(getContacts());            }        }).start();

你会发现这样写完并没有显示联系人,这是因为我们需要再添加好友申请后的回调中再设置一遍联系人并且刷新一下 ps:这是个巨坑~~~当时集成的时候已然崩溃!!!
在其下方添加如下代码:

EMClient.getInstance().contactManager().setContactListener(new EMContactListener() {            @Override            public void onContactAdded(String s) {                Log.e("TalkActivity", s);                new Thread(new Runnable() {                    @Override                    public void run() {                        contactListFragment.setContactsMap(getContacts());                        contactListFragment.refresh();                    }                }).start();            }            @Override            public void onContactDeleted(String s) {            }            @Override            public void onContactInvited(String s, String s1) {            }            @Override            public void onFriendRequestAccepted(String s) {            }            @Override            public void onFriendRequestDeclined(String s) {            }        });    }
/**     * 获取联系人     *     * @return     */    private Map<String, EaseUser> getContacts() {        Map<String, EaseUser> map = new HashMap<>();        try {            List<String> userNames = EMClient.getInstance().contactManager().getAllContactsFromServer();//            KLog.e("......有几个好友:" + userNames.size());            for (String userId : userNames) {//                KLog.e("好友列表中有 : " + userId);                map.put(userId, new EaseUser(userId));            }        } catch (HyphenateException e) {            e.printStackTrace();        }        return map;    }

到这里我们就可以实现简单的即时通讯功能了~~~如果还有什么需求只需要自己添加就可以了。
运行一下:
这里写图片描述
这里写图片描述
这里写图片描述
注意:
1,百度地图会和easeui冲突
2,发送定位或者打开大图的时候程序会崩掉,这是因为我们没有在Manifest文件中注册easeui中的两个Activity。

初次接触IM,希望大家包涵~

后续会写出自定义消息扩展(类似发名片的功能)

4 0
原创粉丝点击