Android环信3.0即时通讯云入门指北
基础集成
http://docs-im.easemob.com/im/android/sdk/basic
- 集成
- 初始化
- 登录
- 聊天
- 通知
安卓8.0以上版本channelId问题
修改EaseNotifier的sendNotification方法
在 create and send notificaiton 下面
修改
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(appContext)
.setSmallIcon(appContext.getApplicationInfo().icon)
.setWhen(System.currentTimeMillis()).setAutoCancel(true);
为
NotificationCompat.Builder mBuilder;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
//描述
String description = "push IM Message in background";
String CHANNEL_ONE_ID = "cn.dankal.cheerstoka";
//设定的通知渠道名称
String channelName = "cheerstoka-im";
//设置通知的重要程度
int importance = NotificationManager.IMPORTANCE_LOW;
//构建通知渠道
NotificationChannel channel = new NotificationChannel(CHANNEL_ONE_ID, channelName, importance);
channel.setDescription(description);
//向系统注册通知渠道,注册后不能改变重要性以及其他通知行为
NotificationManager notificationManager = (NotificationManager) appContext.getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.createNotificationChannel(channel);
// create and send notificaiton
mBuilder = new NotificationCompat.Builder(appContext, CHANNEL_ONE_ID)
.setSmallIcon(appContext.getApplicationInfo().icon)
.setWhen(System.currentTimeMillis())
.setAutoCancel(true);
} else {
// create and send notificaiton
mBuilder = new NotificationCompat.Builder(appContext)
.setSmallIcon(appContext.getApplicationInfo().icon)
.setWhen(System.currentTimeMillis())
.setAutoCancel(true);
}
- 修改头像
- 修改昵称需要同步苹果 APNS 推送的昵称
http://docs-im.easemob.com/im/android/push/nickname - 退出登录
EMClient.getInstance().logout(true);
单聊无需做单独地退出登录,在退出应用账号的时候调用即可
EMClient.getInstance().logout(true);
群聊
EMClient.getInstance().groupManager().leaveGroup(groupId);//需异步处理
easeui
-
官方文档,其实写得很详细了
http://docs-im.easemob.com/im/android/other/easeui -
聊天联系人列表
public class MessageFrament extends EaseConversationListFragment implements
EaseConversationListFragment.EaseConversationListItemClickListener {
@Override
protected void initView() {
super.initView();
setConversationListItemClickListener(this);
}
@Override
public void onListItemClicked(EMConversation conversation) {
EMMessage lastMessage = conversation.getLatestMessageFromOthers();
if (lastMessage != null) {
···
}
}
- 自定义ChatPrimaryMenu,例如自定义布局dankal_layout_chat_primary_menu
EaseChatPrimaryMenuBase primaryMenu = (EaseChatPrimaryMenuBase)
getLayoutInflater().inflate(R.layout.dankal_layout_chat_primary_menu, null);
inputMenu.setCustomPrimaryMenu(primaryMenu);
dankal_layout_chat_primary_menu布局内容如下
<?xml version="1.0" encoding="utf-8"?>
<com.hyphenate.easeui.widget.DankalChatPrimaryMenu
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/primary_menu"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
DankalChatPrimaryMenu参考EaseChatPrimaryMenu
- 点击ChatPrimaryMenu Item底部切换成列表
新增自定义ListView,你用其他的也行,参考EaseChatExtendMenu
QuickSendMenu
public class QuickSendMenu extends ListView {
protected Context context;
private List<String> itemModels = new ArrayList<String>();
private QuickSendMenuItemClickListener clickListener;
public QuickSendMenu(Context context, AttributeSet attrs, int defStyle) {
this(context, attrs);
}
public QuickSendMenu(Context context, AttributeSet attrs) {
super(context, attrs);
init(context, attrs);
}
public QuickSendMenu(Context context) {
super(context);
init(context, null);
}
private void init(Context context, AttributeSet attrs){
this.context = context;
}
/**
* init
*/
public void init(){
setAdapter(new ItemAdapter(context, itemModels));
}
/**
* register menu item
*
* @param listener
* on click event of item
*/
public void registerMenuItem(List<String > strings,
QuickSendMenuItemClickListener listener) {
this.clickListener = listener;
itemModels.addAll(strings);
}
private class ItemAdapter extends ArrayAdapter<String>{
private Context context;
public ItemAdapter(Context context, List<String> objects) {
super(context, 1, objects);
this.context = context;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ChatMenuItem menuItem = null;
if(convertView == null){
convertView = new ChatMenuItem(context);
}
menuItem = (ChatMenuItem) convertView;
menuItem.setText(getItem(position));
menuItem.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(clickListener != null){
clickListener.onClick(itemModels.get(position), v);
}
}
});
return convertView;
}
}
public interface QuickSendMenuItemClickListener{
void onClick(String text, View view);
}
class ChatMenuItem extends LinearLayout {
private TextView textView;
public ChatMenuItem(Context context, AttributeSet attrs, int defStyle) {
this(context, attrs);
}
public ChatMenuItem(Context context, AttributeSet attrs) {
super(context, attrs);
init(context, attrs);
}
public ChatMenuItem(Context context) {
super(context);
init(context, null);
}
private void init(Context context, AttributeSet attrs) {
LayoutInflater.from(context).inflate(R.layout.quicksend_item, this);
textView = findViewById(R.id.text);
}
public void setText(String text) {
textView.setText(text);
}
}
}
- 定义Item
Item的生成是由EaseChatRowPresenter代理去生产View的
在EaseMessageAdapter中的getItemViewType和createChatRowPresenter做相应的修改
比如我的
switch (message.getType()) {
case TXT:
if(message.getBooleanAttribute(EaseConstant.MESSAGE_ATTR_IS_BIG_EXPRESSION, false)){
presenter = new EaseChatBigExpressionPresenter();
}else if (message.getBooleanAttribute(EaseConstant.MESSAGE_TYPE_RECOMMEND,false)){
presenter = new EaseChatRecommendPresenter();
}else{
presenter = new EaseChatTextPresenter();
}
break;
EaseChatRecommendPresenter继承EaseChatRowPresenter参考其他代理类
比如我的
public class EaseChatRecommendPresenter extends EaseChatRowPresenter {
@Override
protected EaseChatRow onCreateChatRow(Context cxt, EMMessage message, int position, BaseAdapter adapter) {
return new EaseChatRowRecommend(cxt, message, position, adapter);
}
···
}
EaseChatRowRecommend如下
public class EaseChatRowRecommend extends EaseChatRow {
public EaseChatRowRecommend(Context context, EMMessage message, int position, BaseAdapter adapter) {
super(context, message, position, adapter);
}
@Override
protected void onInflateView() {
inflater.inflate(message.direct() == EMMessage.Direct.RECEIVE ?
R.layout.ease_row_received_recommend : R.layout.ease_row_sent_recommend, this);
}
···
}
- 自定义聊天页面会话头部和尾部
继承修改或者直接修改EaseChatFragment
initView方法如:
footerView =getLayoutInflater().inflate(R.layout.dankal_footer, null);
footerView.findViewById(R.id.tv_recommend).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
listView.removeFooterView(footerView);
HeaderViewListAdapter adapter = (HeaderViewListAdapter) listView.getAdapter();
//指定最后一条
((EaseMessageAdapter) adapter.getWrappedAdapter()).setRecommendVisiblePosition(listView.getAdapter().getCount());
listener.sendRecommendMessage();
}
});
listView.addFooterView(footerView);
//回调去加载接口数据
listener.addFooterViewFinish(footerView);