本篇借助于“阿里云旺”进行试验。目前,其即时通讯模块均为免费。
第一种方法:配置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')
}
该环节在云旺官方文档上并不是必须的。但是如果项目中方法数超过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()之前执行。
(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(); }
MultiDex精补篇,进一步知道MultiDex的配置
android中aar集成方式