环信集成(一)

首先登陆www.easemob.com 熟悉下,然后点击下载,下载sdk.里面包含了,uidemo和sdk

环信集成(一)

下载后显示

环信集成(一)

libs中含有jar包,easemobchat_2.0.4 把这个包放入到项目的libs中

添加AndroidMinifest权限

<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.CALL_PHONE" />
<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" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

<permission android:name="android.permission.BAIDU_LOCATION_SERVICE" />

<uses-permission android:name="android.permission.BAIDU_LOCATION_SERVICE" />

里面有位置发送,用到了百度地图,所以需要有百度地图的权限

 

在Application下需要添加

 

<!-- 开机自启动服务 -->
<receiver android:name="com.easemob.chat.StartServiceReceiver" >
<intent-filter android:priority="1000" >
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.QUICKBOOT_POWERON" />

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

<!-- 设置环信应用的appkey -->

<meta-data
android:name="EASEMOB_APPKEY"
android:value="easemob-demo#chatdemoui" />
<!-- 声明sdk所需的service -->
<service android:name="com.easemob.chat.EMChatService" />
<service
android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote" />

 

简单对上面需要加的解释下:

开机启动,即手机开机会自动登录开启后台Service,为了能够更好的收到消息

 

环信应用的AppKey,是从环信平台获取到的Appkey,怎样从环信平台获取Appkey,后面会讲。

 

在Android的Application类中需要加入的代码如下

// 初始化环信SDK,一定要先调用init()
Log.d("EMChat Demo", "initialize EMChat SDK");
EMChat.getInstance().init(applicationContext);
// debugmode设为true后,就能看到sdk打印的log了
EMChat.getInstance().setDebugMode(true);

 

简单解释下上面的代码,init方法是环信sdk需要的初始化,setDebugMode 这个方法设置为true可以看到sdk暴露出来的很多日志,便于开发者判断错误原因,建议发布程序时,改为false

 

 

下面在登录自己服务器的时候也到登录环信服务器,所以,环信服务器登录的方法如下:

// 调用sdk登陆方法登陆聊天服务器

