积累系统性知识
积聚技术精华
  首页    个人中心    撰写积文    建立课题    订立目标    整理积文    管理课题    管理目标    技能Get    代码积累 
Android- 环信IM即时通讯(1)
error997 (error997)    2015-05-10 19:11:13      目标    课题
   ********************************环境配置************************
1.拷贝Demo包下的libs包下的
baidumapapi_v2_1_1.jar
easemobchat_2.1.3.jar
locSDK_3.3.jar
armeabi文件夹
2.配置权限
<!-- Required -->
    <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" />


    <permission android:name="android.permission.BAIDU_LOCATION_SERVICE" />
    <uses-permission android:name="android.permission.BAIDU_LOCATION_SERVICE" />
3.设置配置组件
<!-- 开机自启动服务 -->
        <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>


        <!-- Required. AppKey copied from Portal -->
        <meta-data
切换到: 纯代码  
   
            android:name="EASEMOB_APPKEY"
            android:value="easemob-demo#chatdemoui" />

        <!-- Required SDK核心功能 -->
        <service android:name="com.easemob.chat.EMChatService" />
        <!-- 百度地图所需的service -->
        <service
切换到: 纯代码  
   
            android:name="com.baidu.location.f"
            android:enabled="true"
            android:process=":remote" />

4.Application配置


切换到: 纯代码  
   
public class MyApplication extends Application {

public static Context appContext;

@Override
切换到: 纯代码  
   
public void onCreate() {
super.onCreate();
appContext = this;
int pid = android.os.Process.myPid();
String processAppName = getAppName(pid);
// 如果使用到百度地图或者类似启动remote service的第三方库,这个if判断不能少
if (processAppName == null || processAppName.equals("")) {
// workaround for baidu location sdk
// 百度定位sdk,定位服务运行在一个单独的进程,每次定位服务启动的时候,都会调用application::onCreate
// 创建新的进程。
// 但环信的sdk只需要在主进程中初始化一次。 这个特殊处理是,如果从pid 找不到对应的processInfo
// processName,
// 则此application::onCreate 是被service 调用的,直接返回
return;
}
// 初始化环信SDK
Log.d("DemoApplication", "Initialize EMChat SDK");
EMChat.getInstance().init(appContext);


// 获取到EMChatOptions对象
EMChatOptions options = EMChatManager.getInstance().getChatOptions();
// 默认添加好友时,是不需要验证的,改成需要验证
options.setAcceptInvitationAlways(false);
// 设置收到消息是否有新消息通知,默认为true
options.setNotificationEnable(false);
// 设置收到消息是否有声音提示,默认为true
options.setNoticeBySound(false);
// 设置收到消息是否震动 默认为true
options.setNoticedByVibrate(false);
// 设置语音消息播放是否设置为扬声器播放 默认为true
options.setUseSpeaker(false);
}


private String getAppName(int pID) {
String processName = null;
ActivityManager am = (ActivityManager) this
.getSystemService(ACTIVITY_SERVICE);
List l = am.getRunningAppProcesses();
Iterator i = l.iterator();
PackageManager pm = this.getPackageManager();
while (i.hasNext()) {
ActivityManager.RunningAppProcessInfo info = (ActivityManager.RunningAppProcessInfo) (i
.next());
try {
if (info.pid == pID) {
CharSequence c = pm.getApplicationLabel(pm
.getApplicationInfo(info.processName,
PackageManager.GET_META_DATA));
processName = info.processName;
return processName;
}
} catch (Exception e) {
}
}
return processName;
}


}
     

*************************注册/登陆/退出*******************************
1.注册
切换到: 纯代码  
   
private void regist() {
new Thread(new Runnable() {
public void run() {
try {
// 调用sdk注册方法
EMChatManager.getInstance().createAccountOnServer(
name.getText().toString(), pwd.getText().toString());
} catch (final EaseMobException e) {
int errorCode=e.getErrorCode();
if(errorCode==EMError.NONETWORK_ERROR){
//"网络异常,请检查网络!"
}else if(errorCode==EMError.USER_ALREADY_EXISTS){
//"用户已存在!"
}else if(errorCode==EMError.UNAUTHORIZED){
//"注册失败,无权限!"
}else{
//"注册失败 "
}
}
}
}).start();
}

