Android 网易云IM开发_android 网易云信im 会话列表 置顶-程序员宅基地

技术标签: Android基础  Im  Android  

  • 点对点聊天

即一对一单聊,网易云信 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代码在这里

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/DTJ_74/article/details/82925645

智能推荐

前端开发之vue-grid-layout的使用和实例-程序员宅基地

文章浏览阅读1.1w次,点赞7次,收藏34次。vue-grid-layout的使用、实例、遇到的问题和解决方案_vue-grid-layout

Power Apps-上传附件控件_powerapps点击按钮上传附件-程序员宅基地

文章浏览阅读218次。然后连接一个数据源,就会在下面自动产生一个添加附件的组件。把这个控件复制粘贴到页面里,就可以单独使用来上传了。插入一个“编辑”窗体。_powerapps点击按钮上传附件

C++ 面向对象(Object-Oriented)的特征 & 构造函数& 析构函数_"object(cnofd[\"ofdrender\"])十条"-程序员宅基地

文章浏览阅读264次。(1) Abstraction (抽象)(2) Polymorphism (多态)(3) Inheritance (继承)(4) Encapsulation (封装)_"object(cnofd[\"ofdrender\"])十条"

修改node_modules源码,并保存,使用patch-package打补丁,git提交代码后,所有人可以用到修改后的_修改 node_modules-程序员宅基地

文章浏览阅读133次。删除node_modules,重新npm install看是否成功。在 package.json 文件中的 scripts 中加入。修改你的第三方库的bug等。然后目录会多出一个目录文件。_修改 node_modules

【】kali--password:su的 Authentication failure问题,&sudo passwd root输入密码时Sorry, try again._password: su: authentication failure-程序员宅基地

文章浏览阅读883次。【代码】【】kali--password:su的 Authentication failure问题,&sudo passwd root输入密码时Sorry, try again._password: su: authentication failure

整理5个优秀的微信小程序开源项目_微信小程序开源模板-程序员宅基地

文章浏览阅读1w次,点赞13次,收藏97次。整理5个优秀的微信小程序开源项目。收集了微信小程序开发过程中会使用到的资料、问题以及第三方组件库。_微信小程序开源模板

随便推点

Centos7最简搭建NFS服务器_centos7 搭建nfs server-程序员宅基地

文章浏览阅读128次。Centos7最简搭建NFS服务器_centos7 搭建nfs server

Springboot整合Mybatis-Plus使用总结(mybatis 坑补充)_mybaitis-plus ruledataobjectattributemapper' and '-程序员宅基地

文章浏览阅读1.2k次,点赞2次,收藏3次。前言mybatis在持久层框架中还是比较火的,一般项目都是基于ssm。虽然mybatis可以直接在xml中通过SQL语句操作数据库,很是灵活。但正其操作都要通过SQL语句进行,就必须写大量的xml文件,很是麻烦。mybatis-plus就很好的解决了这个问题。..._mybaitis-plus ruledataobjectattributemapper' and 'com.picc.rule.management.d

EECE 1080C / Programming for ECESummer 2022 Laboratory 4: Global Functions Practice_eece1080c-程序员宅基地

文章浏览阅读325次。EECE 1080C / Programming for ECESummer 2022Laboratory 4: Global Functions PracticePlagiarism will not be tolerated:Topics covered:function creation and call statements (emphasis on global functions)Objective:To practice program development b_eece1080c

洛谷p4777 【模板】扩展中国剩余定理-程序员宅基地

文章浏览阅读53次。被同机房早就1年前就学过的东西我现在才学,wtcl。设要求的数为\(x\)。设当前处理到第\(k\)个同余式,设\(M = LCM ^ {k - 1} _ {i - 1}\) ,前\(k - 1\)个的通解就是\(x + i * M\)。那么其实第\(k\)个来说,其实就是求一个\(y\)使得\(x + y * M ≡ a_k(mod b_k)\)转化一下就是\(y * M ...

android 退出应用没有走ondestory方法,[Android基础论]为何Activity退出之后,系统没有调用onDestroy方法?...-程序员宅基地

文章浏览阅读1.3k次。首先,问题是如何出现的?晚上复查代码,发现一个activity没有调用自己的ondestroy方法我表示非常的费解,于是我检查了下代码。发现再finish代码之后接了如下代码finish();System.exit(0);//这就是罪魁祸首为什么这样写会出现问题System.exit(0);////看一下函数的原型public static void exit (int code)//Added ..._android 手动杀死app,activity不执行ondestroy

SylixOS快问快答_select函数 导致堆栈溢出 sylixos-程序员宅基地

文章浏览阅读894次。Q: SylixOS 版权是什么形式, 是否分为<开发版税>和<运行时版税>.A: SylixOS 是开源并免费的操作系统, 支持 BSD/GPL 协议(GPL 版本暂未确定). 没有任何的运行时版税. 您可以用她来做任何 您喜欢做的项目. 也可以修改 SylixOS 的源代码, 不需要支付任何费用. 当然笔者希望您可以将使用 SylixOS 开发的项目 (不需要开源)或对 SylixOS 源码的修改及时告知笔者.需要指出: SylixOS 本身仅是笔者用来提升自己水平而开发的_select函数 导致堆栈溢出 sylixos

推荐文章

热门文章

相关标签