默认
打赏 发表评论 11
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
即时通讯框架MobileIMSDK的开发指南:Android客户端
微信扫一扫关注! 其它资料链接请回到详细介绍页↘http://www.52im.net/thread-52-1-1.html

* 本贴最新更新于20240508日,针对最新版Android Studio更新了相关截图。

写在前面


友情提示:在着手基于MobileIMSDK开发自已的即时通讯应用前,建议以Demo工程为脚手架,快速上手MobileIMSDK!

Demo工程主要用于演示SDK的API调用等,它位于SDK完整下载包的如下目录:
即时通讯框架MobileIMSDK的开发指南:Android客户端_1_1.png

如上图目录demo_src/TCP_Client/MobileIMSDK4aDemo_tcp/所示,这是一个完整的Andriod Studio工程(含完整的可运行Demo源码)。

如果你只是想看看Demo的话,可以下载编译好的Demo安装包立即体验:点此进入

第一部分:集成准备


第1步:准备开发工具


Android Studio官方下载地址: https://developer.android.google.cn/studio?hl=zh-cn 下载安装:
即时通讯框架MobileIMSDK的开发指南:Android客户端_1.png

具体的安装教程可自行百度一下,过程简单,安装完成即可使用。

第2步:下载SDK并找到lib包


马上下载:
最新版打包下载 点此进入,或者前往 MobileIMSDK的Github 自行同步代码。

找到lib包:
位于MobileIMSDK完整下载包的 sdk_binary/Client_TCP/android/ 目录下:
即时通讯框架MobileIMSDK的开发指南:Android客户端_1-2.png

第3步:引用lib包

提示:MobileIMSDK的Android客户端lib包支持Android 4.0(含)及以上版本。


Android Studio中如何引用第3方jar包?
直接将lib包复制到Android Studio的工程 libs/ 目录下即可。

注意:Andriod Studio中,还需要在app.gradle文件中加入以下配置,以便工程中能正确引用到jar包
dependencies {
    // MobileIMSDK的依赖库
    implementation 'com.google.code.gson:gson:2.9.0'
    implementation group: 'io.netty', name: 'netty-all', version: '4.1.50.Final'

    // MobileIMSDK的SDK库
    implementation files('libs/MobileIMSDKServer_META.jar')
    implementation files('libs/MobileIMSDK4a_tcp.jar')
}

以MobileIMSDK的Demo工程为例,结果如下图:
即时通讯框架MobileIMSDK的开发指南:Android客户端_2.png
▲ Android Studio 2023.2.1 中如上图所示)                    

第二部分:编写代码


第1步:基本配置


以下代码片段来自Demo工程中的IMClientManager.java文件:
// 设置AppKey
ConfigEntity.appKey = "5418023dfd98c579b6001741";
                        
// 设置服务器ip和服务器端口
// ConfigEntity.serverIP = "192.168.82.138";
// ConfigEntity.serverPort = 8901;
            
// MobileIMSDK核心IM框架的敏感度模式设置
// ConfigEntity.setSenseMode(SenseMode.MODE_15S);

// 设置最大TCP帧内容长度(不设置则默认最大是 6 * 1024字节)
// LocalSocketProvider.TCP_FRAME_MAX_BODY_LENGTH = 60 * 1024;

// 开启/关闭DEBUG信息输出
// ClientCoreSDK.DEBUG = false;
                        
// 【特别注意】请确保首先进行核心库的初始化(这是不同于iOS和Java端的地方)
ClientCoreSDK.getInstance().init(this.context);

第2步:回调设置


① 框架基本事件回调实现类:
public class ChatBaseEventImpl implements ChatBaseEvent
{        
    // 登陆/掉线重连结果通知
    @Override
    public void onLoginResponse(int errorCode)
    {
        if (dwErrorCode == 0) 
            Log.i(TAG, "登录成功“);
        else 
            Log.i(TAG, "登录失败,错误代码:" + errorCode);
    }

    // 掉线事件通知
    @Override
    public void onLinkClose(int errorCode)
    {
        Log.i(TAG, "网络连接出错关闭了,error:" + errorCode);
    }
}

② 实时消息事件回调实现类:
public class ChatMessageEventImpl implements ChatMessageEvent
{
    // 收到即时通讯消息通知
    @Override
    public void onRecieveMessage(String fingerPrintOfProtocal, String userid, String dataContent, int typeu)
    {
        Log.i(TAG, "收到来自用户"+userid+"的消息:"+dataContent);
    }