2.登陆
切换到: 纯代码  
   
EMChatManager.getInstance().login(name.getText().toString(),
pwd.getText().toString(), new EMCallBack() {

@Override
切换到: 纯代码  
   
public void onSuccess() {
Log.v("Lean", "登陆成功");
// 1.保存帐号密码
// save name and pwd
// 2.更新当前用户的nickname 此方法的作用是在ios离线推送时能够显示用户nick
boolean updatenick = EMChatManager.getInstance()
.updateCurrentUserNick(
name.getText().toString());
if (!updatenick) {
// "update current user nick fail"
}
}

@Override
切换到: 纯代码  
   
public void onProgress(int progress, String status) {
}

@Override
切换到: 纯代码  
   
public void onError(int code, String message) {
Log.v("Lean", "登陆失败");
}
});

3.顶号处理/强制下线处理
切换到: 纯代码  
   
private class MyConnectionListener implements EMConnectionListener {

@Override
切换到: 纯代码  
   
public void onConnected() {
runOnUiThread(new Runnable() {

@Override
切换到: 纯代码  
   
public void run() {
}
});
}

@Override
切换到: 纯代码  
   
public void onDisconnected(final int error) {
runOnUiThread(new Runnable() {

@Override
切换到: 纯代码  
   
public void run() {
if (error == EMError.CONNECTION_CONFLICT) {
// 显示帐号在其他设备登陆dialog
} else {
if (NetUtils.hasNetwork(MainActivity.this))
//"连接不到聊天服务器"
else
//"当前网络不可用,请检查网络设置"
}
}


});
}
}

4.退出
切换到: 纯代码  
   
MChatManager.getInstance().logout();//此方法为同步方法

或者
切换到: 纯代码  
   
EMChatManager.getInstance().logout(new EMCallBack(){})//此方法为异步方法
//后文中,如遇到new EMCallBack()即为new EMCallBack(){}

**************************界面管理******************************
切换到: 纯代码  
   
public class BaseActivity extends Activity{

@Override
切换到: 纯代码  
   
protected void onResume() {
super.onResume();
// onresume时,取消notification显示
EMChatManager.getInstance().activityResumed();
}

@Override
切换到: 纯代码  
   
protected void onDestroy() {
super.onDestroy();
EMChatManager.getInstance().logout();
}

}

**************************好友管理******************************
1.获取好友列表(异步)
切换到: 纯代码  
   
new Thread(new Runnable() {

@Override
切换到: 纯代码  
   
public void run() {
try {
List<String> usernames=EMContactManager.getInstance().
getContactUserNames();
Message msg=new Message();
msg.what=1;
msg.obj=usernames;
mHandler.sendMessage(msg);
} catch (EaseMobException e) {
Log.v("Lean",e.getMessage()+"  "+e.getErrorCode());
}
}
}).start();

2.添加好友申请
切换到: 纯代码  
   
try {
EMContactManager.getInstance()
.addContact(user_name.getText().toString(),"加我吧!");
} catch (EaseMobException e) {}

3.同意添加好友(异步)
切换到: 纯代码  
   
new Thread(new Runnable() {

@Override
切换到: 纯代码  
   
public void run() {
try {
EMChatManager.getInstance().acceptInvitation(username);
Message msg=new Message();
msg.what=0;
mHandler.sendMessage(msg);
} catch (EaseMobException e) {
// TODO
}
}
}).start();

3.删除好友
切换到: 纯代码  
   
try {
EMContactManager.getInstance()
.deleteContact(((TextView)arg1).getText().toString());
} catch (EaseMobException e) {}

4.好友监听器
Tip:
切换到: 纯代码  
   
EMContactManager.getInstance().setContactListener(new MyContactListener());
//设置监听器完毕必须调用如下代码 保证监听器等运行正常
EMChat.getInstance().setAppInited();


/***
 * 好友变化listener
 * 
 */
