54.用环信实现聊天功能

1.配置EM

<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.administrator.chatdemo">

<!--环信需要权限--><uses-permission android:name="android.permission.VIBRATE" />    <uses-permission android:name="android.permission.INTERNET" />    <uses-permission android:name="android.permission.RECORD_AUDIO" />    <uses-permission android:name="android.permission.CAMERA" />    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><!--<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />--><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />    <uses-permission android:name="android.permission.GET_TASKS" />    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />    <uses-permission android:name="android.permission.WAKE_LOCK" />    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />    <uses-permission android:name="android.permission.READ_PHONE_STATE" />

<applicationandroid:name=".common.MyApplication"android:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme">        <activityandroid:name=".activity.MainActivity"android:label="@string/app_name">            <intent-filter>                <action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>

<activity android:name=".activity.A1_RegisterActivity" />        <activity android:name=".activity.A2_LoginActivity" />        <activityandroid:name=".activity.A3_SendTextActivity"android:launchMode="singleInstance" />

<!--环信:START--><meta-dataandroid:name="EASEMOB_APPKEY"android:value="fishgas#chatdemo" />        <service android:name="com.easemob.chat.EMChatService" /><!--环信:END--></application>

</manifest>
public class MyApplication extends Application {public static Context context;

@Overridepublic void onCreate() {super.onCreate();context = getApplicationContext();initEaseMob();initImageLoader();}

/**     * 配置ImageLoader     */private void initImageLoader() {        DisplayImageOptions defaultOptions = new DisplayImageOptions                .Builder()                .showImageForEmptyUri(R.drawable.empty_photo)                .showImageOnFail(R.drawable.empty_photo)                .cacheInMemory(true)                .cacheOnDisc(true)                .build();ImageLoaderConfiguration config = new ImageLoaderConfiguration                .Builder(getApplicationContext())                .defaultDisplayImageOptions(defaultOptions)                .discCacheSize(50 * 1024 * 1024)//.discCacheFileCount(100)//缓存一百张图片.writeDebugLogs()                .build();ImageLoader.getInstance().init(config);}

/**     * 配置环信IM     */private void initEaseMob() {        EMChat.getInstance().init(getApplicationContext());}

}

2.常用方法,已封装成工具类(待补充……)

/*环信工具类*/public class EMUtil {

/**     * EM注册账号*/public static void register(final Activity context, final String username, final String password) {new AsyncTask<String, Integer, String>() {@Overrideprotected String doInBackground(String... params) {// 调用sdk注册方法try {                    EMChatManager.getInstance().createAccountOnServer(username, password);//注册成功AbSharedUtil.putString(context, "username", username);AbSharedUtil.putString(context, "password", password);context.finish();showToastOnUI(context, "环信注册成功");} catch (EaseMobException e) {switch (e.getErrorCode()) {case EMError.NONETWORK_ERROR:showToastOnUI(context, "网络异常,请检查网络!");                            break;                        case EMError.USER_ALREADY_EXISTS:showToastOnUI(context, "用户已存在!");                            break;                        case EMError.UNAUTHORIZED:showToastOnUI(context, "注册失败,无权限!");                            break;                        default:showToastOnUI(context, "注册失败: " + e.getMessage());                            break;}                }return null;}        }.execute();}

/**     * EM登录账号*/public static void login(final Activity context, final String username, final String password) {new AsyncTask<String, Integer, String>() {@Overrideprotected String doInBackground(String... params) {                EMChatManager.getInstance().login(username, password, new EMCallBack() {//回调@Overridepublic void onSuccess() {context.runOnUiThread(new Runnable() {public void run() {                                EMGroupManager.getInstance().loadAllGroups();EMChatManager.getInstance().loadAllConversations();context.finish();showToastOnUI(context, "环信登录成功");}                        });}

@Overridepublic void onProgress(int progress, String status) {

}

@Overridepublic void onError(int code, String message) {                    }                });                return null;}        }.execute();}

/**     * EM动态注册广播,接受广播*/public static void registerEMReceiver(Activity context) {        EMReceiver msgReceiver = new EMReceiver();IntentFilter intentFilter = new IntentFilter(EMChatManager.getInstance().getNewMessageBroadcastAction());intentFilter.setPriority(3);context.registerReceiver(msgReceiver, intentFilter);}

/**     * EM发送文本消息*/public static void sendText(Activity context, String friendStr, String inputStr, final MyEMCallBack myEMCallBack) {        LogUtil.e("friendStr=" + friendStr + "\tinputStr=" + inputStr);String username = AbSharedUtil.getString(context, "username", "");String password = AbSharedUtil.getString(context, "password", "");//获取到与聊天人的会话对象。参数username为聊天人的userid或者groupid,后文中的username皆是如此EMConversation conversation = EMChatManager.getInstance().getConversation(username);//创建一条文本消息final EMMessage message = EMMessage.createSendMessage(EMMessage.Type.TXT);//如果是群聊,设置chattype,默认是单聊message.setChatType(EMMessage.ChatType.Chat);//设置消息bodyTextMessageBody txtBody = new TextMessageBody(inputStr);message.addBody(txtBody);//设置接收人message.setReceipt(friendStr);//把消息加入到此会话对象中conversation.addMessage(message);//发送消息,并传入回调监听EMChatManager.getInstance().sendMessage(message, new EMCallBack() {@Overridepublic void onSuccess() {                LogUtil.e("");myEMCallBack.onSuccess(message);}

@Overridepublic void onError(int i, String s) {myEMCallBack.onError(i, s);}

@Overridepublic void onProgress(int i, String s) {            }        });}

/**     * 对EM回调进行改造,成功的方法中多传一个EMMessage对象*/public interface MyEMCallBack {void onSuccess(EMMessage message);        void onError(int var1, String var2);}

/**     * 在分线程中显示Toast     */public static void showToastOnUI(final Activity context, final CharSequence message) {        context.runOnUiThread(new Runnable() {@Overridepublic void run() {                Looper.getMainLooper();LogUtil.s(message);}        });}

}

3.接受消息的广播

public class EMReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {        abortBroadcast();// 注销广播,避免重复接收String msgId = intent.getStringExtra("msgid");// 消息id(每条消息都会生成唯一的一个id,目前是SDK生成)String username = intent.getStringExtra("from");//发送方EMMessage message = EMChatManager.getInstance().getMessage(msgId); // 收到这个广播的时候,message已经在db和内存里了,可以通过id获取mesage对象EMConversation conversation = EMChatManager.getInstance().getConversation(username);

LogUtil.e("接受到环信的消息:message=" + JSON.toJSONString(message));

Intent it = new Intent(context, A3_SendTextActivity.class);Bundle bundle = new Bundle();bundle.putParcelable("message", message);it.putExtras(bundle);it.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);context.startActivity(it);

}}

