初始化及登录
在程序入口初始化SDK并设置回调接口 — 初始化要在程序完全启动(即Android Application 创建完成)之后才能调用。初始化及登录建议在一个函数体中顺序调用。
代码可参考Demo中的SDKCoreHelper.java(所在的demo目录:\app\src\main\java\com\yuntongxun\ecdemo\ui)
初始化及登陆过程分由以下四步组成:
特别提醒:
设置登录参数、通知回调监听和验证参数是否正确,登陆SDK,需要在SDK初始化成功的方法(onInitialized回调)后执行。
初始化SDK 是调用其他功能(IM,实时音视频,音视频会议等)的前提,如果初始化不成功,后续的接口都无法调用。
初始化示例代码如下:
if(!ECDevice.isInitialized()) {
*/
ECDevice.initial(getApplicationContext(), new ECDevice.InitListener() {
@Override
public void onInitialized() {
Log.i("","初始化SDK成功");
}
@Override
public void onError(Exception exception) {
Log.i("","初始化SDK失败"+exception.getMessage());
}
});}
Log.i(TAG, "初始化SDK及登陆代码完成");
注意事项:
- 初始化不要在application的onCreate方法中进行调用,因为如果android的application没有创建完成时执行初始化方法,将会导致初始化无效,在后续的登录和其他接口的调用中出现问题。
- 如果调用初始化触发初始化失败onError回调。可能是由下列原因造成:
a、可能SDK已经处于初始化状态(未做ECDevice.isInitialized判断时出现);
b、SDK所声明必要的权限未在清单文件(AndroidManifest.xml)里配置、或者未配置服务属性android:exported="false";
c、当前手机设备系统版本低于SDK所支持的最低版本(当前SDK支持Android Build.VERSION_CODES.FROYO 以及以上版本)。
常见问题:
初始化成功之后我们就可以进行登录。登录有两种模式,我们选择其中一种登录方式即可:
(1)任意帐号体系(即自定义登录方式)
(2)VoIP帐号体系(即VoIP验密登录方式)
注:推荐使用(1)自定义登录方式。因为此方式下云通讯平台不验证用户的登录密码,只进行应用级的验证。提高客户帐号创建的自由度和使用的便捷性。
示例代码如下:
ECInitParams params = ECInitParams.createParams();
params.setUserid("推荐使用客户项目APP的登录帐号,测试阶段Userid可以填写手机号");
params.setAppKey("应用ID;登陆官网查看控制台→应用列表→应用管理→APP ID");
params.setToken("应用Token;登陆官网查看控制台→应用列表→应用管理→APP TOKEN ");
params.setAuthType(ECInitParams.LoginAuthType.NORMAL_AUTH);
params.setMode(ECInitParams.LoginMode.FORCE_LOGIN);
- 2.2 固定VoIP帐号体系(即VoIP验密登录方式)
ECInitParams params = ECInitParams.createParams();
params.setUserid("VoIP帐号;通过创建子帐户接口获得");
params.setPwd("VoIP密码;通过创建子帐户接口获得");
params.setAppKey("应用ID;登陆官网查看控制台→应用列表→应用管理→APP ID ");
params.setAuthType(ECInitParams.LoginAuthType.PASSWORD_AUTH);
params.setMode(ECInitParams.LoginMode.FORCE_LOGIN);
注意事项:
- 相同终端(例如安卓手机和安卓手机)之间不可以登录同一账号,移动设备(例如安卓手机和苹果手机)之间不可以登录同一账号。移动设备、平板、电脑设备、Web、PC之间可以登录相同账号。
- 自定义方式(NORMAL_AUTH)登录时候时Userid不可填VoIP帐号,否则会导致VoIP密码失效。
a、FORCE_LOGIN :强制登录,可以强制上线,踢掉已经在线的同终端设备。
b、AUTO:自动重连
建议在首次登陆时使用FORCE_LOGIN强制上线登录模式,之后再次启动APP时使用AUTO自动重连模式。
a、登录方式为FORCE_LOGIN类型并且登陆成功
b、客户端使用AUTO登录方式并登陆成功
c、手机网络状态改变
自定义登录方式和VoIP验密登录方式在开发者正式项目中只可选用一种。
登录参数设置完成后,开发者可根据业务需要设置回调监听。如下表所示:
监听 | 说明 | 约束 | |
OnECDeviceConnectListener | 登录回调监听 | 必须设置 | |
OnChatReceiveListener | IM接收消息监听 | 使用IM功能时设置 | |
OnVoIPListener | VoIP通话状态监听 | 使用VoIP功能时设置 | |
OnMeetingListener | 音视频会议回调监听 | 使用音视频会议时设置 | |
| | | |
说明:
- 登录回调监听将SDK登录状态反馈给APP层,是所有通讯功能的基础,因此必须设置。
- 其他关于IM、VoIP通话、音视频功能的回调监听可根据业务使用情况进行增减,相互之间没有影响。
示例代码如下:
ECDevice.setOnDeviceConnectListener(new ECDevice.OnECDeviceConnectListener() {
public void onConnect() {
}
@Override
public void onDisconnect(ECError error) {
}
@Override
public void onConnectState(ECDevice.ECConnectState state, ECError error) {
if(state == ECDevice.ECConnectState.CONNECT_FAILED ){
if(error.errorCode == SdkErrorCode.SDK_KICKED_OFF) {
Log.i("","==帐号异地登陆");
}
else
{
Log.i("","==其他登录失败,错误码:"+ error.errorCode);
}
return ;
}
else if(state == ECDevice.ECConnectState.CONNECT_SUCCESS) {
Log.i("","==登陆成功");
}
}
});
回调 ECDevice.OnECDeviceConnectListener 查看API
ECDevice.setOnChatReceiveListener(new OnChatReceiveListener() {
@Override
public void OnReceivedMessage(ECMessage msg) {
Log.i("","==收到新消息");
}
@Override
public void OnReceiveGroupNoticeMessage(ECGroupNoticeMessage notice) {
Log.i("","==收到群组通知消息(有人加入、退出...)");
}
@Override
public void onOfflineMessageCount(int count) {
}
@Override
public void onReceiveOfflineMessage(List msgs) {
}
@Override
public void onReceiveOfflineMessageCompletion() {
}
@Override
public void onServicePersonVersion(int version) {
}
});
回调 OnChatReceiveListener 查看API
ECVoIPCallManager callInterface = ECDevice.getECVoIPCallManager();
if(callInterface != null) {
callInterface.setOnVoIPCallListener(new ECVoIPCallManager.OnVoIPListener() {
@Override
public void onCallEvents(ECVoIPCallManager.VoIPCall voipCall) {
if(voipCall == null) {
Log.e("SDKCoreHelper", "handle call event error , voipCall null");
return ;
}
ECVoIPCallManager.ECCallState callState = voipCall.callState;
switch (callState) {
case ECCALL_PROCEEDING:
Log.i("","正在连接服务器处理呼叫请求,callid:"+voipCall.callId);
break;
case ECCALL_ALERTING:
Log.i("","呼叫到达对方,正在振铃,callid:"+voipCall.callId);
break;
case ECCALL_ANSWERED:
Log.i("","对方接听本次呼叫,callid:"+voipCall.callId);
break;
case ECCALL_FAILED:
Log.i("","called:"+voipCall.callId+",reason:"+ voipCall.reason);
break;
case ECCALL_RELEASED:
break;
default:
Log.e("SDKCoreHelper", "handle call event error , callState " + callState);
break;
}
}
});
}
if(ECDevice.getECMeetingManager() != null) {
ECDevice.getECMeetingManager().setOnMeetingListener(new OnMeetingListener() {
@Override
Public void onReceiveInterPhoneMeetingMsg(ECInterPhoneMeetingMsg msg) {
}
@Override
public void onReceiveVoiceMeetingMsg(ECVoiceMeetingMsg msg) {
}
@Override
public void onReceiveVideoMeetingMsg(ECVideoMeetingMsg msg) {
}
});
}
回调OnMeetingListener 查看API
Intent intent = new Intent(getInstance().mContext, VoIPCallActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent pendingIntent = PendingIntent.getActivity( getInstance().mContext, 0, intent,
PendingIntent.FLAG_UPDATE_CURRENT);
ECDevice.setPendingIntent(pendingIntent);
注意事项:
回调监听要放在初始化成功的onInitialized回调方法里面,这样保证登录成功之后就可以接收到他人的来电、消息、会议等。
设置完成登录参数和通知回调监听,接下来调用验证参数并登录SDK。如果返回是true,则说明参数正确。
if(params.validate()) {
ECDevice.login(params);
}
/* initial: ECSDK 初始化接口