private class MyContactListener implements EMContactListener {

@Override
切换到: 纯代码  
   
public void onContactAdded(List<String> usernameList) {
Log.v("Lean","onContactAdded..");
}

@Override
切换到: 纯代码  
   
public void onContactDeleted(final List<String> usernameList) {
Log.v("Lean","onContactDeleted..");
}

@Override
切换到: 纯代码  
   
public void onContactInvited(String username, String reason) {
Log.v("Lean","onContactInvited..");
}

@Override
切换到: 纯代码  
   
public void onContactAgreed(String username) {
Log.v("Lean","onContactAgreed..");
}

@Override
切换到: 纯代码  
   
public void onContactRefused(String username) {
Log.d(username, username + "拒绝了你的好友请求");
}


}       

**************************单聊******************************
1.发送(文字/图片)消息
切换到: 纯代码  
   
// 获取到与聊天人的会话对象。参数username为聊天人的userid或者groupid,后文中的username皆是如此
EMConversation conversation = EMChatManager.getInstance()
.getConversation(userName);
// 创建一条文本消息
EMMessage message = EMMessage.createSendMessage(EMMessage.Type.TXT);
// 设置消息body
TextMessageBody txtBody = new TextMessageBody(mSendMsg.getText()
.toString());
message.addBody(txtBody);

message.setFrom(MyApplication.userName);
message.setTo(userName);
message.setMsgTime(System.currentTimeMillis());
message.setReceipt(userName);
// 把消息加入到此会话对象中
conversation.addMessage(message);
// 发送消息
EMChatManager.getInstance().sendMessage(message, null);

2.接收消息
2-1.动态注册
切换到: 纯代码  
   
NewMessageBroadcastReceiver msgReceiver = new NewMessageBroadcastReceiver();
IntentFilter intentFilter = new IntentFilter(EMChatManager
.getInstance().getNewMessageBroadcastAction());
intentFilter.setPriority(3);
registerReceiver(msgReceiver, intentFilter);

2-2.实现BroadcastReceiver
切换到: 纯代码  
   
private class NewMessageBroadcastReceiver extends BroadcastReceiver {

@Override
切换到: 纯代码  
   
public void onReceive(Context context, Intent intent) {
// 消息id
String msgId = intent.getStringExtra("msgid");
// 发消息的人的username(userid)
// String msgFrom = intent.getStringExtra("from");
// 消息类型,文本,图片,语音消息等,这里返回的值为msg.type.ordinal()。
// 所以消息type实际为是enum类型
// int msgType = intent.getIntExtra("type", 0);
// 更方便的方法是通过msgId直接获取整个message
EMMessage message = EMChatManager.getInstance().getMessage(msgId);
//TODO  刷新界面数据
}
}

3.清除记录
切换到: 纯代码  
   
//清除特定用户聊天记录并刷新界面
EMChatManager.getInstance().clearConversation(userName);

4.发送特定消息
4-1.只要在发送的时候对EMMessage增加属性就可以了 如下:
切换到: 纯代码  
   
EMMessage message = EMMessage.createSendMessage(EMMessage.Type.TXT);
message.setAttribute("USERAGE", 18);
message.setAttribute("USERNAME", "Lean");

4-2.在广播接收者接收到EMMessage后,对其做取属性操作:
切换到: 纯代码  
   
EMMessage message = EMChatManager.getInstance().getMessage(msgId);
try {
Log.v("Lean", message.getStringAttribute("USERNAME"));
Log.v("Lean", message.getIntAttribute("USERAGE") + "");
} catch (EaseMobException e) {
e.printStackTrace();
}

5.存取聊天记录(未研究)


**************************群聊******************************
新建/解散群聊
切换到: 纯代码  
   
//groupName:要创建的群聊的名称
//desc:群聊简介
//members:群聊成员,为空时这个创建的群组只包含自己
//allowInvite:是否允许群成员邀请人进群
EMGroupManager.getInstance().createPrivateGroup(groupName, desc, members,allowInvite);
//前一种方法创建的群聊默认最大群聊用户数为200,传入maxUsers后设置自定义的最大用户数,最大为2000
EMGroupManager.getInstance().createPrivateGroup(groupName, desc, members,allowInvite,maxUsers);

//解散群聊
EMGroupManager.getInstance().exitAndDeleteGroup(groupId);

群聊加人/减人
切换到: 纯代码  
   
//群主加人调用此方法
EMGroupManager.getInstance().addUsersToGroup(groupId, newmembers);
//私有群里,如果开放了群成员邀请,群成员邀请调用下面方法
EMGroupManager.getInstance().inviteUser(groupId, newmembers, null);

