识别接口
<h3><strong>概述</strong></h3>
<p>该部分接口的入口类为 <strong>VTBRSDKManager</strong>,在调用该部分接口前,需要打开sdk和license认证通过,否则有可能会导致部分功能无法正常work。</p>
<h3>1. 开启识别</h3>
<p><strong>接口名称:</strong></p>
<pre><code class="language-java">public void startRecognize()</code></pre>
<p><strong>备注:</strong>开启识别前,该接口会停止当前下载任务</p>
<h3>2. 重新识别</h3>
<p>该接口用于某些情况下需要重新识别一次,例如网络断开后重连</p>
<p><strong>接口名称:</strong></p>
<pre><code class="language-java">public void reRecognize()</code></pre>
<h3>3. 停止识别</h3>
<p><strong>接口名称:</strong></p>
<pre><code class="language-java">public void stopRecognize()</code></pre>
<p><strong>备注:</strong>该接口会停止当前下载任务</p>
<h3>4. 监听识别状态</h3>
<p><strong>接口名称:</strong></p>
<pre><code class="language-java">public void setRecognizeListener(IRecognizeListener listener)</code></pre>
<h3>5. IRecognizeListener识别回调</h3>
<p>该回调类用于监听识别回调,接口类如下:</p>
<pre><code class="language-java">public interface IRecognizeListener {
- boolean onRecognizeSuccess(VTBRBookDataModel data);//v3.1.1之前使用的是该方法
- boolean onRecognizeSuccess(VTBRBookDataModel data, byte[] bytes);//v3.1.1及之后使用的是该方法,bytes为识别的图像(格式为nv21)
void onRecognizeFail(int code , int baseBookId, String msg);
void onGetBookInfoFail(int code, String msg);
boolean onGetBookInfoSuccess(int bookId, boolean needUpdate);
boolean onGetCardInfoSuccess(CardInfoEntity cardInfoEntity, boolean needUpdate);
boolean onGetPageAudio(PageAudio pageAudio);
}</code></pre>
<h4>5.1 onRecognizeSuccess</h4>
<p>该回调为识别成功的回调</p>
<p><strong>参数:</strong></p>
<table>
<thead>
<tr>
<th>参数名</th>
<th>类型</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>data</td>
<td>VTBRBookDataModel</td>
<td>书本数据对象</td>
</tr>
</tbody>
</table>
<p><strong>返回值:</strong></p>
<p>是否消费该识别结果。true: 消费该识别结果, 则不走之后的获取书本信息、开始下载、播放书页音频等操作;false: 不消费该识别结果, 继续执行玩瞳的操作</p>
<pre><code class="language-java">public boolean onRecognizeSuccess(VTBRBookDataModel data) {
//是否消费该识别结果。true: 消费该识别结果, 则不走之后的获取书本信息、开始下载、播放书页音频等操作;false: 不消费该识别结果, 继续执行玩瞳的操作
return true;
}</code></pre>
<h5>5.1.1 VTBRBookDataModel类</h5>
<table>
<thead>
<tr>
<th>属性</th>
<th>类型</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>groupId</td>
<td>int</td>
<td>卡片套系ID或basebookId</td>
</tr>
<tr>
<td>bookId</td>
<td>int</td>
<td>书本id</td>
</tr>
<tr>
<td>pageId</td>
<td>int</td>
<td>书页id</td>
</tr>
<tr>
<td>pageType</td>
<td>int</td>
<td>书页类型(1 封面、2封里、3扉页、4目录、5正文、6 辅文、7 封底里、8封底)</td>
</tr>
<tr>
<td>pagination</td>
<td>int</td>
<td>页码</td>
</tr>
<tr>
<td>physicalIndex</td>
<td>int</td>
<td><a href="https://www.showdoc.cc/visiontalk?page_id=2217068125466966">物理页码</a></td>
</tr>
<tr>
<td>extraData</td>
<td>String</td>
<td>额外信息(即后台中用户输入的每页extraData信息)</td>
</tr>
<tr>
<td>BookBean</td>
<td>BookBean</td>
<td>书本信息</td>
</tr>
<tr>
<td>similarBooks</td>
<td>List<SimilarBooksBean></td>
<td>相似书本信息(sdk2.0版本新增)。当存在与被识别书本高度相似的书本时,SDK返回的书本识别结果可能是错误的。此时SDK将通过similarBooks属性返回所有相似书本的ID。对于有屏设备,开发者可以将这些书本显示在屏幕上供用户选择,并将选择结果通过setupManualBookId(见本文第七点)接口上报玩瞳,这将大大提高内页识别的准确性。</td>
</tr>
<tr>
<td>elapsedTime</td>
<td>long</td>
<td>识别耗时</td>
</tr>
<tr>
<td>videoText</td>
<td>String</td>
<td>卡片额外信息(暂时无用)</td>
</tr>
</tbody>
</table>
<h5>5.1.2 RecognizeEntity.BrsBean.DataBean.BookBean类</h5>
<table>
<thead>
<tr>
<th>属性</th>
<th>类型</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>bookId</td>
<td>int</td>
<td>书本id</td>
</tr>
<tr>
<td>pageId</td>
<td>String</td>
<td>书页id</td>
</tr>
<tr>
<td>bookName</td>
<td>String</td>
<td>书名</td>
</tr>
<tr>
<td>thumbnailCoverImage</td>
<td>String</td>
<td>书页缩略图</td>
</tr>
<tr>
<td>totalPage</td>
<td>int</td>
<td>物理页总数</td>
</tr>
<tr>
<td>author</td>
<td>String</td>
<td>作者</td>
</tr>
<tr>
<td>publisher</td>
<td>String</td>
<td>出版社</td>
</tr>
<tr>
<td>isbn</td>
<td>String</td>
<td>ISBN</td>
</tr>
<tr>
<td>seriesTitle</td>
<td>String</td>
<td>序列名</td>
</tr>
<tr>
<td>description</td>
<td>String</td>
<td>书本简介</td>
</tr>
<tr>
<td>mainPage</td>
<td>int</td>
<td>正文总页数(sdk2.0版本新增)</td>
</tr>
<tr>
<td>securityId</td>
<td>String</td>
<td>书本安全ID(sdk2.0版本新增)</td>
</tr>
<tr>
<td>resourceType</td>
<td>int</td>
<td>书本资源类型(1:领读;2:点读;3:领读&点读)(sdk2.0版本新增)</td>
</tr>
<tr>
<td>currentRepo</td>
<td>BookResourceLibraryInfoEntity</td>
<td>当前资源信息(sdk2.1.3版本新增)</td>
</tr>
</tbody>
</table>
<h5>5.1.3 RecognizeEntity.BrsBean.DataBean.SimilarBooksBean类</h5>
<table>
<thead>
<tr>
<th>属性</th>
<th>类型</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>bookId</td>
<td>int</td>
<td>书本id</td>
</tr>
<tr>
<td>priority</td>
<td>int</td>
<td>优先级</td>
</tr>
<tr>
<td>repoId</td>
<td>int</td>
<td>书库id</td>
</tr>
</tbody>
</table>
<h5>5.1.4 BookResourceLibraryInfoEntity类</h5>
<table>
<thead>
<tr>
<th>属性</th>
<th>类型</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>id</td>
<td>int</td>
<td>资源库id</td>
</tr>
<tr>
<td>name</td>
<td>String</td>
<td>资源库名称</td>
</tr>
<tr>
<td>bookId</td>
<td>int</td>
<td>书本id</td>
</tr>
<tr>
<td>language</td>
<td>int</td>
<td>语言类型 ( 0 :未知 1 :中文 2:英文)</td>
</tr>
<tr>
<td>soundRay</td>
<td>int</td>
<td>声线类型 ( 0 :未知 1 : 人声 2: TTS)</td>
</tr>
</tbody>
</table>
<h4>5.2 onRecognizeFail</h4>
<p>该回调为识别失败的回调</p>
<p><strong>参数:</strong></p>
<table>
<thead>
<tr>
<th>参数名</th>
<th>类型</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>code</td>
<td>int</td>
<td>错误码</td>
</tr>
<tr>
<td>baseBookId</td>
<td>int</td>
<td>当识别到书本但是缺少资源等情况时 会回调当前书本的baseBookId</td>
</tr>
<tr>
<td>msg</td>
<td>String</td>
<td>响应消息</td>
</tr>
</tbody>
</table>
<p><strong>备注:</strong>错误码请查看错误码章节</p>
<h4>5.3 onGetBookInfoFail</h4>
<p>该回调为获取书本信息失败的回调</p>
<p><strong>参数:</strong></p>
<table>
<thead>
<tr>
<th>参数名</th>
<th>类型</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>code</td>
<td>int</td>
<td>错误码</td>
</tr>
<tr>
<td>msg</td>
<td>String</td>
<td>响应消息</td>
</tr>
</tbody>
</table>
<p><strong>备注:</strong>错误码请查看错误码章节</p>
<h4>5.4 onGetBookInfoSuccess</h4>
<p>该回调为获取书本信息成功的回调
<strong>参数:</strong></p>
<table>
<thead>
<tr>
<th>参数名</th>
<th>类型</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>bookInfo</td>
<td>BookInfoEntity</td>
<td>书本Id</td>
</tr>
<tr>
<td>needUpdate</td>
<td>boolean</td>
<td>是否需要更新</td>
</tr>
</tbody>
</table>
<p><strong>返回值 : </strong></p>
<p>该接口如果返回true,则用户自己消费该回调接口,不会走之后的流程,用户可以用bookId实现自己的逻辑;如果返回false,则继续之后的流程(播放更新书本语音和下载书本信息等)。</p>
<pre><code class="language-java">@Override
public boolean onGetBookInfoSuccess(BookInfoEntity bookInfo, boolean needUpdate) {
//该接口如果返回true,则用户自己消费该回调接口,不会走之后的流程,用户可以用bookId实现自己的逻辑;
//如果返回false,则继续之后的流程(播放更新书本语音和下载书本信息等)
return true;
}</code></pre>
<h5>5.4.1 BookInfoEntity类</h5>
<table>
<thead>
<tr>
<th>属性</th>
<th>类型</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>id</td>
<td>int</td>
<td></td>
</tr>
<tr>
<td>securityId</td>
<td>String</td>
<td>书本安全id(sdk2.0版本新增)</td>
</tr>
<tr>
<td>bookId</td>
<td>int</td>
<td>书本id</td>
</tr>
<tr>
<td>name</td>
<td>String</td>
<td>书名</td>
</tr>
<tr>
<td>author</td>
<td>String</td>
<td>作者</td>
</tr>
<tr>
<td>resourceDownloadURL</td>
<td>String</td>
<td>资源URL</td>
</tr>
<tr>
<td>isbn</td>
<td>String</td>
<td>isbn号</td>
</tr>
<tr>
<td>totalPage</td>
<td>int</td>
<td>物理页数</td>
</tr>
<tr>
<td>thumbnailCoverImage</td>
<td>String</td>
<td>封面缩略图</td>
</tr>
<tr>
<td>extraData</td>
<td>String</td>
<td>自定义数据</td>
</tr>
<tr>
<td>repoId</td>
<td>int</td>
<td>资源库Id</td>
</tr>
<tr>
<td>repoName</td>
<td>Object</td>
<td>资源库名称</td>
</tr>
<tr>
<td>publisher</td>
<td>String</td>
<td>出版社</td>
</tr>
<tr>
<td>seriesTitle</td>
<td>String</td>
<td>序列名</td>
</tr>
<tr>
<td>description</td>
<td>String</td>
<td>书本简介</td>
</tr>
</tbody>
</table>
<h4>5.5 onGetCardInfoSuccess</h4>
<p>该回调为获取卡片信息成功的回调
<strong>参数:</strong></p>
<table>
<thead>
<tr>
<th>参数名</th>
<th>类型</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>cardInfoEntity</td>
<td>CardInfoEntity</td>
<td>卡片信息</td>
</tr>
<tr>
<td>needUpdate</td>
<td>boolean</td>
<td>是否需要更新</td>
</tr>
</tbody>
</table>
<p><strong>返回值 : </strong></p>
<p>该接口如果返回true,则用户自己消费该回调接口,不会走之后的流程,用户可以用bookId实现自己的逻辑;如果返回false,则继续之后的流程(播放更新书本语音和下载书本信息等)。</p>
<h5>5.5.1 CardInfoEntity类</h5>
<table>
<thead>
<tr>
<th>属性</th>
<th>类型</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>cardGroupSecurityId</td>
<td>String</td>
<td>卡片安全id(sdk2.0版本新增)</td>
</tr>
<tr>
<td>groupId</td>
<td>int</td>
<td>卡片id</td>
</tr>
<tr>
<td>modeld</td>
<td>int</td>
<td>模型Id</td>
</tr>
<tr>
<td>groupName</td>
<td>String</td>
<td>卡片套牌名字</td>
</tr>
<tr>
<td>resourceDownloadURL</td>
<td>String</td>
<td>资源URL</td>
</tr>
<tr>
<td>thumbnailCoverImage</td>
<td>String</td>
<td>封面缩略图</td>
</tr>
<tr>
<td>totalCards</td>
<td>int</td>
<td>套牌数量</td>
</tr>
</tbody>
</table>
<h4>5.6 onGetPageAudio</h4>
<p>获取当前识别页的音频数据
<strong>参数:</strong></p>
<table>
<thead>
<tr>
<th>参数名</th>
<th>类型</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>pageAudio</td>
<td>PageAudio</td>
<td>音频信息</td>
</tr>
</tbody>
</table>
<p><strong>返回值 : </strong></p>
<p>该接口如果返回true,拦截播放 ,返回false 继续播放。</p>
<h5>5.5.1 CardInfoEntity类</h5>
<table>
<thead>
<tr>
<th>属性</th>
<th>类型</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>cardGroupSecurityId</td>
<td>String</td>
<td>卡片安全id(sdk2.0版本新增)</td>
</tr>
<tr>
<td>groupId</td>
<td>int</td>
<td>卡片id</td>
</tr>
<tr>
<td>modeld</td>
<td>int</td>
<td>模型Id</td>
</tr>
<tr>
<td>groupName</td>
<td>String</td>
<td>卡片套牌名字</td>
</tr>
<tr>
<td>resourceDownloadURL</td>
<td>String</td>
<td>资源URL</td>
</tr>
<tr>
<td>thumbnailCoverImage</td>
<td>String</td>
<td>封面缩略图</td>
</tr>
<tr>
<td>totalCards</td>
<td>int</td>
<td>套牌数量</td>
</tr>
</tbody>
</table>
<h3>6. 设置BookId</h3>
<p>该接口适用于部分客户想不识别封面直接识别内页的需求。</p>
<p><strong>接口名称:</strong></p>
<pre><code class="language-java">public void setupBookId(int bookId)</code></pre>
<p><strong>备注:</strong>sdk 2.0+的版本开放该接口;</p>
<h3>7. 设置人为选择的BookId</h3>
<p><strong>使用场景:</strong>用于解决相似书识别,用户选择书本的相关场景。例:识别到相似书时(如:英语上下册,封面就一个文字区别),App展示多本相似书给用户选择,当用户选择后(选择时需调用[设置版本](<a href="https://www.showdoc.com.cn/visiontalk/5672301930548172">https://www.showdoc.com.cn/visiontalk/5672301930548172</a> "设置版本"))即需要调用此接口确定用户选择的bookid。</p>
<p><strong>接口名称:</strong></p>
<pre><code class="language-java">public void setupManualBookId(int bookId)</code></pre>
<p>当识别到封面时,可通过该接口忽略玩瞳的书本识别结果,并将用户实际阅读书本的ID返回给玩瞳。在确定用户使用哪一本书的情况下,调用该接口可以提高书本内页识别的准确性。该接口应该在识别到书本封面时调用。</p>
<p><strong>入参:</strong>
书本(资源)ID。</p>
<p><strong>备注:</strong>sdk 2.0+的版本开放该接口;</p>
<h3>8. 静态帧检测回调IStateDetectListener(部分2.16.*版本及之前版本为IStateDetectListenner)</h3>
<p>该回调类用于监听翻页状态回调,接口类如下:</p>
<pre><code class="language-java">public interface IStateDetectListener {
public static final int DETECT_TYPE_SLIP = 1; //移动
public static final int DETECT_TYPE_NOSLIP = 0; //静止
void onStateDetectResult(int type);
}</code></pre>