EMChatManager.getInstance().login(username, password, new EMCallBack() {

@Override
public void onSuccess() {

 

}

@Override
public void onProgress(int progress, String status) {

}

@Override
public void onError(int code, final String message) {

}

 

登录成功后,可以获取自己的好友,

List<String> usernames = EMChatManager.getInstance().getContactUserNames();

可以根据username再次扩展更多的属性,比如服务端加个接口,根据用户名获取用户的详细信息,例如:gender,address,mobile等。最后保存到数据库中

 

 

可以获取自己的群组:

EMGroupManager.getInstance().getGroupsFromServer();

 

 

好了,环境配置好了,也登录获取到数据了,现在就要测试聊天了,

  

在App的主界面例如MainActivity 这里就要收到消息提醒和消息了。

接受消息就需要添加消息的广播

现在看下UIDemo怎么做的;

// 注册一个接收消息的BroadcastReceiver
msgReceiver = new NewMessageBroadcastReceiver();
IntentFilter intentFilter = new IntentFilter(EMChatManager.getInstance().getNewMessageBroadcastAction());
intentFilter.setPriority(3);
registerReceiver(msgReceiver, intentFilter);

// 注册一个ack回执消息的BroadcastReceiver
IntentFilter ackMessageIntentFilter = new IntentFilter(EMChatManager.getInstance()
.getAckMessageBroadcastAction());
ackMessageIntentFilter.setPriority(3);
registerReceiver(ackMessageReceiver, ackMessageIntentFilter);

 

上面代码注册了两个广播,第一个msgReceiver,这个是为了收到消息

而下面那个呢,看注册,哦,应该是回执,即对方是否消息已读,如果需要返回这个状态就增加这个广播,当然,这个广播也不是必须的,但上面那个是必须的否则会收不到消息

好吧,看看还需要什么:

// setContactListener监听联系人的变化等
EMContactManager.getInstance().setContactListener(new MyContactListener());
// 注册一个监听连接状态的listener
EMChatManager.getInstance().addConnectionListener(new MyConnectionListener());
// 注册群聊相关的listener
EMGroupManager.getInstance().addGroupChangeListener(new MyGroupChangeListener());
// 通知sdk,UI 已经初始化完毕,注册了相应的receiver和listener, 可以接受broadcast了
EMChat.getInstance().setAppInited();

 

监听联系人的变化:例如:联系人的添加,删除等;

监听连接状态:这个挺重要的。在线或者掉线了,都有监听,可对其进行其他的操作,例子中还举例了,踢人,即移动端不支持同一账号登陆,会被踢掉。

这个还是很多App有这样的功能的,不过环信还有webim,经测试可以在web端和手机端同时登陆一个账号。

在监听到具体信息后,可以做更新下标(几条未读消息)等操作,具体代码请看uidemo,

 

在聊天界面ChatActivity中,获取某个用户的所有会话,方法为

EMChatManager.getInstance().getConversation(username); 返回类型为EMConversation

conversation.getMsgCount()获取消息的数量;

conversation.getMessage(position) 获取到这条消息

 message.direct == EMMessage.Direct.RECEIVE 根据message.direct能够知道这个消息是发送回去的,还是接收到的

ChatType chatType = message.getChatType();    chatType != ChatType.GroupChat   根据ChatType可以判断是单聊还是群聊

 

这个类里面也添加了一个NewMessageBroadcastReceiver消息监听,可以在收到消息时刷新列表

ackMessageReceiver 已读回执监听,能够及时获取到是否对方已读;

仔细观察会发现监听中有个abortBroadcast();方法,这个方法是为了不让MainActivity和ChatActivity中监听重复,执行后终止监听。

 

才看这个demo有一些疑惑,不知道这个消息的发送在哪里,ChatActivity中没有体现啊,

其实这个发送消息用了另一种特别好的方案,消息发送在MessageAdapter里面,看下面代码

switch (message.getType()) {

		// 根据消息type显示item

		case IMAGE:

			handleImageMessage(message, holder, position, convertView);

			break;

		case TXT:

			handleTextMessage(message, holder, position);

			break;

		case LOCATION:

			handleLocationMessage(message, holder, position, convertView);

			break;

		case VOICE:

			handleVoiceMessage(message, holder, position, convertView);

			break;

		case VIDEO:

			handleVideoMessage(message, holder, position, convertView);

			break;

		default:

			// not supported

		}

  

这几个方法判断了,是否哪种消息类型。和具体发送方法,判断是这样的,以发消息举例

/**

	 * 文本消息

	 * 

	 * @param message

	 * @param holder

	 * @param position

	 */

	private void handleTextMessage(EMMessage message, ViewHolder holder, final int position) {

		TextMessageBody txtBody = (TextMessageBody) message.getBody();

		Spannable span = SmileUtils.getSmiledText(context, txtBody.getMessage());

		holder.tv.setText(span, BufferType.SPANNABLE);

		holder.tv.setOnLongClickListener(new OnLongClickListener() {

			@Override

			public boolean onLongClick(View v) {

				activity.startActivityForResult(

						(new Intent(activity, ContextMenu.class)).putExtra("position", position).putExtra("type",

								EMMessage.Type.TXT.ordinal()), ChatActivity.REQUEST_CODE_CONTEXT_MENU);

				return true;

			}

		});

		if (message.direct == EMMessage.Direct.SEND) {

			switch (message.status) {

			case SUCCESS:

				holder.pb.setVisibility(View.GONE);

				holder.staus_iv.setVisibility(View.GONE);

				break;

			case FAIL:

				holder.pb.setVisibility(View.GONE);

				holder.staus_iv.setVisibility(View.VISIBLE);

				break;

			case INPROGRESS:

				break;

			default:

				sendMsgInBackground(message, holder);

			}

		}

	}

  代码就是上面那个,判断如果是发送方,检测发送失败还是成功,未发送则调用sendMsgInBackground这个方法才是真的发送。

 

这样做有什么好处呢,个人认为:当你的消息发送一般,手机重启或者App被kill掉,让再次运行这个软件的时候,进入这个列表,列表中的信息会重新帮你发送出去,不用再次填写,至于是不是这个原因,均属我个人看法。

 

 集成差不多了,需要Appkey和账号哪里取?

你可能感兴趣的:(集成)