//把username从群聊里删除
EMGroupManager.getInstance().removeUserFromGroup(groupId, username);

加入/退出某个群聊
切换到: 纯代码  
   
//如果群开群是自由加入的,即group.isMembersOnly()为false,直接join
EMGroupManager.getInstance().joinGroup(groupid);
//需要申请和验证才能加入的,即group.isMembersOnly()为true,调用下面方法
EMGroupManager.getInstance().applyJoinToGroup(groupid, "求加入");
//退出群
EMGroupManager.getInstance().exitFromGroup(groupId);

获取群组信息
切换到: 纯代码  
   
//根据群聊ID从本地获取群聊信息
EMGroup group = EMGroupManager.getInstance().getGroup(groupId);
//根据群聊ID从服务器获取群聊信息
EMGroup group =EMGroupManager.getInstance().getGroupFromServer(groupId);
//保存获取下来的群聊信息
EMGroupManager.getInstance().createOrUpdateLocalGroup(returnGroup);
group.getMembers();//获取群成员
group.getOwner();//获取群主
......

修改群名称
切换到: 纯代码  
   
EMGroupManager.getInstance().changeGroupName({groupId}, {changedGroupName});

获取群聊列表
切换到: 纯代码  
   
//从服务器获取自己加入的和创建的群聊列表,此api获取的群组sdk会自动保存到内存和db。
//注意,获取到的列表里的群聊只有groupname和groupid等简单配置信息
List<EMGroup> grouplist = EMGroupManager.getInstance().getGroupsFromServer();


//从本地加载群聊列表
List<EMGroup> grouplist = EMGroupManager.getInstance().getAllGroups();


//获取所有公开群列表
List<EMGroupInfo> groupsList = EMGroupManager.getInstance().getAllPublicGroupsFromServer();

屏蔽群消息/解除屏蔽群
切换到: 纯代码  
   
//屏蔽群消息后,就不能接收到此群的消息 (群创建者不能屏蔽群消息)
   //根据groupid屏蔽此群所有发来的消息
EMGroupManager.getInstance().blockGroupMessage(groupId);
 
 //解除屏蔽群后,就可以正常收到群的所有消息
    EMGroupManager.getInstance().unblockGroupMessage(groupId);-

消息只显数目
切换到: 纯代码  
   
//如果群聊只是想提示数目,不响铃。可以通过此属性设置,此属性是本地属性
EMChatManager.getInstance().getChatOptions().setReceiveNotNoifyGroup({List<String>})

群聊事件监听
切换到: 纯代码  
   
EMGroupManager.getInstance().addGroupChangeListener(new GroupChangeListener() {

@Override
切换到: 纯代码  
   
public void onUserRemoved(String groupId, String groupName) {
//当前用户被管理员移除出群聊
}

@Override
切换到: 纯代码  
   
public void onInvitationReceived(String groupId, String groupName, String inviter, String reason) {
//收到加入群聊的邀请
}

@Override
切换到: 纯代码  
   
public void onInvitationDeclined(String groupId, String invitee, String reason) {
//群聊邀请被拒绝
}

@Override
切换到: 纯代码  
   
public void onInvitationAccpted(String groupId, String inviter, String reason) {
//群聊邀请被接受
}

@Override
切换到: 纯代码  
   
public void onGroupDestroy(String groupId, String groupName) {
//群聊被创建者解散
}

@Override
切换到: 纯代码  
   
public void onApplicationReceived(String groupId, String groupName, String applyer, String reason) {
//收到加群申请
}

@Override
切换到: 纯代码  
   
public void onApplicationAccept(String groupId, String groupName, String accepter) {
//加群申请被同意
}

@Override
切换到: 纯代码  
   
public void onApplicationDeclined(String groupId, String groupName, String decliner, String reason) {
// 加群申请被拒绝
}
});

把用户移入黑名单/把用户移除黑名单/获取黑名单列表(未研究)

转自 http://blog.csdn.net/qq285016127/article/details/41943999
(+0)技能Get

建议楼主:搜索关键字 |参考其他资源 |回复 |追问
  error997(error997):   个人中心    课题    目标    代码积累