1. 程式人生 > >Android- 環信IM即時通訊(1)

Android- 環信IM即時通訊(1)

********************************環境配置************************
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) {
// 加群申請被拒絕
}
});


把使用者移入黑名單/把使用者移除黑名單/獲取黑名單列表(未研究)