环信即时通讯单聊集成,添加好友,实现单聊

前段时间由于项目需要,了解一下环信即时通讯,然后自己通过查资料写了一个基于环信的单聊demo,一下是源码,希望可以帮助到需要的小伙伴。
首先,我们要去环信官网注册账号,这个我就不多说了,注册完登录,创建应用,新建两个测试IM用户,

这里写图片描述
这里主要用到的是应用标示(Appkey)
这里写图片描述
这里写图片描述
好了,在环信官网下载对应的sdk,这个不多说了,最好下载一个文档,里面讲的很详细的。
好了,一下是源码
这里写图片描述
AppManager.java

public class AppManager {
   
   
    private static Stack<Activity> mActivityStack;
    private static AppManager mAppManager;

    private AppManager() {
    }

    /**
     * 单一实例
     */
    public static AppManager getInstance() {
        if (mAppManager == null) {
            mAppManager = new AppManager();
        }
        return mAppManager;
    }

    /**
     * 添加Activity
     */
    public void addActivity(Activity activity) {
        if (mActivityStack == null) {
            mActivityStack = new Stack<Activity>();
        }
        mActivityStack.add(activity);
    }

    /**
     * 获取栈顶Activity
     */
    public Activity getTopActivity() {
        Activity activity = mActivityStack.lastElement();
        return activity;
    }

    /**
     * 结束栈顶Activity
     */
    public void killTopActivity() {
        Activity activity = mActivityStack.lastElement();
        killActivity(activity);
    }

    /**
     * 结束指定的Activity
     */
    public void killActivity(Activity activity) {
        if (activity != null) {
            mActivityStack.remove(activity);
            activity.finish();
            activity = null;
        }
    }

    /**
     * 结束指定类名的Activity
     */
    public void killActivity(Class<?> cls) {
        for (Activity activity : mActivityStack) {
            if (activity.getClass().equals(cls)) {
                killActivity(activity);
            }
        }
    }

    /**
     * 结束所有Activity
     */
    public void killAllActivity() {
        for (int i = 0, size = mActivityStack.size(); i < size; i++) {
            if (null != mActivityStack.get(i)) {
                mActivityStack.get(i).finish();
            }
        }
        mActivityStack.clear();
    }

    /**
     * 退出应用程序
     */
    public void AppExit(Context context) {
        try {
            killAllActivity();
            ActivityManager activityMgr = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
            activityMgr.restartPackage(context.getPackageName());
            System.exit(0);
        } catch (Exception e) {}
    }
}

BaseActivity.java

public abstract class BaseActivity extends Activity {
   
   

    protected Context context = null;
    protected BaseApplication mApplication;
    protected Handler mHandler;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mApplication = (BaseApplication) getApplication();
        AppManager.getInstance().addActivity(this);
//      check netwotk
        context = this;
    }

    @Override
    public void onBackPressed() {
        // TODO Auto-generated method stub
        super.onBackPressed();
    }

    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
    }

    @Override
    protected void onPause() {
        // TODO Auto-generated method stub
        super.onPause();
    }

    @Override
    protected void onResume() {
        // TODO Auto-generated method stub
        super.onResume();
    }

}

BaseApplication.java

public class BaseApplication extends Application {
   
   

    private static final String TAG = BaseApplication.class.getSimpleName();

    private static BaseApplication mInstance = null;

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
    }

    /*
     * (non-Javadoc)
     * 
     * @see android.app.Application#onCreate()
     */
    @Override
    public void onCreate() {
        // TODO Auto-generated method stub
        super.onCreate();
        int pid = android.os.Process.myPid();
        String processAppName = getAppName(pid);
        // 如果app启用了远程的service,此application:onCreate会被调用2次
        // 为了防止环信SDK被初始化2次,加此判断会保证SDK被初始化1次
        // 默认的app会在以包名为默认的process name下运行,如果查到的process name不是app的process
        // name就立即返回

        if (processAppName == null
                || !processAppName.equalsIgnoreCase("com.xmliu.imsample")) {
            Log.e(TAG, "enter the service process!");
            // "com.easemob.chatuidemo"为demo的包名,换到自己项目中要改成自己包名

            // 则此application::onCreate 是被service 调用的,直接返回
            return;
        }

//      EMChat.getInstance().setAutoLogin(false);
        EMChat.getInstance().init(getApplicationContext());
        // 在做代码混淆的时候需要设置成false
        EMChat.getInstance().setDebugMode(true);
        initHXOptions();
        mInstance = this;

    }

    protected void initHXOptions() {
        Log.d(TAG, "init HuanXin Options");

        // 获取到EMChatOptions对象
        EMChatOptions options = EMChatManager.getInstance().getChatOptions();
        // 默认添加好友时,是不需要验证的true,改成需要验证false
        options.setAcceptInvitationAlways(false);
        // 默认环信是不维护好友关系列表的,如果app依赖环信的好友关系,把这个属性设置为true
        options.setUseRoster(true);
        options.setNumberOfMessagesLoaded(1);
    }

    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));
                    // Log.d("Process", "Id: "+ info.pid +" ProcessName: "+
                    // info.processName +"  Label: "+c.toString());
                    // processName = c.toString();
                    processName = info.processName;
                    return processName;
                }
            } catch (Exception e) {
                // Log.d("Process", "Error>> :"+ e.toString());
            }
        }
        return processName;
    }

    @Override
    public void onLowMemory() {
        // TODO Auto-generated method stub
        super.onLowMemory();
        Log.i(TAG, "onLowMemory");
    }

    @Override
    public void onTerminate() {
        // TODO Auto-generated method stub
        Log.i(TAG, "onTerminate");
        super.onTerminate();
    }

    public static BaseApplication getInstance() {
        return mInstance;
    }

}