4.聊天界面

//发送消息public class A3_SendTextActivity extends Activity {    Context context = A3_SendTextActivity.this;

@InjectView(R.id.et_friend)    EditText friend;@InjectView(R.id.et_input)    EditText input;

@InjectView(R.id.listview)    ListView listView;ChatAdapter adapter;List<EMMessage> data = new ArrayList<EMMessage>();

@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_sendtext);ButterKnife.inject(this);initListView();EMUtil.registerEMReceiver(A3_SendTextActivity.this);}

@OnClick(R.id.send)public void doSend(View v) {        String friendStr = friend.getText().toString().trim();String inputStr = input.getText().toString().trim();

if (TextUtils.isEmpty(friendStr) || TextUtils.isEmpty(inputStr)) {            LogUtil.s("请输入完整信息!");            return;}        EMUtil.sendText(A3_SendTextActivity.this, friendStr, inputStr, new EMUtil.MyEMCallBack() {@Overridepublic void onSuccess(EMMessage message) {                LogUtil.e("");addEMMessageToListView(message);}

@Overridepublic void onError(int var1, String var2) {

}        });}

@OnClick(R.id.getmsg)public void doGetMSg(View v) {        String friendStr = friend.getText().toString().trim();        if (TextUtils.isEmpty(friendStr)) {            LogUtil.s("请输入完整信息!");            return;}        getMsgList(friendStr);}

/**     * 初始化聊天消息列表*/private void initListView() {adapter = new ChatAdapter(context);listView.setAdapter(adapter);}

/**     * 从广播进入聊天界面*/@Overrideprotected void onNewIntent(Intent intent) {        Bundle bun = intent.getExtras();EMMessage message = bun.getParcelable("message");addEMMessageToListView(message);}

/**     * 获取与好友的聊天记录*/private void getMsgList(String friendStr) {        EMConversation conversation = EMChatManager.getInstance().getConversation(friendStr);//获取此会话的所有消息List<EMMessage> messages = conversation.getAllMessages();data = messages;adapter.setData(data);adapter.notifyDataSetChanged();listView.setSelection(data.size());}

/**     * 将接受的消息添加进listview     */private void addEMMessageToListView(EMMessage msg) {data.add(msg);adapter.setData(data);adapter.notifyDataSetChanged();listView.setSelection(data.size());}

}

源码:

EMSDK官网:

