环信简单集成
環信稱自己市場占有第一,這次試著集成環信
?
不過一開始就被坑了,環信的UI組件庫叫做?EaseUI ,這玩意居然只有eclipse的版本,官方文檔說Android Studio導入有問題,要手動改,這一點不如融云
不過找到了一篇博客,直接新建module復制關鍵文件,終于搞定了
若出現UnsatisfiedLinkError ??創建armeabi-v7a,把armeabi里的復制一份放進去
?
聊天3個基本頁面 ??會話列表頁面,聯系人頁面,聊天頁面 都是Fragment
?
會話列表 ?ConversationListFragment
initView里面是沒網的時候,顯示在item上面的布局 , 監聽連接是否成功和斷開的方法沒寫
17行 ?隱藏 標題欄
20行設置了 點擊會話item的事件,拿到EMConversation對象,通過它可以獲取對方的username,會話的類型,把必要的參數交給intent,進入聊天頁面
19行 給列表綁定 onCreateContextMenu 事件,長按就會彈出菜單,onContextItemSelected執行點擊的結果, 類似actionbar的菜單事件
1 public class ConversationListFragment extends EaseConversationListFragment { 2 3 private TextView errorText; 4 5 @Override 6 protected void initView() { 7 super.initView(); 8 View errorView = View.inflate(getActivity(), R.layout.em_chat_neterror_item, null); 9 errorItemContainer.addView(errorView); 10 errorText = (TextView) errorView.findViewById(R.id.tv_connect_errormsg); 11 } 12 13 14 @Override 15 protected void setUpView() { 16 super.setUpView(); 17 titleBar.setVisibility(View.GONE); 18 // 注冊上下文菜單 19 registerForContextMenu(conversationListView); 20 conversationListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 21 @Override 22 public void onItemClick(AdapterView<?> adapterView, View view, int pos, long id) { 23 EMConversation conversation = conversationListView.getItem(pos); 24 String name = conversation.getUserName(); 25 if (name.equals(EMClient.getInstance().getCurrentUser())) { 26 Logger.e("不能自己聊"); 27 } else { 28 Intent intent = new Intent(getActivity(), ChatActivity.class); 29 if (conversation.isGroup()) { 30 if (conversation.getType() == EMConversation.EMConversationType.ChatRoom) { 31 intent.putExtra("type", EaseConstant.CHATTYPE_CHATROOM); 32 } else { 33 intent.putExtra("type", EaseConstant.CHATTYPE_GROUP); 34 } 35 } 36 intent.putExtra("id", name); 37 startActivity(intent); 38 } 39 40 } 41 }); 42 43 } 44 45 @Override 46 public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { 47 getActivity().getMenuInflater().inflate(R.menu.conversationlist, menu); 48 } 49 50 @Override 51 public boolean onContextItemSelected(MenuItem item) { 52 if (item.getItemId() == R.id.delete) { 53 EMConversation tobeDeleteCons = conversationListView.getItem(((AdapterView.AdapterContextMenuInfo) item 54 .getMenuInfo()).position); 55 String username = tobeDeleteCons.getUserName(); 56 //刪除和某個user會話,如果需要保留聊天記錄,傳false 57 EMClient.getInstance().chatManager().deleteConversation(username, true); 58 } else if (item.getItemId() == R.id.test) { 59 Logger.e("test"); 60 } 61 return true; 62 } 63 }?
聊天頁面是activity
10 11 獲取傳入的參數,用然后啟動?EaseChatFragment,直接整個布局容納fragment
主要只要傳如聯系人的id或者群組的id就夠了
1 public class ChatActivity extends AppCompatActivity { 2 3 private EaseChatFragment chatFragment; 4 5 @Override 6 protected void onCreate(Bundle savedInstanceState) { 7 super.onCreate(savedInstanceState); 8 setContentView(R.layout.activity_chat); 9 ButterKnife.bind(this); 10 String name=getIntent().getExtras().getString("username"); 11 int type=getIntent().getExtras().getInt("type"); 12 13 chatFragment = new EaseChatFragment(); 14 15 Bundle bundle=new Bundle(); 16 bundle.putString(EaseConstant.EXTRA_USER_ID,name); 17 bundle.putInt(EaseConstant.EXTRA_CHAT_TYPE,type); 18 chatFragment.setArguments(bundle); 19 getSupportFragmentManager().beginTransaction().add(R.id.container, chatFragment).commit(); 20 21 } 22 @Override 23 public void onBackPressed() { 24 chatFragment.onBackPressed(); 25 } 26 }發送位置這塊,sdk已經做好,但是沒有在AndroidManifest 配置就要報錯了
在module的AndroidManifest ?直接寫上
<activity android:name=".ui.EaseBaiduMapActivity"></activity><!-- 百度地圖所需的service --><serviceandroid:name="com.baidu.location.f"android:enabled="true"android:process=":remote" /><meta-dataandroid:name="com.baidu.lbsapi.API_KEY"android:value="3ecea51f560650b1ed8a4b99808f52e8" />?
?
如果想要實現 點擊頭像,點擊消息框的事件 就要新建一個 fragment 繼承EaseChatFragment ?
重寫方法
messageList = (EaseChatMessageList) getView().findViewById(R.id.message_list); //初始化messagelist messageList.init(toChatUsername, chatType, null); //設置item里的控件的點擊事件 messageList.setItemClickListener(new EaseChatMessageList.MessageListItemClickListener() {@Overridepublic void onUserAvatarClick(String username) {//頭像點擊事件 }@Overridepublic void onResendClick(final EMMessage message) {//重發消息按鈕點擊事件 }@Overridepublic void onBubbleLongClick(EMMessage message) {//氣泡框長按事件 }@Overridepublic boolean onBubbleClick(EMMessage message) {//氣泡框點擊事件,EaseUI有默認實現這個事件,如果需要覆蓋,return值要返回truereturn false; } }); //獲取下拉刷新控件 swipeRefreshLayout = messageList.getSwipeRefreshLayout(); //刷新消息列表 messageList.refresh(); messageList.refreshSeekTo(position); messageList.refreshSelectLast(); View Code?
聯系人頁面 ?
值得注意的是 聯系人界面有一些 固定到頂部的item,這里也都封裝好了,在initView里定義好headerview ,找到控件設置點擊事件,再用listview 的addHeaderView
其次要注意的是 聯系人的數據 這個在setUpView中用setContactsMap設置,一般來說都是從服務器獲取,自然就需要加載時間了,可以設置loadingView,再加載數據時顯示,完畢隱藏
1 public class ContactListFragment extends EaseContactListFragment { 2 3 private View loadingView; 4 private ContactItemView applicationItem; 5 6 7 @Override 8 protected void initView() { 9 super.initView(); 10 View headerView = LayoutInflater.from(getActivity()).inflate(R.layout.em_contacts_header, null); 11 HeaderItemClickListener listener = new HeaderItemClickListener(); 12 applicationItem = (ContactItemView) headerView.findViewById(R.id.application_item); 13 applicationItem.setOnClickListener(listener); 14 headerView.findViewById(R.id.group_item).setOnClickListener(listener); 15 listView.addHeaderView(headerView); 16 17 //添加正在加載數據提示的loading view 18 loadingView = LayoutInflater.from(getActivity()).inflate(R.layout.em_layout_loading_data, null); 19 contentContainer.addView(loadingView); 20 21 //注冊上下文菜單 22 registerForContextMenu(listView); 23 24 } 25 26 @Override 27 protected void setUpView() { 28 super.setUpView(); 29 Map<String, EaseUser> userMap = new HashMap<>(); 30 for (int i = 1; i < 20; i++) { 31 EaseUser easeUser = new EaseUser("User " + i); 32 userMap.put(" " + i, easeUser); 33 } 34 setContactsMap(userMap); 35 super.setUpView(); 36 } 37 38 39 class HeaderItemClickListener implements View.OnClickListener { 40 @Override 41 public void onClick(View view) { 42 switch (view.getId()) { 43 case R.id.application_item: 44 Toast.makeText(getActivity(), "application_item", 0).show(); 45 break; 46 case R.id.group_item: 47 Toast.makeText(getActivity(), "group_item", 0).show(); 48 break; 49 } 50 } 51 } 52 53 }?
轉載于:https://www.cnblogs.com/demon9/p/5865522.html
總結
- 上一篇: webStorm Linux Ubunt
- 下一篇: 链接