ChatListAdapter.java

public class ChatListAdapter extends BaseAdapter {

    Context mContext;
    List<ChatListData> mListData;

    public ChatListAdapter(Context mContext, List<ChatListData> mListData) {
        super();
        this.mContext = mContext;
        this.mListData = mListData;
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return mListData.size();
    }

    @Override
    public Object getItem(int arg0) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public long getItemId(int arg0) {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public View getView(int index, View cView, ViewGroup arg2) {
        // TODO Auto-generated method stub

        Holder holder;
        if (cView == null) {
            holder = new Holder();
            cView = LayoutInflater.from(mContext).inflate(
                    R.layout.chat_listview_item, null);
            holder.rAvatar = (Button) cView
                    .findViewById(R.id.listview_item_receive_avatar);
            holder.rContent = (TextView) cView
                    .findViewById(R.id.listview_item_receive_content);
            holder.chatTime = (TextView) cView
                    .findViewById(R.id.listview_item_time);
            holder.sContent = (TextView) cView
                    .findViewById(R.id.listview_item_send_content);
            holder.sAvatar = (Button) cView
                    .findViewById(R.id.listview_item_send_avatar);
            holder.sName = (TextView) cView.findViewById(R.id.name1);
            holder.sName1 = (TextView) cView.findViewById(R.id.name2);
            cView.setTag(holder);

        } else {
            holder = (Holder) cView.getTag();
        }

        holder.chatTime.setVisibility(View.GONE);

        if (mListData.get(index).getType() == 2) {
            holder.rAvatar.setVisibility(View.VISIBLE);
            holder.rContent.setVisibility(View.VISIBLE);
            holder.sName.setVisibility(View.VISIBLE);
            holder.sName.setText("您的朋友说:");
            holder.sContent.setVisibility(View.GONE);
            holder.sAvatar.setVisibility(View.GONE);
            holder.sName1.setVisibility(View.GONE);

        } else if (mListData.get(index).getType() == 1) {
            holder.rAvatar.setVisibility(View.GONE);
            holder.sName.setVisibility(View.GONE);
            holder.rContent.setVisibility(View.GONE);
            holder.sContent.setVisibility(View.VISIBLE);
            holder.sAvatar.setVisibility(View.VISIBLE);
            holder.sName1.setVisibility(View.VISIBLE);
            holder.sName1.setText("我");
        }
        holder.chatTime.setText(mListData.get(index).getChatTime());
        holder.rContent.setText(mListData.get(index).getReceiveContent());
        holder.sContent.setText(mListData.get(index).getSendContent());

        return cView;
    }

    class Holder {
        Button rAvatar;
        TextView rContent;
        TextView chatTime;
        TextView sContent;
        TextView sName;
        TextView sName1;
        Button sAvatar;
    }
}

FriendListAdapter.java

public class FriendListAdapter extends BaseAdapter {
   
   

    Context mContext;
    List<String> mListData;

    public FriendListAdapter(Context mContext, List<String> mListData) {
        super();
        this.mContext = mContext;
        this.mListData = mListData;
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return mListData.size();
    }

    @Override
    public Object getItem(int arg0) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public long getItemId(int arg0) {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public View getView(int index, View cView, ViewGroup arg2) {
        // TODO Auto-generated method stub
        FHolder holder;
        if (cView == null) {
            holder = new FHolder();
            cView = LayoutInflater.from(mContext).inflate(
                    R.layout.friend_listview_item, null);
            holder.name = (TextView) cView
                    .findViewById(R.id.friend_listview_name);
            cView.setTag(holder);

        } else {
            holder = (FHolder) cView.getTag();
        }

        holder.name.setText(mListData.get(index));

        return cView;
    }

    class FHolder {
        TextView name;
    }
}

ChatListData.java

public class ChatListData {
   
   

    String receiveAvatar;
    String receiveContent;
    String chatTime;
    String sendAvatar;
    String sendContent;
    /**
     * 1 发送; 2接收
     */
    int type;
    /**
     * 1 发送; 2接收
     */
    public int getType() {
        return type;
    }
    /**
     * 1 发送; 2接收
     */
    public void setType(int type) {
        this.type = type;
    }

    public String getReceiveAvatar() {
        return receiveAvatar;
    }

    public void setReceiveAvatar(String receiveAvatar) {
        this.receiveAvatar = receiveAvatar;
    }

    public String getReceiveContent() {
        return receiveContent;
    }

    public void setReceiveContent(String receiveContent) {
        this.receiveContent = receiveContent;
    }

    public String getChatTime() {
        return chatTime;
    }

    public void setChatTime(String chatTime) {
        this.chatTime = chatTime;
    }

    public String getSendAvatar() {
        return sendAvatar;
    }

    public void setSendAvatar(String sendAvatar) {
        this.sendAvatar = sendAvatar;
    }

    public String getSendContent() {
        return sendContent;
    }

    public void setSendContent(String sendContent) {
        this.sendContent = sendContent;
    }

}

ChatListActivity.java

public class ChatListActivity extends BaseActivity {
   
   

    private EditText contentET;
    private TextView topNameTV;
    private Button sendBtn;
    private NewMessageBroadcastReceiver msgReceiver;

    private ListView mListView;
    private List<ChatListData> mListData = new ArrayList<ChatListData>();
    private ChatListAdapter mAdapter;
    private InputMethodManager imm;

    private String receiveName = null;

    
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值