    // 收到服务端反馈的错误信息通知
    @Override
    public void onErrorResponse(int errorCode, String errorMsg)
    {
        Log.i(TAG, "收到服务端错误消息,errorCode="+errorCode+", errorMsg="+errorMsg);
    }
}

③ QoS相关事件回调实现类:
public class MessageQoSEventImpl implements MessageQoSEvent
{
    // 消息无法完成实时送达的通知
    @Override
    public void messagesLost(ArrayList<;Protocal> lostMessages)
    {
        Log.i(TAG, "收到系统的未实时送达事件通知,当前共有"
            +lostMessages.size()+"个包QoS保证机制结束,判定为【无法实时送达】!");
    }

    // 对方已成功收到消息的通知
    @Override
    public void messagesBeReceived(String theFingerPrint)
    {
        if(theFingerPrint != null)
            Log.i(TAG, "收到对方已收到消息事件的通知,消息指纹码="+theFingerPrint);
    }
}

* 设置好事件回调通知监听:
ClientCoreSDK.getInstance().setChatBaseEvent(new ChatBaseEventImpl());
ClientCoreSDK.getInstance().setChatMessageEvent(new ChatMessageEventImpl());
ClientCoreSDK.getInstance().setMessageQoSEvent(new MessageQoSEventImpl());

第3步:登陆请求

new LocalUDPDataSender.SendLoginDataAsync(用户名, 密码){
    @Override
    protected void fireAfterSendLogin(int code)
    {
        if(code == 0)
            Log.i(TAG, "数据发送成功!");
        else
            Log.i(TAG, "数据发送失败。错误码是:"+code+"!");
    }
}.execute();

第4步: 发送消息

new LocalUDPDataSender.SendCommonDataAsync("这是一条测试信息...", 对方的userId, true){
    @Override
    protected void onPostExecute(Integer code)
    {
        if(code == 0)
            Log.i(TAG, "数据已成功发出!");
        else
            Log.i(TAG, "数据发送失败。错误码是:"+code+"!");
    }
}.execute();

第三部分:常见开发问题附录


附录1:可以让客户端更省电吗?


请调用以下API进行设置即可(框架默认工作在SenseMode.MODE_15S模式下):
// MobileIMSDK核心IM框架的敏感度模式设置
ConfigEntity.setSenseMode(SenseMode.MODE_15S);
MobileIMSDK预定义了多种模式,详细API说明:点此进入

特别说明:为了保证算法的一致性,以上设置需所有平台客户端和服务端都保持一致,否则将发生不可预测问题。

附录2:登陆请求结果为何是异步收到的?应用层如何处理体验更佳?

鉴于目前主流的网络编程都提倡异步模型的情况下,MobileIMSDK的服务端反馈回来的登陆结果自然也是异步到达,但这对开发者来说,只要代码处理得当,实现起来同样简单:即登陆请求发起前设置一个登陆结果观察者需可。


最佳实践详见Android客户端Demo代码 LoginGUI.doLoginImpl() 即时通讯框架MobileIMSDK的开发指南:Android客户端_3.png

附录3:集成到APP时,为MobileIMSDK添加的代码混淆配置


如果你的APP启用了代码混淆,请确保以下脚本内容已被添加您的proguard-rules.pro文件中:
# 保留MobileIMSDK的Protocal相关类
-keep class net.x52im.mobileimsdk.server.protocal.** { *; }

# 保留Google GSON相关API:
-keep class sun.misc.Unsafe { *; }
-keep class com.google.gson.stream.** { *; }
-keep class com.google.gson.** { *;}

比如,在RainbowChat中的配置信息截图如下,仅供参考:
即时通讯框架MobileIMSDK的开发指南:Android客户端_1-4.png

如遇到混淆问题,可参考:[已解决] MobileIMSDK4aDemo_tcp 6.1.1版本release版本开启混淆后闪退》。

附录4:核心库工程与Demo演示工程的关系说明


如下图所示:Github淘宝 得到的核心库工程和Demo演示工程
即时通讯框架MobileIMSDK的开发指南:Android客户端_1-5.png
▲ 左边为MobileIMSDK的各平台核心库工程,右边为各平台的Demo演示工程

* 什么是核心库工程?
核心库工程就是MobileIMSDK的所有框架源码,它只是个lib库,它的作用就像Spring boot、Struts、log4j这些第3库lib库一样:是打成jar包放到您的工程里使用的,您调用它就能实现它提供的功能,它自已本身并不能自已运行(你不可能让log4j或Spring boot能双击就运行吧?

* 什么是Demo演示工程?
正如“什么是核心库工程?”一节所说,MobileIMSDK的核心库是不能直接运行的,它需要打成jar包被您的工程引用并调用后,才能发挥它的作用,所以MobileIMSDK的Demo演示工程的目的就是为了告诉你:如何引用MobileIMSDK的核心库jar包、如何调用MobileIMSDK的API,读Demo代码就知道如何使用它了(所以Demo代码唯一的意义就是为您演示库的调用,别无他用)!

* “我”的工程中使用使用核心库工程?
为了方便日后的升级,建议使用MobileIMSDK编译好的核心库jar包,当然您也可以直接把MobileIMSDK核心库源库放到您的工程中(而不是使用编译好的jar包)。

* 您可以在MobileIMSDK的Github如下目录中找到打包编译好的jar包:
即时通讯框架MobileIMSDK的开发指南:Android客户端_1-6.png

附录5:“我”修改了Android版核心库的源码,如何打成新jar包替换到我的工程中?


以Android Studio为例(Eclipse的更简单,直接下载一个fatjar插件打jar包即可),在核心库工程中的app.gradle配置文件中,已经写好了打jar包脚本了,直接使用即可(在最右边双击"makeJar"任务即可生成)。如您不会使用这个脚本,百度一下即可,很简单的。

核心库工程中的makeJar脚本及使用方法如下图所示:
即时通讯框架MobileIMSDK的开发指南:Android客户端_4.png

附录6:如何开启SSL/TLS传输加密


启用SSL/TLS配置取消此行代码注释即可,参考自IM产品RainbowChat):
即时通讯框架MobileIMSDK的开发指南:Android客户端_5.png

注意:请确保您的MobileIMSDK服务端也已开启SSL/TLS加密,否则客户端无法跟服务端正常通信哦!


捐助作者,得MobileIMSDK精编注释版


点击以下链接,前往淘宝下单,付款后发货到您的指定邮箱:


即时通讯框架MobileIMSDK的开发指南:Android客户端_all-in-one.png

(更多详情请进入:http://www.52im.net/thread-411-1-1.html

即时通讯网 - 即时通讯开发者社区! 来源: - 即时通讯开发者社区!

上一篇:即时通讯框架MobileIMSDK:常见问题解答下一篇:即时通讯框架MobileIMSDK的开发指南:iOS客户端

本帖已收录至以下技术专辑

推荐方案
评论 11
* 本贴最新更新于20240508日。
引用:DarcyIM 发表于 2024-01-11 15:06
怎么体验功能呢?大佬

随便输入不重复的登陆名即可
怎么体验功能呢?大佬
有登录账号吗.来一个?

2023年2月18日本贴新增附录4:如何开启SSL/TLS传输加密”章节内容。
本指南最近更新时间为:2020年10月31日
更新内容:根据最新 v5.x版,更新了指南的各种内容。
不错
签名: 心情好
看看
签名:
学习一下……
sendLoginout,为何这个不在源码中实现异步,看了下demo,交给应用层自己处理了呀
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部