http://docs.easemob.com/doku.php?id=start:200androidcleintintegration:30androidsdkbasics

来自为知笔记(Wiz)

附件列表

时间: 2024-08-24 10:09:04

54.用环信实现聊天功能的相关文章

iOS环信视频聊天

这是我自己利用环信写的一个单纯的视频聊天功能demo 首先需要去环信官网申请一个appkey,并将sdk集成到项目中 然后加入类库 APPDelegate.m // // AppDelegate.m // VideoChat // // Created by 小灰灰的pro on 16/8/31. // Copyright © 2016年 小灰灰. All rights reserved. // #import "AppDelegate.h" #import "EMSDK.h

环信即时聊天步骤

1:注册账号 2:下载sdk 3:导入modle EaseUI 4:讲model加入到主项目 5:登陆功能:代码如下: EMClient.getInstance().login(userName,password,new EMCallBack() {//回调 @Override public void onSuccess() { EMClient.getInstance().groupManager().loadAllGroups(); EMClient.getInstance().chatMa

iOS环信即时聊天

一.注册登陆环形开发者账号,并且创建应用,获得对应的AppKey 二.根据实际情况制作并上传推送证书(开发环境推送证书sandbox,请选择 Apple Push Notification service SSL  / 生产环境证书production,请选择 Apple Push Notification service SSL ) 详细制作步骤属于iOS开发基本知识,这里不再做详细说明. 三.集成iOS 环信SDK.为了方便快速,这里我们直接使用Cocoapods集成 在终端cd到该工程跟目

iOS 环信集成问题(连文档都不说明的坑。。)

首先,关于环信SDK的下载和一些依赖库的添加,在此我就不做详细介绍,(http://www.easemob.com/download/im)附上环信官网文档,可以看一下,上面都可以下载,也有相关配置介绍. 今天主要说一下,环信集成遇到的各种坑,各种问题,有的连文档都不说明的坑..(主要是讲解完全集成环信,UI的聊天界面,单聊功能也是环信的这种情况) 各位可能刚在官网下载下来ChatDemo-UI3.0这个版本,会发现HyphenateFullSDK和官网文档有个不一样的地方,少了个文件(libH

[Java]直播方案----[接入环信聊天室]+[腾讯云直播]

辛辛苦苦写的,转载请注明一下,这点信任我想还是有的吧,谢谢了. http://www.cnblogs.com/applerosa/p/7162268.html 之前做了直播,一直没时间写,好不容易闲下来,所以总结记录一下. 需要注意的是,在获取环信聊天室ID和腾讯云三个推/拉流地址的时候,需要先去注册,获取所用开发者账号. 所以这个教程所必须的东西: 1.环信开发者账号; 2.腾讯云开发者账号; 一.做直播,肯定要有一个直播模型,这里我们用直播间来做示例: 这里只是做个基础的演示,所以都是必须的

即时聊天-环信

在Xcode项目中,怎样导入即时通讯步骤如下:(Xcode突然崩溃这是我第二遍写,没谁了) 1.下载SDK 一般情况下我们使用SDK时都会下载最新版本的下面以V3.1.1为例 2.导入下载好的SDK 这一步把导入文件倒入到项目文件中,记得要勾选上Copy items if  needed  噢! 3.添加依赖库 点击Buide Phases中的Link Binary With Libraries 4.运行编译器,检查是否报错 这一步真机和模拟器运行结果是不一样的,要看清楚 5. 真机错误修复 6

线程阻塞问题-功能:环信登录失败后自动登录5次

项目中集成了环信,点击联系客服时需要调取环信的接口,现在有个要求,如果调取环信的登录接口失败了,就要重新登录,但是这个操作不能影响主线程的操作,登录次数达到一定的数量后停止登录.首先:环信的登录时同步的,需要我们开启一个线程,不然当环信登录失败时会很容易造成界面卡死的情况.+ (void)loginWithSuccessBlock:(void(^)())success FailureBlock:(void(^)())failure{   // 自己封装的一个公共类 // 开启一个线程防止登录失败

环信SDK

初始化 SDK 第 1 步:引入相关头文件 #import “EMSDK.h”. 第 2 步:在工程的 AppDelegate 中的以下方法中,调用 SDK 对应方法. - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { //AppKey:注册的AppKey,详细见下面注释. //apnsCertName:推送证书名(不需要加后

Android 环信的使用

1.导入包 http://docs.easemob.com/doku.php?id=start:200androidcleintintegration:10androidsdkimport 在清单文件AndroidManifest.xml里加入以下权限,以及写上你注册的appkey 1.权限配置: <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://