本文介绍如何创建一个 IMCloud Android 项目,实现即时通讯功能。你也可以通过阅读代码,了解即时通讯的最佳实践。
获取 AppID 和 Token,你可以通过阅读密钥说明了解更多 Token 相关信息
JDK 1.8+
Android 4.4+
Android API Level 19+
本步骤为如何创建一个新项目,如集成到已有项目,请直接查看集成 SDK。
在 Name 字段中输入Hello IMCloud
。
在 Package name 字段中输入com.example.imclouddemo
。
在 Save location 中输入项目的存储路径。
从 Language 下拉菜单中选择 Java 或者 kotlin。
在 Minimum SDK 字段中选择 API 19 作为应用支持的最低 Android 版本。
如果应用需要旧版库支持,选中 Use legacy android.support libraries 复选框。
你可以使用远程依赖的方式使用 gradlew 依赖 IMSDK,或者本地依赖手动下载 IMSDK AAR 导入到项目中。
开发者可以修改 gradle 依赖配置,依赖已经发布到 maven 仓库的 IMSDK。
repositories { maven { url "https://artifact.bytedance.com/repository/Volcengine/" } }
添加依赖示例代码如下,你需要填写所需要的 SDK 版本号,IM SDK v1.1.1+ 支持含 UI 集成方案,最新版本号参看资源获取。
dependencies { implementation 'com.bytedance.im:im-uikit-tob:1.x.x' implementation 'com.bytedance.im:imsdk-tob:1.x.x' // 1.17.0 及以上版本需要依赖上报组件, 上报组件版本与imsdk-tob组件版本一致 // 国内上报组件 // implementation 'com.bytedance.im:imsdk-tob-log:1.x.x' // 海外上报组件 // implementation 'com.bytedance.im:imsdk-tob-log-global:1.x.x' }
注意
如出现 65535 问题报错,可通过配置 multiDexEnabled true
解决。
报错信息:Cannot fit requested classes in a single dex file (# methods: 67777 > 65536)
解决方案:defaultConfig { multiDexEnabled true }
下载 SDK 和 UIKit 到本地,解压并拷贝文件到 lib。其中 UIKit 已经开源,你也可以通过 GitHub 仓库获取 UIKit 源码。
检查 app 模块下 build.gralde 是否存在如下代码,如不存在需要手动添加。
dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) }
在 AndroidManifest.xml
中配置 App 相关权限,其中 IM 收发消息及数据同步需要网络相关权限,发送图片、视频等媒体信息需要使用磁盘读写权限。
<!-- 网络相关 --> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <!-- 读写磁盘 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
在 proguar-rulers.pro
中配置混淆,如下
-keep class com.bytedance.**{*;}
在使用 IMSDK 接口功能前需要先进行初始化操作,在 application 的 onCreate()
回调函数中添加如下代码。其中 BIMSDKConfig 可配置 IMSDK 的日志监听。
BIMSDKConfig config = new BIMSDKConfig(); config.setLogListener(new BIMLogListener() { @Override public void onLog(BIMLogLevel bimLogLevel, String tag, String content) { } }); //方式 1:开发者实现日志打印逻辑,如写入文件上报服务等。 BIMUIClient.getInstance().init(this,APP_ID,config); //方式 2:使用默认方式,日志打印到 logcat BIMUIClient.getInstance().init(this,APP_ID,null);
BIMLogLevel 日志级别含义如下
日志级别 | 含义 |
---|---|
BIM_LOG_DEBUG | debug 日志, 调试信息。 |
BIM_LOG_INFO | Info 日志,上下文环境等信息。 |
BIM_LOG_WARN | warn 日志,警告信息。 |
BIM_LOG_ERROR | error 日志,错误信息。 |
在 v1.9.0 及之后版本,IM SDK 同时支持海外服务,你可以在初始化时配置海外环境,示例代码如下。
说明
目前海外版本暂不支持收发语音消息和视频消息,调用发送会返回上传失败错误。
//BIMEnv.I18N.getEnv() 代表海外环境 //BIMEnv.DEFAULT_ZH.getEnv() 代表国内环境 BIMUIClient.getInstance().init(application,curAppId, BIMEnv.I18N.getEnv(), config);
IM SDK 提供了日志记录和性能分析功能,以帮助用户分析线上问题,默认开启。为了更好地排查问题,SDK 会上报部分客户端数据到火山国内的监控服务,如评估后有风险,可以在 initSDK 时配置 BIMSDKConfig 关闭日志功能,示例代码如下。
//配置开关 BIMSDKConfig config = new BIMSDKConfig(); config.setEnableAPM(false); //日志记录功能 config.setEnableAppLog(false); //性能监控功能 //初始化 BIMUIClient.getInstance().initSDK(application,appId, config);
完成初始化并设置监听后,即可进入到登录流程,登录后才能正常使用组件功能,客户端登录示例代码如下。登录会根据当前传入的 uid,token 鉴权,并拉取历史会话、消息等数据,同时建立长链接。
BIMUIClient.getInstance().login(uid, token, new BIMSimpleCallback() { @Override public void onSuccess() { //登录成功 } @Override public void onFailed(BIMErrorCode code) { //登录失败 } });
BIMConversationListFragment 提供了会话列表页面的实现,你可以像普通的 Fragment 一样嵌入你的 UI 布局 XML,或者将代码动态加载到你的 UI 代码上,以下代码是 XML 示例。
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto" android:orientation="vertical"> //... <fragment android:name="com.bytedance.im.ui.conversation.BIMConversationListFragment" android:id="@+id/conversation_list" android:layout_width="match_parent" android:layout_height="match_parent"/> </LinearLayout>
BIMConversationListFragment 提供了点击监听,便于业务自定义会话点击事件。
/** * 设置会话列表 item 监听 * @param onItemClickListener item 点击监听 */ public void setOnItemClickListener(OnConversationClickListener onItemClickListener)
集成后会话列表页面实现样式参考下图:
BIMConversationListFragment 提供了消息列表页面的实现,你可以像普通的 Fragment 一样嵌入你的 UI 布局 XML,或者将代码动态加载到你的 UI 代码上,以下代码是 XML 示例。
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <fragment android:id="@+id/message_fragment" android:name="com.bytedance.im.ui.message.BIMMessageListFragment" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout>
在内嵌 BIMMessageListFragment 的 Activity 配置启动 action 为 "com.bytedance.im.page.message_list"
,示例代码如下。
<activity android:name=".message.VEMessageListActivity" android:screenOrientation="portrait"> <intent-filter> <category android:name="android.intent.category.DEFAULT" /> <action android:name="com.bytedance.im.page.message_list" /> </intent-filter> </activity>
使用 Intent 显示指定 Activity,启动时需携带当前会话的会话 id。以会话列表设置监听并启动为例,示例代码如下。
bimConversationListFragment.setOnItemClickListener(new BIMConversationListFragment.OnConversationClickListener() { @Override public void onConversationClick(BIMConversation conversation) { //启动消息列表 Activity Intent intent = new Intent(); intent.setAction(BIMMessageListFragment.ACTION); //携带会话 ID intent.putExtra(BIMMessageListFragment.TARGET_CID, conversation.getConversationID()); startActivity(intent); } });
集成后消息列表页面实现样式参考下图: