Android 网易云IM开发

  • 点对点聊天

即一对一单聊,网易云信 SDK 提供文字、图片、语音、地理位置、文件、自定义消息等多种能力,开发者可根据自身需求定制附件下载、未读、推送等多种消息行为。

  • 群聊天

即多人聊天群组服务,内置普通群和高级群,普通群类似于没有权限的讨论组,适用于快速创建多人会话的场景;高级群在普通群的基础上拥有了更多的权限设置,包括邀请的验证方式,管理员权限,禁言等更高级的功能,适用于更复杂更定制化的场景。

群聊天有人数限制,人数在千级别以上推荐使用聊天室。

  • 聊天室聊天

聊天室是群聊人数在万级甚至更多的聊天解决方案,可用于游戏直播,网络授课,远程医疗等业务场景上。聊天室没有人数限制,同时提供基本的权限服务。

聊天室在进入时需要重新建立链接,同时由于场景消息量通常很大, SDK 不会做聊天室消息存储,需要上层自行实现。 在人数低于千级别时,推荐使用群组聊天。

  • 消息全文检索

网易云通信 Android SDK 拥有基于 Lucene 的全文检索插件,支持聊天消息的全文检索。

  • 资料托管

网易云通信提供了用户资料的可选托管,开发者可以根据喜好,将用户资料托管给网易云信或者 APP 应用服务器自行管理。

  • 消息推送

集成网易云通信 Android SDK 的 APP 运行起来时,会有个后台进程(push 进程),该进程保持了与网易云通信 Server 的长连接。只要这个 push 进程活着(网易云通信提供安卓保活机制),就能接收网易云通信 Server 推过来的消息,进行通知栏提醒。

  • 事件订阅

网易云信允许用户订阅监听其他用户产生的事件,产生的事件的方式分为两种:

1. 用户主动发布的自定义事件。

2. 由于用户的一些特定行为触发的内置系统事件。

开发者可以用事件订阅自定义用户的在线状态,如忙碌,隐身等等。

  • 高清语音

网易云信提供了音频播放、高清语音录制的功能。格式支持 aac 和 amr。

  • 智能对话机器人

智能对话机器人解决方案依托网易即时通讯、语音识别、语义理解等服务,为开发者提供人机交互 API / SDK、语音识别、意图识别、知识库配置、动态接口等功能,可以在应用内快速集成场景丰富的智能对话机器人。

大概功能就是这些。。。

网易云官方也提供了快速集成Im功能库。

https://github.com/netease-im/NIM_Android_UIKit

SDK 4.4.0 API调用框架增强:

  • 支持带 Looper 的非UI线程发起的异步API调用,直接回调到调用者线程。老版本会默认回调到 UI 线程。
  • 提供异步强制转成同步的接口:NIMClient#syncRequest,允许设置最大同步等待时间,支持非 UI 线程里需要同步调用云信 API的场景。
  • 添加自动生成的 NIMSDK类,开发者可以直接采用 NIMSDK#getXXXService 方法获取服务接口,不再需要传递 XXXService.class,简化 API 调用方式。其他插件自动生成的调用入口类为:NIMChatRoomSDK、NIMLuceneSDK。例如采用 NIMSDK.getAuthService().login() 替换NIMClient.getService(AuthService.class).login()

 文档首页 IM 音视频通话 短信 直播 点播 互动直播 互动白板 

 

 登录 注册

IM即时通讯

  • 通过 Gradle 集成 SDK

  • 通过类库配置集成 SDK

  • 权限与组件

  • 混淆配置

  • 总体接口介绍

  • SDK 数据缓存目录结构

  • 集成方式

IM即时通讯 > SDK开发集成 > Android开发集成 > 集成方式

集成方式

IM SDK 是网易云通信其他能力(实时语音视频、互动白板等)的基础,本节讲述 IM SDK 的集成步骤也将其他能力 SDK 的集成步骤融合起来,开发者可以根据实际业务需要选择接入的类库。

网易云通信 IM SDK 支持两种方式集成。

1. 通过 Gradle 集成 SDK (推荐)

2. 通过类库配置集成 SDK

网易云通信 Android SDK 2.5.0 以上强烈推荐通过 Gradle 集成 SDK。

注意: 1. IM SDK 最低要求 Android 4.0, 其中网络音视频通话和白板最低要求 Android 4.1。

2. 从 3.2 版本开始 jni 库支持 64位 系统

此外,为了让开发者可以轻松快速的在 App 中集成 IM 功能,我们还提供了开源的 聊天组件,通过简单的配置就可以实现聊天功能。

通过 Gradle 集成 SDK

首先,在整个工程的 build.gradle 文件中,配置 repositories,使用 jcenter 或者 maven ,二选一即可,如下:

复制allprojects {
    repositories {
        jcenter() // 或者 mavenCentral()
    }
}

第二步,在主工程的 build.gradle 文件中,添加 dependencies。根据自己项目的需求,添加不同的依赖即可。注意:版本号必须一致,这里以 5.6.1 版本为例:

复制
android {
   defaultConfig {
       ndk {
           //设置支持的SO库架构
           abiFilters "armeabi-v7a", "x86","arm64-v8a","x86_64"
        }
   }
}

dependencies {
    compile fileTree(dir: 'libs', include: '*.jar')
    // 添加依赖。注意,版本号必须一致。
    // 基础功能 (必需)
    implementation 'com.netease.nimlib:basesdk:5.6.1'
    // 音视频和互动白板服务需要
    implementation 'com.netease.nimlib:nrtc:5.6.1'
    // 音视频需要
    implementation 'com.netease.nimlib:avchat:5.6.1'
    // 聊天室需要
    implementation 'com.netease.nimlib:chatroom:5.6.1'
    // 互动白板服务需要
    implementation 'com.netease.nimlib:rts:5.6.1'
    // 全文检索服务需要
    implementation 'com.netease.nimlib:lucene:5.6.1'
    // 小米、华为、魅族、fcm 推送
    implementation 'com.netease.nimlib:push:5.6.1'
}

再次注意:依赖包的版本号必须一致。

通过类库配置集成 SDK

首先到下载页面进行下载 Android SDK。开发者可以根据实际需求,配置类库。

以下介绍以 Android SDK v2.5 及以上版本为例,Android SDK v2.5 以下的配置,请咨询技术支持。

网易云通信 Android SDK v2.5 及以上分为两种 SDK 包下载,第一种包含全部功能:IM + 聊天室 + 推送 + 实时音视频 + 教学白板。第二种包含部分功能,包含:IM + 聊天室 + 推送。

SDK 包的 libs 文件夹中,包含了网易云通信的 jar 文件,各 jni 库文件夹以及 SDK 依赖的第三方库。

第一种,包含全部功能的 SDK 包。如果需用网易云通信 SDK 提供的所有功能,将这些文件拷贝到你的工程的 libs 目录下,即可完成配置。列表如下:

复制libs
├── arm64-v8a
│   ├── libne_audio.so (高清语音录制功能必须)
│   ├── libnrtc_engine.so (音视频需要)
│   └── libnrtc_network.so (音视频需要)
│   └── librts_network.so (实时会话服务需要)
├── armeabi-v7a
│   ├── libne_audio.so
│   ├── libnrtc_engine.so
│   └── libnrtc_network.so
│   └── librts_network.so
├── x86
│   ├── libne_audio.so
│   ├── libnrtc_engine.so
│   └── libnrtc_network.so
│   └── librts_network.so
├── x86_64
│   ├── libne_audio.so
│   ├── libnrtc_engine.so
│   └── libnrtc_network.so
│   └── librts_network.so
│
├── nim-basesdk-5.6.1.jar (基础功能)
├── nim-chatroom-5.6.1.jar (聊天室需要)
├── nim-rts-5.6.1.jar (互动白板、文档转码需要)
├── nim-avchat-5.6.1.jar (音视频需要)
├── nim-lucene-5.6.1.jar (全文检索需要)
├── nim-push-5.6.1.jar(推送需要)
├── nrtc-sdk.jar(音视频需要)

第二种,只包含 IM 基础功能和聊天室功能的 SDK 包。如果只需要 IM 基础功能和聊天室功能,只需要将下面这些文件拷贝到你的工程的 libs 目录下,即可完成配置。列表如下:

复制libs
├── arm64-v8a
│   ├── libne_audio.so (高清语音录制功能必须)
├── armeabi-v7a
│   ├── libne_audio.so
├── x86_64
│   ├── libne_audio.so
├── x86
│   ├── libne_audio.so
├── nim-basesdk-5.6.1.jar (基础功能)
├── nim-push-5.6.1.jar (推送需要)
├── nim-chatroom-5.6.1.jar (聊天室需要)

以上文件列表中,jar 文件版本号可能会不同,子目录中的文件是 SDK 所依赖的各个 CPU 架构的 so 库。

按需配置 jar 包: 如果不需要聊天室功能,可以在IM和聊天室的基础包中,去掉 nim-chatroom-5.6.1.jar。 如果只需要 IM 基础功能和 音视频功能,可以在 IM 和聊天室的基础包中,去掉 nim-chatroom-5.6.1.jar,so 库需要加上 libnrtc*.so,还需加上 nim-avchat-5.6.1.jar 和 nrtc-sdk.jar。 如果不需要全文检索功能,可以去掉 nim-lucene-5.6.1.jar(该包有 1M+ 大小,如果没有用到消息全文检索功能,建议去掉)。

如果你使用的 IDE 是 Android Studio,要将 jni 库按照 IDEA 工程目录的结构,放置在对应的目录中(一般为 src/main/jniLibs)。或者在 build.gradle 中配置好 jniLibs 的 sourceSets(可参考 demo 的 build.gradle)。

权限与组件

在 AndroidManifest.xml 中加入以下配置:

复制<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
       package="xxx">

    <!-- 权限声明 -->
    <!-- 访问网络状态-->
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <!-- 控制呼吸灯,振动器等,用于新消息提醒 -->
    <uses-permission android:name="android.permission.FLASHLIGHT" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <!-- 外置存储存取权限 -->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

    <!-- 多媒体相关 -->
    <uses-permission android:name="android.permission.CAMERA"/>
    <uses-permission android:name="android.permission.RECORD_AUDIO"/>
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>

    <!-- 如果需要实时音视频通话模块,下面的权限也是必须的。否则,可以不加 -->
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
    <uses-permission android:name="android.permission.BROADCAST_STICKY"/>
     <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-feature android:name="android.hardware.camera" />
    <uses-feature android:name="android.hardware.camera.autofocus" />
    <uses-feature android:glEsVersion="0x00020000" android:required="true" />

    <!-- SDK 权限申明, 第三方 APP 接入时,请将 com.netease.nim.demo 替换为自己的包名 -->
    <!-- 和下面的 uses-permission 一起加入到你的 AndroidManifest 文件中。 -->
    <permission
        android:name="com.netease.nim.demo.permission.RECEIVE_MSG"
        android:protectionLevel="signature"/>
    <!-- 接收 SDK 消息广播权限, 第三方 APP 接入时,请将 com.netease.nim.demo 替换为自己的包名 -->
     <uses-permission android:name="com.netease.nim.demo.permission.RECEIVE_MSG"/>

    <application
        ...>
        <!-- APP key, 可以在这里设置,也可以在 SDKOptions 中提供。
            如果 SDKOptions 中提供了,取 SDKOptions 中的值。 -->
        <meta-data
            android:name="com.netease.nim.appKey"
            android:value="key_of_your_app" />

        <!-- 云信后台服务,请使用独立进程。 -->
        <service
            android:name="com.netease.nimlib.service.NimService"
            android:process=":core"/>

       <!-- 云信后台辅助服务 -->
        <service
            android:name="com.netease.nimlib.service.NimService$Aux"
            android:process=":core"/>

        <!-- 云信后台辅助服务 -->
        <service
            android:name="com.netease.nimlib.job.NIMJobService"
            android:exported="true"
            android:permission="android.permission.BIND_JOB_SERVICE"
            android:process=":core"/>

        <!-- 云信监视系统启动和网络变化的广播接收器,保持和 NimService 同一进程 -->
        <receiver android:name="com.netease.nimlib.service.NimReceiver"
            android:process=":core"
            android:exported="false">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
            </intent-filter>
        </receiver>

        <!-- 云信进程间通信 Receiver -->
        <receiver android:name="com.netease.nimlib.service.ResponseReceiver"/>

        <!-- 云信进程间通信service -->
        <service android:name="com.netease.nimlib.service.ResponseService"/>

        <!-- 云信进程间通信provider -->
        <!-- android:authorities="{包名}.ipc.provider", 请将com.netease.nim.demo替换为自己的包名 -->
        <provider
            android:name="com.netease.nimlib.ipc.NIMContentProvider"
            android:authorities="com.netease.nim.demo.ipc.provider"
            android:exported="false"
            android:process=":core" />
    </application>
</manifest>

混淆配置

如果你的 apk 最终会经过代码混淆,请在 proguard 配置文件中加入以下代码:

复制-dontwarn com.netease.**
-keep class com.netease.** {*;}
#如果你使用全文检索插件,需要加入
-dontwarn org.apache.lucene.**
-keep class org.apache.lucene.** {*;}

总体接口介绍

网易云通信 SDK 提供了两类接口供开发者调用:一类是第三方 APP 主动发起请求,第二类是第三方 APP 作为观察者监听事件和变化。第一类接口名均以 Service 结尾,例如 AuthService ,第二类接口名均以 ServiceObserver 结尾,例如 AuthServiceObserver,个别太长的类名则可能直接以 Observer 结尾,比如 SystemMessageObserver。

SDK 提供三种接口返回值:基本数据类型(同步接口),InvocationFuture(异步接口) 和 AbortableFuture(异步接口)。异步接口基本上都是从主进程发起调用,然后在后台进程执行,最后再将结果返回给主进程。

SDK 接口返回值说明
基本数据类型同步接口
InvocationFuture异步接口
AbortableFuture异步接口,耗时很长或者传输大量数据时使用,可用 abort() 方法,中断请求。
例如上传下载、登录等

异步接口可设置回调函数,提供两种方式:RequestCallback 和 RequestCallbackWrapper。

异步接口回调函数说明
RequestCallback需要实现3个接口:
成功 onSuccess, 失败 onFailed, 异常 onException
RequestCallbackWrapper需要实现 onResult。封装了成功,失败和异常的3个接口,在参数上进行区分

SDK 4.4.0 API调用框架增强:

  • 支持带 Looper 的非UI线程发起的异步API调用,直接回调到调用者线程。老版本会默认回调到 UI 线程。
  • 提供异步强制转成同步的接口:NIMClient#syncRequest,允许设置最大同步等待时间,支持非 UI 线程里需要同步调用云信 API的场景。
  • 添加自动生成的 NIMSDK类,开发者可以直接采用 NIMSDK#getXXXService 方法获取服务接口,不再需要传递 XXXService.class,简化 API 调用方式。其他插件自动生成的调用入口类为:NIMChatRoomSDK、NIMLuceneSDK。例如采用 NIMSDK.getAuthService().login() 替换NIMClient.getService(AuthService.class).login()

SDK 提供的接口主要按照业务进行分类,大致说明如下:

SDK接口说明
AuthService用户认证服务接口,提供登录注销接口。
AuthServiceObserver用户认证服务观察者接口。
MsgService消息服务接口,用于发送消息,管理消息记录等。
同时还提供了发送自定义通知的接口。
MsgServiceObserve接收消息,消息状态变化等观察者接口。
LuceneService聊天消息全文检索接口。
TeamService群组服务接口,用于发送群组消息,管理群组和群成员资料等。
TeamServiceObserve群组和群成员资料变化观察者。
SystemMessageService系统通知观察者。
FriendService好友关系托管接口,目前支持添加、删除好友、
获取好友列表、黑名单、设置消息提醒。
FriendServiceObserve好友关系变更、黑名单变更通知观察者。
UserService用户资料托管接口,提供获取用户资料、修改个人资料等。
UserServiceObserve用户资料托管接口,提供获取用户资料、修改个人资料等。
AVChatManager语音视频通话接口。
RTSManager实时会话接口。
NosService网易云存储服务,提供文件上传和下载。
NosServiceObserve网易云存储传输进度观察者接口。
MixPushService第三方推送接口,提供第三方推送服务。
EventSubscribeService事件订阅服务接口,提供事件订阅等服务
EventSubscribeServiceObserver事件状态变更观察者接口。
RedPacketService红包接口。提供获取红包sdk token等功能。
RobotService机器人操作相关接口,提供获取机器人、
获取机器人信息、判断是否是机器人等功能。
RobotServiceObserve机器人数据变更观察者接口。
SettingsService系统设置接口。提供多端推送、免打扰配置
SettingsServiceObserver系统设置变更观察者接口。

接下来就是写了一个demo

先注册弄了两个 账号:777777 ,888888

package com.twc.wangyiyunzhibor;

import android.app.Application;

import com.netease.nim.uikit.api.NimUIKit;
import com.netease.nimlib.sdk.NIMClient;
import com.netease.nimlib.sdk.auth.LoginInfo;
import com.netease.nimlib.sdk.msg.MsgService;
import com.netease.nimlib.sdk.util.NIMUtil;
import com.twc.wangyiyunzhibor.mymessage.CustomAttachParser;
import com.twc.wangyiyunzhibor.mymessage.GuessAttachment;
import com.twc.wangyiyunzhibor.mymessage.guest.MsgViewHolderGuess;
import com.twc.wangyiyunzhibor.register.IMListener;

/**
 * 账号1 :777777
 * token 777777
 * <p>
 * 账号2 :888888
 * token 888888
 */
public class MyApp extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        NIMClient.init(this, null, null);

        if (NIMUtil.isMainProcess(this)) {
            //判断是否在主线程。
            IMListener.getInstance().init(this);
            // 初始化
            NimUIKit.init(this);
//
//            // 可选定制项
//            // 注册定位信息提供者类(可选),如果需要发送地理位置消息,必须提供。
//            // demo中使用高德地图实现了该提供者,开发者可以根据自身需求,选用高德,百度,google等任意第三方地图和定位SDK。
//            NimUIKit.setLocationProvider(new NimDemoLocationProvider());
//
//            // 会话窗口的定制: 示例代码可详见demo源码中的SessionHelper类。
//            // 1.注册自定义消息附件解析器(可选)
//            // 2.注册各种扩展消息类型的显示ViewHolder(可选)
//            // 3.设置会话中点击事件响应处理(一般需要)
//            SessionHelper.init();
//
//            // 通讯录列表定制:示例代码可详见demo源码中的ContactHelper类。
//            // 1.定制通讯录列表中点击事响应处理(一般需要,UIKit 提供默认实现为点击进入聊天界面)
//            ContactHelper.init();
//
//            // 在线状态定制初始化。
//            NimUIKit.setOnlineStateContentProvider(new DemoOnlineStateContentProvider());
            NIMClient.getService(MsgService.class).registerCustomAttachmentParser(new CustomAttachParser());
            NimUIKit.registerMsgItemViewHolder(GuessAttachment.class, MsgViewHolderGuess.class);
        }
    }

    private LoginInfo getLoginInfo() {
        return new LoginInfo("777777", "777777");
    }

}
package com.twc.wangyiyunzhibor;

import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import com.netease.nim.uikit.api.NimUIKit;
import com.netease.nim.uikit.common.activity.UI;
import com.netease.nimlib.sdk.NIMClient;
import com.netease.nimlib.sdk.RequestCallback;
import com.netease.nimlib.sdk.auth.AuthService;
import com.netease.nimlib.sdk.auth.LoginInfo;
import com.netease.nimlib.sdk.chatroom.ChatRoomService;
import com.netease.nimlib.sdk.chatroom.model.EnterChatRoomData;
import com.netease.nimlib.sdk.chatroom.model.EnterChatRoomResultData;
import com.netease.nimlib.sdk.msg.MessageBuilder;
import com.netease.nimlib.sdk.msg.MsgService;
import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum;
import com.netease.nimlib.sdk.msg.model.IMMessage;
import com.netease.nimlib.sdk.team.TeamService;
import com.netease.nimlib.sdk.team.constant.TeamFieldEnum;
import com.netease.nimlib.sdk.team.constant.TeamTypeEnum;
import com.netease.nimlib.sdk.team.constant.VerifyTypeEnum;
import com.netease.nimlib.sdk.team.model.CreateTeamResult;
import com.twc.wangyiyunzhibor.bean.MsgEvent;
import com.twc.wangyiyunzhibor.mymessage.GuessAttachment;

import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import butterknife.BindView;
import butterknife.ButterKnife;

/**
 * 网易云账号。
 * 账号1 :777777
 * token 777777
 * <p>
 * 账号2 :888888
 * token 888888
 */
public class MainActivity extends UI {

    @BindView(R.id.button)
    Button button;
    @BindView(R.id.button2)
    Button button2;
    @BindView(R.id.button3)
    Button button3;
    @BindView(R.id.textmsg)
    TextView textmsg;
    @BindView(R.id.button4)
    Button button4;
    @BindView(R.id.button5)
    Button button5;
    @BindView(R.id.button6)
    Button button6;
    @BindView(R.id.button7)
    Button button7;
    @BindView(R.id.button8)
    Button button8;
    @BindView(R.id.button9)
    Button button9;
    private Context context;

    @Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
    public void MsgEvent(MsgEvent event) {
        if (event != null) {
            textmsg.setText("实时情况:" + event.getMsg());
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);
    }

