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;
        }
    }
});