Android即时通讯 —— 在线客服功能

本篇借助于“阿里云旺”进行试验。目前,其即时通讯模块均为免费。

步骤

1、引入OpenIMSDK【配置build.gradle文件】

第一种方法:配置maven仓库地址

①配置仓库

//【0】云旺准备 ----集成
repositories {
    maven { url 'http://repo.baichuan-android.taobao.com/content/groups/BaichuanRepositories/' }
}

②添加依赖

//必选
    compile 'com.alibaba.mobileim:IMCore:2.0.2.1@aar'
    //可选,如果使用SDK的UI必须添加该依赖,如果不使用SDK的UI,完全自己开发UI则无需添加该依赖
    compile 'com.alibaba.mobileim:IMKit:2.0.2.1@aar'
    //可选,如果使用小视频功能必须添加该依赖,如果不使用小视频功能则无需添加该依赖
//    compile 'com.alibaba.mobileim:RecorderSDK:1.0.0@aar'

ps:因为需要对默认UI进行修改,所以这里添加了IMKit,如果不需要注释掉即可


第二种方法:aar集成

①将aar文件放置到libs文件夹下,并增加仓库路径:

repositories {
    flatDir {
        dirs 'libs'
   }
}

②添加依赖

dependencies {
   compile fileTree(dir: 'libs', include: ['*.jar'])
   compile(name: 'IMCore-2.0.2', ext: 'aar')
   compile(name: 'IMKit-2.0.2', ext: 'aar')
}


2、分包+扩大内存

     该环节在云旺官方文档上并不是必须的。但是如果项目中方法数超过65536(包括第三方jar包)或者模拟器分配的内存不足时,可能会出现问题。

(1)OOM ——扩大内存

dexOptions {
    incremental true
    javaMaxHeapSize "2g"
}
这里也可以设置为4g,但是一般2g就够了。

(2)方法数超过65536  ——  分包

①配置build.gradle

在android{} 的 defaultConfig{} 中添加以下代码:

multiDexEnabled true

multidexkeep.pro文件:

②添加依赖

compile 'com.android.support:multidex:1.0.0'

③启用 Dalvik 可执行文件分包

在自己创建的Application(注意,在清单文件中配置一下)中,重写attachBaseContext()方法:

@Override
protected void attachBaseContext(Context base) {
    super.attachBaseContext(base);
    //【3】分包第三步
    MultiDex.install(this);

}

ps:该方法在onCreate()之前执行。


3、具体使用

(1)初始化

Application onCreate()中添加:

//【1】云旺--初始化

// final String APP_KEY = "23015524";//官方测试
 final String APP_KEY = MyStatic.YWAPPKEY;
//必须首先执行这部分代码, 如果在":TCMSSevice"进程中,无需进行云旺(OpenIM)和app业务的初始化,以节省内存;
SysUtil.setApplication(this);
if(SysUtil.isTCMSServiceProcess(this)){
    return;
}
//第一个参数是Application Context
//这里的APP_KEY即应用创建时申请的APP_KEY,同时初始化必须是在主进程中
if(SysUtil.isMainProcess()){
    YWAPI.init(this, APP_KEY);
}

