1.首先我们先打开网易云信的官网
https://netease.im/?from=bdjjnim0035
2.注册账号后,在控制台创建自己的应用!
查看聊天多布局:
https://blog.csdn.net/yuhui77268769/article/details/90111412
3.创建完成,后查看接入文档
1.首先下载libs
2.清单文件,权限及需要用到的组件
3.初始化配置
功能一 初始化
public class NimApplication extends Application {
/**
* 注意:每个进程都会创建自己的Application 然后调用onCreate() 方法,
* 如果用户有自己的逻辑需要写在Application#onCreate()(还有Application的其他方法)中,一定要注意判断进程,不能把业务逻辑写在core进程,
* 理论上,core进程的Application#onCreate()(还有Application的其他方法)只能做与im sdk 相关的工作
*/
public void onCreate() {
// SDK初始化(启动后台服务,若已经存在用户登录信息, SDK 将完成自动登录)
super.onCreate();
NIMClient.init(this, loginInfo(), options());
// ... your codes
if (NIMUtil.isMainProcess(this)) {
// 注意:以下操作必须在主进程中进行
// 1、UI相关初始化操作
// 2、相关Service调用
}
}
// 如果返回值为 null,则全部使用默认参数。
private SDKOptions options() {
SDKOptions options = new SDKOptions();
// 如果将新消息通知提醒托管给 SDK 完成,需要添加以下配置。否则无需设置。
StatusBarNotificationConfig config = new StatusBarNotificationConfig();
config.notificationEntrance = MainActivity.class; // 点击通知栏跳转到该Activity
config.notificationSmallIconId = R.drawable.ic_launcher_background;
// 呼吸灯配置
config.ledARGB = Color.GREEN;
config.ledOnMs = 1000;
config.ledOffMs = 1500;
options.userInfoProvider = new UserInfoProvider() {
@Override
public UserInfo getUserInfo(String s) {
return null;
}
@Override
public String getDisplayNameForMessageNotifier(String account, String sessionId,
SessionTypeEnum sessionType) {
return null;
}
@Override
public Bitmap getAvatarForMessageNotifier(SessionTypeEnum sessionTypeEnum, String s) {
return null;
}
};
return options;
}
// 如果已经存在用户登录信息,返回LoginInfo,否则返回null即可
private LoginInfo loginInfo() {
// 从本地读取上次登录成功时保存的用户登录信息
String account = Preferences.getUserAccount();
String token = Preferences.getUserToken();
if (!TextUtils.isEmpty(account) && !TextUtils.isEmpty(token)) {
DemoCache.setAccount(account.toLowerCase());
return new LoginInfo(account, token);
} else {
return null;
}
}
功能二 登录
常见问题:
1.注意清单文件的包名是否修改成本项目名
2.在清单文件是否初始化Application
3.在控制台查看自己账号状态
核心点
1.LoginInfo 的参数account:账号,token:为密码 。
2.调用登录方法public void doLogin(LoginInfo info)完成登录。
public void doLogin(LoginInfo info) {
RequestCallback<LoginInfo> callback =
new RequestCallback<LoginInfo>() {
@Override
public void onSuccess(LoginInfo loginInfo) {
Log.e("ssss","成功");
Toast.makeText(MainActivity.this, "成功", Toast.LENGTH_SHORT).show();
}
@Override
public void onFailed(int i) {
}
@Override
public void onException(Throwable throwable) {
Toast.makeText(MainActivity.this, "失败", Toast.LENGTH_SHORT).show();
Log.e("ssss","失败");
}
// 可以在此保存LoginInfo到本地,下次启动APP做自动登录用
};
NIMClient.getService(AuthService.class).login(info)
.setCallback(callback);
}
定义存储方法
public class Preferences {
public static String getUserAccount() {
return null;
}
public static String getUserToken() {
return null;
}
}
功能三 消息的发送
处理音频视频消息请查看官方文档,下面演示简单的文本信息。
https://dev.yunxin.163.com/docs/product/IM即时通讯/SDK开发集成/Android开发集成/消息收发
发送原生支持的消息类型流程比较简单,先通过 MessageBuilder 提供的接口创建消息对象,然后调用 MsgService 的
sendMessage 接口发送出去即可。
参数 | 说明 |
---|---|
sessionId | 聊天对象的 ID,如果是单聊,为用户帐号,如果是群聊,为群组 ID |
sessionType | 聊天类型,SessionTypeEnum.P2P 为单聊类型,SessionTypeEnum.Team 为群聊类型 |
text | 文本消息内容 |
/**
* 发送消息。
* @param msg 带发送的消息体,由{@link MessageBuilder}构造
* @param resend 如果是发送失败后重发,标记为true,否则填false
* @return InvocationFuture 可以设置回调函数。消息发送完成后才会调用,如果出错,会有具体的错误代码。
*/
IMMessage imsg = MessageBuilder.createTextMessage("123", SessionTypeEnum.P2P, "你好呀");
InvocationFuture<Void> voidInvocationFuture = NIMClient.getService(MsgService.class).sendMessage(imsg, true);
voidInvocationFuture.setCallback(new RequestCallback<Void>() {
@Override
public void onSuccess(Void aVoid) {
//消息发送成功
}
@Override
public void onFailed(int i) {
//消息失败
}
@Override
public void onException(Throwable throwable) {
//消息异常
}
});
功能四 消息的接收
通过添加消息接收观察者 MsgServiceObserve#observeReceiveMessage,在有新消息到达时,第三方 APP
就可以接收到通知。该代码的典型场景为消息对话界面,在界面 onCreate 里注册消息接收观察者,在 onDestroy
中注销观察者。在收到消息时,判断是否是当前聊天对象的消息,如果是,加入到列表中显示。
注册消息观察者的参数说明
1.注册消息观察者,就是注册接收消息的服务,注册后就会为这个类服务
2. boolean register,这个参数true代表注册侧绑定,false代表取消注册,解除绑定
/**
* 注册/注销消息接收观察者。
* 通知的消息列表中的消息不一定全是接收的消息,也有可能是自己发出去,比如其他端发的消息漫游过来,
* 或者调用MsgService#saveMessageToLocal(IMMessage, boolean)后,notify参数设置为true,通知出来的消息。
* @param observer 观察者, 参数为收到的消息列表,消息列表中的消息均保证来自同一个聊天对象。
* @param register true为注册,false为注销
*/
public void observeReceiveMessage(Observer<List<IMMessage>> observer, boolean register);
public void onEvent(List < IMMessage > imMessages)
方法的参数理解:这个集合中存储的是消息集合,注意是所有好友的消息,通过**getFromAccount()**来判断是哪个好友发过来的消息,在遍历聊天记录的时候,我们可以进行对 IMMessage 的判断来筛选聊天的信息记录。
NIMClient.getService(MsgServiceObserve.class).observeReceiveMessage(new Observer<List<IMMessage>>() {
@Override
public void onEvent(List<IMMessage> imMessages) {
// 处理新收到的消息,为了上传处理方便,SDK 保证参数 messages 全部来自同一个聊天对象。
String content = imMessages.get(0).getContent();//消息
String fromAccount = imMessages.get(0).getFromAccount();//发送消息的好友
}
},true);
//当视图销毁的时候取消注册
@Override
protected void onDestroy() {
super.onDestroy();
//注销消息接收观察者.
NIMClient.getService(MsgServiceObserve.class)
.observeReceiveMessage(incomingMessageObserver, false);
}
功能五 好友的处理
1.添加好友
VerifyType 参数说明:
VerifyType 属性 | 说明 |
---|---|
DIRECT_ADD | 直接添加对方为好友 |
VERIFY_REQUEST | 需要验证 |
在这里我们用直接添加对方为好友的方式添加好友
还是老样子:通过 NIMClient.getService() 方法来获取服务的方法
NIMClient.getService(FriendService.class).addFriend(new AddFriendData(sou_hy.getText().toString(), verifyType))
.setCallback(new RequestCallback<Void>() {
@Override
public void onSuccess(Void aVoid) {
Toast.makeText(Main3Activity.this, "添加成功", Toast.LENGTH_SHORT).show();
//添加成功
}
@Override
public void onFailed(int i) {
}
@Override
public void onException(Throwable throwable) {
}
});
2.获取好友列表
// 返回当前的好友列表
List<String> friends = NIMClient.getService(FriendService.class).getFriendAccounts();
功能六:发送图片消息&接收图片消息
1.首先创建一个图片消息
/**
* 创建一条图片消息
*
* @param sessionId 聊天对象ID
* @param sessionType 会话类型
* @param file 图片文件
* @param displayName 图片文件的显示名,可不同于文件名
* @return IMMessage 生成的消息对象
*/
public static IMMessage createImageMessage(String sessionId, SessionTypeEnum sessionType, File file, String displayName);
// 或者:创建一条图片消息并指定图片上传时使用的NOS场景
public static IMMessage createImageMessage(String sessionId, SessionTypeEnum sessionType, File file, String displayName, String nosTokenSceneKey)
2.发送
//跳转到图库
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,"image/*");
startActivityForResult(intent,1);
//选择发送
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
if(requestCode==1){
//获取真实路径,防止在某些机型,如小米中,获取的路径为空
Uri uri=Uri.parse(PathUtils.getRealUri(ChatActivity.this,data.getData()));
//转化为file文件
File imageFile=new File(uri.toString());
//构造图片消息对象
IMMessage message = MessageBuilder.createImageMessage(account,SessionTypeEnum.P2P, imageFile, imageFile.getName());
//发送图片消息
NIMClient.getService(MsgService.class).sendMessage(message, false);
mAdapter.addNewItem(new MessageEntity(null,data.getData().toString(),2,true));
mRecyclerView.scrollToPosition(list.size());
}
}
3.接收消息
private void initMessageObserver(){
// 处理新收到的消息,为了上传处理方便,SDK 保证参数 messages 全部来自同一个聊天对象。
//消息接收观察者
incomingMessageObserver = new Observer<List<IMMessage>>() {
@Override
public void onEvent(List<IMMessage> messages) {
// 处理新收到的消息,为了上传处理方便,SDK 保证参数 messages 全部来自同一个聊天对象。
IMMessage imMessage = messages.get(0);
if(imMessage.getMsgType().equals(MsgTypeEnum.text)){//文本消息
String messageStr=imMessage.getContent();
//添加到自己的listview列表里
mAdapter.addNewItem(new MessageEntity(messageStr,null,1,false));
}else if(imMessage.getMsgType().equals(MsgTypeEnum.image)){//图片消息
ImageAttachment msgAttachment=(ImageAttachment)imMessage.getAttachment();
String uri=msgAttachment.getThumbUrl();
mAdapter.addNewItem(new MessageEntity(null,uri,2,false));
}
account = imMessage.getFromAccount();
}
};
//注册消息接收观察者,
//true,代表注册.false,代表注销
NIMClient.getService(MsgServiceObserve.class)
.observeReceiveMessage(incomingMessageObserver, true);
}