2.4 可视对讲设备端SDK接口说明-[Android]
1 概述
1.1 编写目的
本文是可视对讲设备云对讲和呼手机功能SDK接口说明。
2. 介绍
通过集成对接SDK可以使门禁设备快速实现包括门禁机呼叫APP、APP调看门禁机、门禁机呼叫⼿机号等对讲功能。本⽂旨在描述该SDK的集成⽅式及主要业务代码。
3. SDK集成方法
3.1 导入所需文件
新建或打开已有工程,拷贝leephone.aar包到app/libs目录下.在app/build.gradle中添加aar包的引用,如图所示(注:leephone.aar仅对阿里云自有集成项目的合作伙伴开放)。
...
android {
...
defaultConfig {
...
ndk.abiFilters "armeabi-v7a", "arm64-v8a"
}
}
...
repositories {
flatDir {
dirs 'libs' // aar dir
}
}
...
dependencies {
implementation(name:'leephone', ext:'aar')
...
}
3.2 在AndroidManifest.xml配置
⽀持的最低SDK版本为5.0:
<uses-sdk android:minSdkVersion="21" />
添加必要权限:
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
3.3 代码混淆配置
如果有做代码混淆,请确保以下类不加入混淆
-keep class com.evideo.voip.** { *; }
-keep class com.lee.phone.** { *; }
4. 接口列表
名称 | 类名 | 方法名 |
初始化 | EVVoipManager | init(Context context, EVVoipManager.OnInitCallback callback) |
反初始化 | EVVoipManager | deInit(Context context) |
登入边缘⽹关 | EdgeBoxManager | loginEdgeBox(Context context, String edgeBoxIP, String displayName, String localIp, String localMac, EdgeBoxManager.OnLoginCallback callback) |
登出边缘⽹关 | EdgeBoxManager | logoutEdgeBox(); |
账号状态监听 | EVVoipAccount | setAccountStateCallback(EVVoipAccount.AccountStateCallbackaccountStateCallback) |
来电监听 | EVVoipManager | setIncomingCallback(EVVoipManager.IncomingCallbackincomingCallback) |
呼叫APP | EdgeBoxManager | callRoomID(String roomID, EVVoipCallParams params, EdgeBoxManager.OnCallRoomCallback callback) |
接听 | EVVoipCall | accept(EVVideoView display) |
挂断 | EVVoipCall | hangup() |
通话状态监听 | EVVoipCall | setCallStateCallback(EVVoipCall.CallStateCallbackcallStateCallback) |
事件监听 | EVVoipManager | setOnEventReceivedListener(EVVoipManager.OnEventReceived) |
呼叫⼿机号 | EVVoipManager | callPhoneNumber(String phoneNumber) |
5. 主要业务流程
5.1 初始化
在进⾏对讲业务之前,需要先初始化该SDK,才能保证后续业务正常,后续的所有API调⽤都必须在SDK初始化成功的情况下执⾏。在应⽤的⽣命周期内,⼀般进⾏⼀次初始化就可以了。
// 初始化对讲SDK
EVVoipManager.init(getApplicationContext(), new EVVoipManager.OnInitCallback() {
@Override
public void complete() {
// 对讲SDK初始化成功
}
@Override
public void error(int code) {
// 对讲SDK初始化失败,错误代码code
}
});
当不再使⽤对讲业务时,可以调⽤deInit进⾏SDK反初始化。
// 反初始化对讲SDK
EVVoipManager.deInit(getApplicationContext());
监视开门事件
EVVoipManager.setOnEventReceivedListener(new EVVoipManager.OnEventReceived() {
@Override
public void callback(int eventCode, String fromSipNumber) {
switch(eventCode) {
case EVENT_CODE_UNLOCK_BY_APP://APP开门指令
//执⾏开门动作
break;
case EVENT_CODE_UNLOCK_BY_PHONE://⼿机开门指令
//执⾏开门动作
break;
default:
break;
}
}
});
5.2 登入边缘服务器
在对讲SDK初始化成功之后,需要进⾏边缘⽹关的登入,edgeBoxIP为边缘服务器IP,localIp为本地IP,localMac为本地Mac地址,需要应⽤层下发,登入成功后可以得到EVVoipAccount对象。
private EVVoipAccount mEVVoipAccount;
EdgeBoxManager.loginEdgeBox(this, edgeBoxIP, localIp, localMac, new EdgeBoxManager.
OnLoginCallback() {
@Override
public void onSuccess(EVVoipAccount evVoipAccount) {
mEVVoipAccount = evVoipAccount;
// ...
}
@Override
public void onFailure(int code, String message) {
}
});
为了能够实时显示账号状态,本SDK提供 AccountStateCallback 接⼝实时监听当前账号状态。
mEVVoipAccount.setAccountStateCallback(new EVVoipAccount.AccountStateCallback() {
@Override
public void onState(EVVoipAccount.AccountState state) {
/* 获取该账号的状态
* AccountState.ONLINE 在线
* AccountState.OFFLINE 离线
* AccountState.LOGINPROCESS 登入中
* AccountState.NONE ⽆账号、未登入
*/
}
});
当不再使⽤对讲业务,可以通过以下接⼝进⾏登出操作。
mEVVoipAccount.logoutEdgeBox();
5.3 门禁机呼叫APP
设备端呼叫APP,可调⽤ callRoomID 接⼝,并传入roomID进⾏呼叫,roomID为呼叫号。
// 初始化呼叫配置参数集
EVVoipCallParams params = new EVVoipCallParams();
params.setDisplay(mEVVideoView);
try {
// 开始呼叫
evCall = EVVoipManager.callRoomID(roomID, params);
} catch (EVVoipException e) {
e.printStackTrace();
}
呼叫接⼝会返回的EVVoipCall对象,可设置回调监听通话状态。
evCall.setCallStateCallback(new EVVoipCall.CallStateCallback() {
@Override
public void onState(CallState state, EndReason reason) {
if (CallState.INCOMING == state) {
} else if (CallState.OUTGOING == state) {
} else if (CallState.CONNECTED == state) {
} else if (CallState.END == state) {
if (reason != null && EndReason.NONE != reason) {
/*
* NONE - ⽆错误,正常状态
* BUSY - 对⽅忙
* TIMEOUT - 呼叫超时
* NOTFOUND - 对⽅不在线
* REJECTED - ⼀⽅拒接
* UNKNOW - 未知错误
*/
}
}
}
});
设备端可以主动挂断通话。
evCall.hangup();
5.4 支持APP调看门禁机
为了使设备端能够响应APP的调看请求,需要注册⼀个来电回调监听接⼝。
EVVoipManager.setIncomingCallback(new EVVoipManager.IncomingCallback() {
@Override
public void inComing(EVVoipCall evCall) {
// evCall表示当前来电的通话
}
});
当收到APP调看请求回调时,会得到⼀个EVVoipCall,表示当前的通话。
@Override
public void inComing(EVVoipCall evCall) {
// 保存当前通话
// 直接接听或跳转到通话界⾯
}
为了响应APP的监控请求,需要提供⼀个EVVideoView作为视频容器,如果不提供则为⾳频通话。
// 初始化视频绘制容器,EVVideoView是⼀个android.app.Fragment,⽬前只⽀持在xml布局⽂件中配置
mEVVideoView= (EVVideoView) getFragmentManager().findFragmentById(R.id.display_view);
try {
// 响应监控请求
evCall.accept(mEVVideoView);
} catch (EVVoipException e) {
e.printStackTrace();
}
为了能够实时获取当前的通话状态,可以在EVVoipCall对象上设置⼀个通话状态回调接⼝。
evCall.setCallStateCallback(new EVVoipCall.CallStateCallback() {
@Override
public void onState(CallState state, EndReason reason) {
// 参考⻔禁机呼叫APP示例
}
});
设备端可以主动挂断通话。
evCall.hangup();
5.5 ⾳视频扩展
SDK默认是⾃⼰管理⾳视频的,如果开发者有⾃⼰的⾳视频数据流,需要调⽤以下接⼝接⼊。
视频流接⼊
// 使能外部视频数据流接⼊
EVVoipManager.enableCameraWrapper(width, height);
// 注⼊外部视频数据流
EVVoipManager.putImage(data);
⾳频流接⼊
// 使能外部⾳频数据流接⼊
EvideoVoipRecorder.setEvideoVoipRecorderListener(
samplerate, samples, new RecorderListener() {
@Override
public void startRecording() {
// 启动外部⾳频流
}
@Override
public void stopRecording() {
// 停⽌外部⾳频流
}
});
// 注⼊外部⾳频数据流
if (EvideoVoipRecorder.isRecording())
EvideoVoipRecorder.putStream(buff, size, framCount);
5.6 门禁机呼叫⼿机号
Step1: 获取IPPBX的账号信息并调⽤ loginIppbx 登⼊IPPBX,接⼝返回EVVoipAccount对象。
private EVVoipAccount mEVVoipAccount;
try {
mEVVoipAccount = EVVoipManager.loginIppbx(String sipnum, String password,
String displayName, String domain, int port);
} catch (EVVoipException e) {
e.printStackTrace();
}
// 当不再需要该账号时进⾏登出
mEVVoipAccount.logoutIppbx();
Step2:监听账号登⼊状态。
mEVVoipAccount.setAccountStateCallback(new EVVoipAccount.AccountStateCallback() {
@Override
public void onState(EVVoipAccount.AccountState state) {
// 参考边缘⽹关账号登⼊
}
});
Step3:账号登⼊成功后,呼叫⼿机号,⼿机号需通过应⽤层下发。
try {
evCall = EVVoipManager.callPhoneNumber(String phoneNumber)
} catch (EVVoipException e) {
e.printStackTrace();
}
Step4:监听通话状态。
evCall.setCallStateCallback(new EVVoipCall.CallStateCallback() {
@Override
public void onState(CallState state, EndReason reason) {
// 参考边缘⽹关通话状态监听
}
});
Step5:挂掉电话,设备端可以主动挂断通话。
evCall.hangup();
5.7 门禁机上报开门事件
APP发送开门指令给门禁机,门禁机开门后,上报开门事件。
mIppbxEVVoipCall = EVVoipManager.callPhoneNumber(phoneNumber);
EVVoipManager.setOnEventReceivedListener(new EVVoipManager.OnEventReceived() {
@Override
public void callback(int eventCode, String number) {
switch (eventCode) {
case EVVoipManager.EVENT_CODE_UNLOCK_BY_APP: //云对讲APP开门
EdgeBoxManager.reportOpenDoor(EdgeBoxManager.EVENT_CODE_CLOUD_UNLOCK, number);
break;
case EVVoipManager.EVENT_CODE_UNLOCK_BY_PHONE: //语音固话开门
EdgeBoxManager.reportOpenDoor(EdgeBoxManager.EVENT_CODE_FIXED_UNLOCK, number);
break;
}
}
});