(2)登录(跳转到聊天界面)

  /**
     * 云旺账号登录
     * 用到以下参数:
     *    userId 用户id
     *    pwd    密码
          appKey APPKEY
     */
    public static void YWLogin(final Context context, final boolean isNeedJumpToServer){
        //******************云旺登录start**************************


        Log.d("云旺","登录账号 == "+(SpUtils.getYWUserID(context)+"   登录密码 == "+SpUtils.getYWPwd(context)));

        //【1】获取IMKit对象
        mIMKit = YWAPI.getIMKitInstance(SpUtils.getYWUserID(context), MyStatic.YWAPPKEY); //UERID、 APPKEY
        //【2】创建登录对象
        YWLoginParam loginParam = YWLoginParam.createLoginParam(SpUtils.getYWUserID(context), SpUtils.getYWPwd(context));//用户名、密码
        //【3】获取登录服务
        final IYWLoginService loginService = mIMKit.getLoginService();

        //【4】开始登录
        loginService.login(loginParam, new IWxCallback() {

            @Override
            public void onSuccess(Object... arg0) {

                Log.d("云旺登录成功","ok ");


                if(isNeedJumpToServer){
                    //TODO
                    //(1)打开会话界面发送消息
                    //(2)跳转到客服聊天界面
                    EServiceContact contact = new EServiceContact(MyStatic.YWSERVERID,MyStatic.YWSERVERGROUPID);

                    //如果需要发给指定的客服帐号,不需要Server进行分流(默认Server会分流),请调用EServiceContact对象
                    //的setNeedByPass方法,参数为false。
                    //contact.setNeedByPass(false);

                    Intent intent = YWUtils.getmIMKit(context).getChattingActivityIntent(contact);
                    context.startActivity(intent);

                }
            }

            @Override
            public void onProgress(int arg0) {
                // TODO Auto-generated method stub
            }

            @Override
            public void onError(int errCode, String description) {
                //如果登录失败,errCode为错误码,description是错误的具体描述信息

                Log.d("云旺登录失败","错误码 == "+errCode+"    "+description);
            }
        });


        //***********************云旺登录end*****************************

    }

其中,

/**  获取YWIMKit 对象
 * @return  YWIMKit 对象
 */
public static YWIMKit getmIMKit(Context context){
    YWIMKit   mIMKit = YWAPI.getIMKitInstance(SpUtils.getYWUserID(context), MyStatic.YWAPPKEY); //UERID、 APPKEY
    return mIMKit;
}

(3)退出

/**
 * 云旺账号退出
 */
public static void YWLogout(Context context) {
    String userID=SpUtils.getYWUserID(context);

    if("".equals(userID) || userID==null){
        return;
    }

    //【1】获取IMKit对象
    mIMKit = YWAPI.getIMKitInstance(userID, MyStatic.YWAPPKEY); //UERID、 APPKEY
    //【2】获取登录服务
    final IYWLoginService loginService = mIMKit.getLoginService();

    //【3】退出登录
    loginService.logout( new IWxCallback() {

        @Override
        public void onSuccess(Object... arg0) {

            Log.d("云旺退出登录成功", "ok ");


            //TODO 如果本地存储了云旺信息,需要删除

        }

        @Override
        public void onProgress(int arg0) {
            // TODO Auto-generated method stub
        }

        @Override
        public void onError(int errCode, String description) {
            //如果登录失败,errCode为错误码,description是错误的具体描述信息

            Log.d("云旺退出登录失败", "错误码 == " + errCode + "    " + description);
        }
    });

}
(4)判断登录状态

/**
 * 判断登录状态
 * @return 云旺登录状态
 *              disconnect账号在其他地方登录    fail登陆失败   idle  idle状态   logining登陆中  success登陆成功
 */
public static int YWLoginJudge(Context context){
    YWIMKit   mIMKit = YWAPI.getIMKitInstance(SpUtils.getYWUserID(context), MyStatic.YWAPPKEY); //UERID、 APPKEY
    int value = mIMKit.getIMCore().getLoginState().getValue();

    return value;
}


其他:

/**
 * 去除打开聊天界面出现的电池优化的dialog
 */
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
if(-1== sharedPreferences.getInt("IgnoreBatteryOpt", -1)){
     SharedPreferences.Editor editor = sharedPreferences.edit();
     editor.putInt("IgnoreBatteryOpt", 1);
     editor.commit();
 }


参考:

Android集成阿里云旺即时通讯踩坑历程     -----内含方法数65536的原因

Android 集成阿里百川实现在线客服、聊天功能

Multidex Android DEX手动拆包

MultiDex精补篇,进一步知道MultiDex的配置

android studio 远程导入jar包 maven

android中aar集成方式


android中aar集成方式

你可能感兴趣的:(Android进阶)