环信 (发送消息和接收消息)

under Android  环信  tag     Published on June 7th , 2021 at 04:31 pm

IM基本功能:消息

本篇只记录准备工作、导入SDK、发送消息和接收消息 (单聊)

官方文档中对各种消息的处理和说明有很多,这里重点看发送消息和接收消息

1、进入官网

  • 注册并登录账号,记住 APPKey 所在位置

  • 创建用户。点开之后是输入用户名、密码和确认密码,在此创建的账号是用来聊天的两个账号

2、Android SDK 导入

我用的是精简版。Sync Now 后打开清单文件。

implementation 'io.hyphenate:hyphenate-sdk-lite:3.7.5'

官网中很详细。注意看清配置清单文件 AndroidManifest.xml 部分!加入以下静态权限配置和 AppKey 等

    <!-- IM SDK required start -->
    <!-- 允许程序振动 -->
    <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.WRITE_EXTERNAL_STORAGE"/>
    <!-- 这个权限用于访问GPS定位(用于定位消息,如果不用定位相关可以移除) -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <!-- api 21后被标记为deprecated -->
    <uses-permission android:name="android.permission.GET_TASKS" />
    <!-- 用于访问wifi网络信息-->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <!-- 用于获取wifi的获取权限 -->
    <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" />
    <!-- 捕获屏幕所需权限,Q后新增权限(多人音视频屏幕分享使用) -->
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
    <!-- IM SDK required end -->

这段写在 application 标签里

    <!-- 设置环信应用的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>

如果使用起来有问题建议看看官网常见问题汇总

3、初始化环信

要求在 applicationoncreate() 方法中做初始化

MOptions options = new EMOptions();
EMClient.getInstance().init(getApplicationContext(), options);
EMClient.getInstance().setDebugMode(true);

4、登录

用上面创建的用户登录

EMClient.getInstance().login("用户名", "密码", new EMCallBack(){...})

可以在回调里做操作

为了防止每启动一次程序就登录一次,可以判断是否有用户登录

EMClient.getInstance().isLoggedInBefore()

这句代码返回的是 boolean,true:已登录,false:未登录。

5、发送消息

通过这一行代码就能发送消息了,message 为发送的内容

EMClient.getInstance().chatManager().sendMessage(message);

message 可以是文字、图片、表情、语音、文件等等
示例:发送文本信息

EMMessage message = EMMessage.createTxtSendMessage("要发送的文字内容", "接收内容的用户id");

大致是这样,我写的是单聊,所以判断是否为群聊省去了

另外,想知道消息到底有没有成功发出,可以添加监听消息状态。通过 message 设置消息的发送及接收状态。 注意:需在sendMessage 之前去设置此回调监听

message.setMessageStatusCallback(new EMCallBack(){...})

除基本发送类型外想发送其他信息可以使用自定义消息或者扩展消息

自定义消息

如果要传递 bean 类可以将 map 转换成 json 字符串

根据 event 获取消息内容

...
case CUSTOM_MSG:
    EMMessage em = (EMMessage) msg.obj;
    EMCustomMessageBody customMessageBody = (EMCustomMessageBody) em.getBody();
    String event = customMessageBody.event();
    Map<String, String> map = customMessageBody.getParams();
    switch (event) {
        case "custom quote msg":
        // ...
        break;
    }
break;
...

扩展消息

6、接收消息

这个回调里不仅限 收到信息,此次我记录只需要这个。

查看登录的账号是不是接收消息的账号
在不需要的时候移除 listener

EMClient.getInstance().chatManager().addMessageListener(msgListener);
EMMessageListener msgListener = new EMMessageListener() {
    
    @Override
    public void onMessageReceived(List<EMMessage> list) {
        //收到消息
    }
    // ... ...
};

// 记得在不需要的时候移除 listener,如在 activity 的 onDestroy() 时
EMClient.getInstance().chatManager().removeMessageListener(msgListener);

onMessageReceived(List<EMMessage> list) ,EMMessage 可以是很多类型(文字、图片、表情... )

获取文本消息

for(EMMessage emMessage : list){
    if(emMessage.getBody() != null){
        if(emMessage.getType() == EMMessage.Type.TXT){
            String txt = ((EMTextMessageBody) emMessage.getBody()).getMessage(); // 获取发送过来的文本信息
            // ...
        }
    }
}

Android API 常见错误码


本文由 surface 创作,采用 知识共享署名4.0 国际许可协议进行许可,转载前请务必署名
  文章最后更新时间为:August 30th , 2021 at 02:38 pm
分享到:Twitter  Weibo  Facebook