    String groupId = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
        EventBus.getDefault().register(this);
        context = this;
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                NIMClient.getService(AuthService.class).login(new LoginInfo("777777", "777777"))
                        .setCallback(new RequestCallback() {
                            @Override
                            public void onSuccess(Object param) {
                                Log.e("twc", param.toString());
                                NimUIKit.loginSuccess("777777");
                                Toast.makeText(MainActivity.this, "登录成功", Toast.LENGTH_LONG).show();
                            }

                            @Override
                            public void onFailed(int code) {
                                Log.e("twc", code + "---");
                            }

                            @Override
                            public void onException(Throwable exception) {
                                Log.e("twc", exception.toString());
                            }
                        });

            }
        });
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                NIMClient.getService(AuthService.class).logout();
            }
        });
        button3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                // 该帐号为示例,请先注册
                String account = "888888";
                // 以单聊类型为例
                SessionTypeEnum sessionType = SessionTypeEnum.P2P;
                String text = "this is an example";
                // 创建一个文本消息
                IMMessage textMessage = MessageBuilder.createTextMessage(account, sessionType, text);
                // 发送给对方  如果是发送失败后重发,标记为true,否则填false
                NIMClient.getService(MsgService.class).sendMessage(textMessage, false);

            }
        });
        button4.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 打开单聊界面
                NimUIKit.startP2PSession(MainActivity.this, "888888", null);
//                P2PMessageActivity.start(MainActivity.this, "888888", "888888", "888888");
            }
        });
        button5.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

            }
        });

        button6.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
//                fields - 群组预设资料, key为数据字段,value对对应的值,该值类型必须和field中定义的fieldType一致。
//                type - 要创建的群组类型
//                postscript - 邀请入群的附言。如果是创建临时群,该参数无效
//                members - 邀请加入的成员帐号列表
                List<String> sd = new ArrayList<String>();
                sd.add("777777");
                sd.add("888888");
                HashMap<TeamFieldEnum, Serializable> fields = new HashMap<TeamFieldEnum, Serializable>();
                fields.put(TeamFieldEnum.Name, "测试群");
//                VerifyType:申请入群的验证方式
//                InviteMode 群邀请模式:谁可以邀请他人入群
                fields.put(TeamFieldEnum.VerifyType, VerifyTypeEnum.Free);
                NIMClient.getService(TeamService.class)
                        //  TeamTypeEnum  Normal(0), 普通群
                        //    Advanced(1);高级群
                        .createTeam(fields, TeamTypeEnum.Normal, "", sd)
                        .setCallback(new RequestCallback<CreateTeamResult>() {
                            @Override
                            public void onSuccess(CreateTeamResult createTeamResult) {
                                Log.e("result", "成功创建群组" + createTeamResult.toString());
                                groupId = createTeamResult.getTeam().getId();
                                Log.e("result", "成功创建群组id" + createTeamResult.getTeam().getId());
                            }

                            @Override
                            public void onFailed(int i) {
                                Log.e("result", i + "");
                            }

                            @Override
                            public void onException(Throwable throwable) {
                                Log.e("result", throwable + "");
                            }
                        });


            }
        });
        button7.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // 打开群聊界面
                NimUIKit.startTeamSession(context, groupId);
            }
        });
        button8.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // roomId 表示聊天室ID
                EnterChatRoomData data = new EnterChatRoomData("ooo111");
// 以登录一次不重试为例
                NIMClient.getService(ChatRoomService.class).enterChatRoomEx(data, 1).setCallback(new RequestCallback<EnterChatRoomResultData>() {
                    @Override
                    public void onSuccess(EnterChatRoomResultData result) {
                        Log.e("result", result + "登陆聊天室成功");
                        // 登录成功
                    }

                    @Override
                    public void onFailed(int code) {
                        Log.e("result", code + "登陆聊天室失败");
                        // 登录失败
                    }

                    @Override
                    public void onException(Throwable exception) {
                        // 错误
                        Log.e("result", exception + "登陆聊天室失败");
                    }
                });
            }
        });
        button9.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                GuessAttachment attachment = new GuessAttachment();
                IMMessage message = MessageBuilder.createCustomMessage("888888", SessionTypeEnum.P2P,
                        attachment.getValue().getDesc(), attachment);
                NIMClient.getService(MsgService.class).sendMessage(message, false);
                NimUIKit.startP2PSession(MainActivity.this, "888888", null);
            }
        });
    }
}

Demo代码在这里

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值