多媒体 JS 调用函数
讯飞语音播放
传入需要播放的文本,如果此时有播视频,就关掉视频,显示黑屏
void playVoice(String callText)
/**
* 文字语音合成
* @param callText 需要播放的文字
*/
@JavascriptInterface
public void playTextVoice(String callText)
/**
* 讯飞多音字接口,特殊符号加到多音字前
* 比如“单”需要读成“善”,需要在“单”字前加入特殊符号,并把特殊符号传入接口第二个参数
*
* @param callText 叫号内容
* @param specialSymbol 特殊字符串
*/
// 网页叫号回调
@JavascriptInterface
public void playVoice(String callText, String specialSymbol)
/**
* 停止叫号,清除语音队列
*/
@JavascriptInterface
public void stopVoice()
检测 URL 或 IP 连通性
/**
* 检测url连通性
* @param url 需要检测的URL或IP
* @return 结果码:0是可连通,非0都是不可连通
*/
public int checkConnectivity(String url) {
return CurlUtil.checkConnectivity(url);
}
获取终端时间
获取终端日期,格式: 2013-09-08 07:06 6(1~7 7 代表周日)
String getDateTime()
音量
/**
* 设置音量
*
* @param value 音量值
*/
@JavascriptInterface
public void setVolume(int value)
/**
* 获取音量
*
* @return 音量值
*/
@JavascriptInterface
public int getVolume()
电子医保凭证
需要在设备的 /sdcard/shine/electronic.json 文件中配置解密电子医保凭证相关数据,例如:
{
"businessType": "01101",
"deviceType": "SelfService",
"officeId": "9015",
"officeName": "门诊收费室",
"operatorId": "LRY002",
"operatorName": "自助机2",
"orgId": "H43018100218",
"tradingServerIp": "xxxxxx",
"tradingUrl": "http://xxxxxx/localcfc/api/hsecfc/localQrCodeQuery",
"transType": "ec.query"
}
其中 orgId、tradingServerIp、tradingUrl 三个字段是必须的,其他字段可以默认不变
/**
* 电子医保凭证数据<br>
* 解密成功会调用前端onRawInput方法,传入解密后的数据;<br>
* 解密失败会调用前端nationEcTransError方法,传入错误码和错误提示;<br>
*
* @param code 电子社保卡序号
*/
@JavascriptInterface
@android.webkit.JavascriptInterface
public void nationEcTrans(String code)
读卡拦截
/**
* 设置有效卡号,只接收这部分卡号
* @param code 卡号
*/
@JavascriptInterface
public void setValidCardCode(String[] code)
/**
* 调用该接口设置需要拦截的卡号,后续再收到该卡号,不会通知页面
*
* @see Callobject#clearInterceptCardCode()
* @param code 卡号
*/
@JavascriptInterface
public void setInterceptCardCode(String code)
/**
* 调用该接口拦截所有卡号
*/
@JavascriptInterface
public void interceptAllCardCode()
/**
* 清空需要拦截的卡号
*/
@JavascriptInterface
public void clearInterceptCardCode()
明泰三合一读卡
/**
* 明泰三合一持续读身份证
*
* @param duration 持续读时间(单位秒)
* @return 该函数是否执行成功
*/
@JavascriptInterface
public boolean readIDCardWithDuration(final int duration)
目前只用到了 strParam1 和 needCode 两个参数
strParam1 配置块地址和扇区号以及密码,格式:010160ffffffffffff
needCode 是否需要读取社保卡区号
void GetChinaIdentityCardInfo(int nUsbHardwardID, String strMethodName, int runTime, String strParam1,String strParam2,boolean needCode)
/**
* 开始循环读卡
* @param sector 扇区
* @param block 块地址
* @param password 密钥
* @param passwordType 密钥类型 0-类型A 1-类型B
* @param needCode 对用GetChinaIdentityCardInfo函数最后一个参数
* @param deduplication 去重复数据,默认不去重
*
* @apiNote 回调方式和参数和之前读卡接口一致
*/
@JavascriptInterface
public void startLoopReadCard(int sector, int block, String password, int passwordType, boolean needCode,boolean deduplication)
/**
* 停止循环读卡
*/
@JavascriptInterface
public void stopLoopReadCard()
读卡器/扫描枪数据回调
自2024年11月15日起,读卡器、扫描枪及磁条刷卡器的数据结构和回调接口将统一调整,采用分诊产品组最新提出的标准。自该日期起,所有程序需按照以下定义的回调接口和数据结构进行数据解析。
M1卡/就诊卡
该数据由调用 onRawInput 回调统一为 getReadCardInfo
getReadCardInfo('{"cardType":"1","name":"","gender":"","birth":"","nation":"","cardNumber":"","iDNo":"卡号","needCode":""}@卡号@OK')
社保卡数据回调
未解密
getReadCardInfo('{"cardType":"2","name":"","gender":"","birth":"","nation":"","cardNumber":"","iDNo":"卡号","needCode":"","bankCardNumber":""}@卡号@OK')
已解密
getReadCardInfo('{"cardType":"2","name":"张三丰","gender":"男","birth":"2001-01-01","nation":"汉","cardNumber":"卡号","iDNo":"社会保障号码","needCode":"区号","bankCardNumber":"xxxxxx"}@社会保障号码@OK')
身份证数据回调
getReadCardInfo('{"cardType":"3","name":"张三丰","gender":"男","birth":"2001-01-01","nation":"汉","cardNumber":"卡号","address","xxx","iDNo":"身份证号","needCode":"区号"}@身份证号@OK')
一维码/二维码/磁条卡
getReadCardInfo('{"cardType":"4","name":"","gender":"","birth":"","nation":"","cardNumber":"","address","","iDNo":"卡号","needCode":""}@卡号@OK')
中控读卡器读卡
调用 zkReadIDInfo 接口开始读卡,收到读卡成功回调后可以调用 getIDCardBase64ImgData 接口获取 base64 格式照片数据
可能出现读卡失败的情况:
config.json配置文件没配置启用中控读卡器- 身份证没有放对位置,没有读取到身份证信息
/**
* 中控读卡器读身份证
*/
@JavascriptInterface
public void zkReadIDInfo()
/**
* 获取身份证照片
* @param id 身份证号
* @return base64格式的图片数据
*/
@JavascriptInterface
public String getIDCardBase64ImgData(String id)
/**
* 中控读卡器读IC卡
*
* @param mode 读操作模式控制
* Bit 0: 0=Requese idle;1=Request All
* Bit 1: 0=对KEYA进行校验;1=对KEYB进行校验
* 进行校验
* @param blockCount 要读取的块数长度值,即读多少块。取值范围 01-04
* @param startAddress 要读块的起点地址 Mifare s50 取值范围:十六进制 00-3F 即 0 块到 63 块
* @param key 12个字符秘钥
*/
@JavascriptInterface
public void zkReadMIFARE(int mode, int blockCount, int startAddress, String key)
/**
* 中控读卡器读IC卡+身份证
* 优先读IC卡,IC卡读取失败后读身份证,身份证读取失败后通知页面读卡失败
* 读卡过程中任意一种卡读成功就停止读卡并通知页面
*
* @param mode 读操作模式控制
* Bit 0: 0=Requese idle;1=Request All
* Bit 1: 0=对KEYA进行校验;1=对KEYB进行校验
* 进行校验
* @param blockCount 要读取的块数长度值,即读多少块。取值范围 01-04
* @param startAddress 要读块的起点地址 Mifare s50 取值范围:十六进制 00-3F 即 0 块到 63 块
* @param key 12个字符秘钥
*/
@JavascriptInterface
public void zkReadCard(int mode, int blockCount, int startAddress, String key)
读身份证回调
// 读卡成功回调
onIDCardInfoReceived('{"address":"黑龙江=","birth":"1999年02月03日","chinaName":"小小","dateEnd":"2040.03.16","dateStart":"2020.03.16","id":"123330198810012333","issued":"xx县公安局","nation":"汉"}')
// 读卡失败回调
onReadIDCardFailed()
读 IC 卡回调
// 读卡成功回调,读卡器读到的原始数据,可能会存在大小端问题
onZKReadMIFAREReceived('5A2F634')
// 读卡失败回调
onReadMIFAREFailed()
读身份证 +IC 卡
// 读卡成功回调,读卡器读到的原始数据,可能会存在大小端问题
onZKReadMIFAREReceived('5A2F634')
// 读身份证成功回调
onIDCardInfoReceived('{"address":"黑龙江=","birth":"1999年02月03日","chinaName":"小小","dateEnd":"2040.03.16","dateStart":"2020.03.16","id":"123330198810012333","issued":"xx县公安局","nation":"汉"}')
// 读卡失败回调
onZKReadCardFailed()
打印机相关
打印
在 java 层如果没得到返回值,默认传 -1
int PrintXml(String xml)
检查打印机纸
int CheckPaper()
设置切纸方式
/**
* 设置切纸方式
* @param type 0全切 1半切,默认全切
*/
public void Fullcut(int type)
打印 base64 图片数据
/**
* 美松打印机打印base64图片数据
*
* @param base64 base64图片数据
* @return 打印结果
* 0 成功
* -1 失败
*/
public int printBase64Image(String base64)
设置课节数据
每次调用该接口都会触发分库操作
int setClassInfo(String classInfo)
获取指定文件数据
String getFileData(String path)
写入数据到指定文件
返回值为是否写入成功
boolean setFileData(String path, String json)
打开拍照(弃用)
void openTakePictureCamera()
打开摄像头
传入参数为预览窗口的位置和大小
void openMediaCamera(int x, int y, int width, int height)
关闭摄像头
/**
* 关闭摄像头
*/
void closeCamera()
判断摄像头是否可以打开
/**
* 判断摄像头是否可以打开
*/
boolean isCameraCanOpen()
判断摄像头是否打开
/**
* 判断摄像头是否打开
*/
boolean isCameraOn()
获取摄像头支持的预览尺寸
/**
* 获取摄像头支持的预览尺寸
*
* @param cameraId 摄像头ID,默认前置0,后置1
* @return 预览尺寸列表,例如 [{"height":720,"width":1280},{"height":960,"width":1280}]
*
*/
@JavascriptInterface
public String getSupportedPreviewSizes(int cameraId)
设置摄像头预览尺寸
/**
* 设置摄像头预览尺寸
* 设置后下次打开摄像头生效
* 如果设置的尺寸摄像头不支持,默认设置宽高比相近的分辨率
*
* @param width 预览宽度
* @param height 预览高度
*/
@JavascriptInterface
public void setPreviewSizes(int width, int height)
拍照
/**
* 拍照
*
* @param name 拍照后保存的文件名称,文件保存在/sdcard/SmartClass/assets/img/pictures目录
* @apiNote 拍照结束后回调 android('{"name":"filename","action":"takePicture","content":"failed"}')<br>
* filename-图片名称<br>
* content-拍照结果 failed:拍照失败 finish:拍照完成
*/
@JavascriptInterface
public void takePicture(String name)
图片转 Base64
/**
* 图片转base64数据
*
* @param name 位于/sdcard/SmartClass/assets/img/pictures目录中图片文件名
* @return 图片base64数据
*/
@JavascriptInterface
public String bmp2Base64(String name)
获取设备 Mac
/**
* 获取设备Mac
*
* @return 设备Mac
*/
String getMac()
获取服务器 IP
/**
* 获取配置的服务器IP
*
* @return 服务器IP
*/
String getServeIp()
播放 MW.wav
/**
* 播放/sdcard/MediaPlay/MW.wav文件,功能暂时不得而知
*
* @param fileContent 不得而知
*/
@JavascriptInterface
public void playMW(String fileContent)
播放完成后会调用页面函数:
playMWFinish()
播放系统音
/**
* 播放系统提示音
* @param type 声音类型 1:来电铃声 2:系统提示音 4:闹钟铃声
* 其他类型无效
*/
@JavascriptInterface
public void playRingtone(int type)
打开项目配置参数设置页面
/**
* 打开设置页面
*/
@JavascriptInterface
public void openSettingDialog()
录制视频相关
/**
* 录制视频
*
* @param name 视频文件路径
* 目前该参数没有被使用。固定路径/sdcard/SmartClass/assets/video/test.mp4
*/
void startRecorder(String name)
/**
* 停止录制视频
*/
void stopRecorder()
录制音频相关
/**
* 录制MP3格式音频
*
* @param fileName 音频文件名称
*
*/
void startMP3Recorder(String fileName)
/**
* 停止录制MP3格式音频
* @return 音频文件路径 例如:/sdcard/shine/record/record.mp3
*/
String stopMP3Recorder()
跳转主题管理
// 点击了主题管理按钮后发送该通知
android('{"name":"openZT","action":"openZT","content":"openZT"}')
人脸识别相关
/**
* 检测人脸识别授权状态
* @return 是否授权
*/
@JavascriptInterface
public boolean verifyFaceAuthorization()
/**
* 清空人脸特征码数据库
* @return 是否成功
*/
@JavascriptInterface
public boolean emptyFacePassDB()
/**
* 下载人脸识别用的所有文件
* SchoolFTP/$schoolId/classFaceCode/$classId_ks.json
*
* @param classId 班级ID,旷视项目该参数无效
*/
@JavascriptInterface
public void downClassFace(String classId)
/**
* 下载人脸识别用的所有文件,包括 user_ks.json,facepass.db
* 如果更新facepass.db文件,会重新初始化人脸识别SDK
*
* @param roomId 教室ID,旷视项目该参数无效
*/
@JavascriptInterface
public void downRoomFace(String roomId)
/**
* 通知多媒体user_ks.json地址
*
* @param path user_ks.json路径,旷视项目该参数无效
* @param index 不得而知,旷视项目该参数无效
*/
@JavascriptInterface
public void setPersons(String path, int index)
/**
* 打开人脸识别,该接口人脸识别默认使用大库,默认显示人脸框
*
* @param x 预览窗口x轴位置
* @param y 预览窗口y轴位置
* @param width 预览窗口宽度
* @param height 预览窗口高度
*/
void openFaceCamera(int x, int y, int width, int height)
/**
* 打开人脸识别,该接口人脸识别默认使用大库
*
* @param x 预览窗口x轴位置
* @param y 预览窗口y轴位置
* @param width 预览窗口宽度
* @param height 预览窗口高度
* @param showResult 是否显示人脸框
*/
void openFaceCamera(int x, int y, int width, int height, boolean showResult)
/**
* 打开人脸识别
*
* @param x 预览窗口x轴位置
* @param y 预览窗口y轴位置
* @param width 预览窗口宽度
* @param height 预览窗口高度
* @param classId 课程ID
* 根据该参数选择对应的人脸识别底库进行识别
*/
void openFaceCameraWithClassId(int x, int y, int width, int height, int classId)
/**
* 打开人脸识别且不显示人脸识别框
*
* @param x 预览窗口x轴位置
* @param y 预览窗口y轴位置
* @param width 预览窗口宽度
* @param height 预览窗口高度
* @param groupId 底库ID,没有找到对应ID使用默认底库
*/
void openFaceCameraWithoutFaceView(int x, int y, int width, int height, int groupId)
/**
* 关闭人脸识别
*/
void closeFaceCamera()
/**
* 控制人脸识别预览窗口是否显示
*
* @param isShow 是否显示预览窗口
*/
void setPreviewVisibility(boolean isShow)
/**
* 人证对比,调用该接口后开启相机预览以及身份证读卡器循环读卡模式
* <p></p>
* 读到卡信息后,把身份证照片传入人脸识别SDK进行识别
* <p></p>
* 识别后调用页面js函数android('{"name":"recognizeWithIDCard","action":"recognizeWithIDCard","content":""}
* <p></p>
* content字段为身份证信息以及人证对比分数:<b>{"Department":"派出所","EffectDate":"办证时间","ExpireDate":"过期时间",
* "IDNo":"身份证号","address":"地址","birth":"生日","name":"姓名","nation":"汉","sex":"男,"score":"对比分数(float类型)""}</b>
*
* @param x 预览窗口x轴位置
* @param y 预览窗口y轴位置
* @param width 预览窗口宽度
* @param height 预览窗口高度
*/
@JavascriptInterface
public void recognizeWithIDCard(int x, int y, int width, int height)
/**
* 人证对比,调用该接口后开启相机预览,根据传入的身份证号进行人证比对
* <p></p>
* 识别后调用页面js函数android('{"name":"recognizeWithIDCard","action":"recognizeWithIDCard","content":""}
* <p></p>
* content字段为身份证信息以及人证对比分数:<b>{"Department":"派出所","EffectDate":"办证时间","ExpireDate":"过期时间",
* "IDNo":"身份证号","address":"地址","birth":"生日","name":"姓名","nation":"汉","sex":"男,"score":"对比分数(float类型)""}</b>
* <p></p>
* 如果IDNumber参数无效,对比分数始终是0
*
* @param x 预览窗口x轴位置
* @param y 预览窗口y轴位置
* @param width 预览窗口宽度
* @param height 预览窗口高度
*/
@JavascriptInterface
public void startRecogniseWithIDNumber(int x, int y, int width, int height, String IDNumber)
/**
* 是否用于生成人脸特征码的设备
*/
@JavascriptInterface
public boolean isGenerateFaceFeatureDevice()
/**
* 生成人脸特征码
*/
@JavascriptInterface
public void generateFaceFeature()
人脸识别配置文件下载回调
// 下载成功人脸识别所需的facepass.db和user_ks.json文件后触发该回调
android('{"name":"downRoomFace","action":"downloadFile","content":"success"}')
// 下载失败人脸识别所需的facepass.db和user_ks.json文件后触发该回调
android('{"name":"downRoomFace","action":"downloadFile","content":"failed"}')
分库回调
// content 缺少人脸特征码人员唯一标识组成的数组
android('{"name":"missFaceTokenPersons","action":"missFaceTokenPersons","content":"[1,2,3]"}')
人脸识别回调
// 识别失败 code 1 识别比分过低 2 没有检测到人脸 4 识别中
android('{"name":"faceCheckNoResult","action":"faceCheckNoResult","content":"","type":"face","code":"code"}')
// 刷卡成功时 type 为 card,content 字段为卡号
// 人脸识别成功时 type 为 face,content 字段为特征码对应的photo_url,如果没有对用的photo_url则为null
android('{"name":"cardCode","action":"cardCode","content":null,"type":"face","code":"0"}')
特征码相关
/**
* 下载保存人脸特征码的文件,下载成功后直接插入特征码到数据库
* <p></p>
* 回调:android('{"name":"downloadFaceFeatureFile","action":"downloadFaceFeatureFile","content":"","code":"0"}')
* code: 0=下载完成 1=下载失败
* @param url 文件地址
*/
@JavascriptInterface
public void downloadFaceFeatureFile(String url)
/**
* 插入人脸特征码
* <p></p>
* 参数数据格式:[{"faceId":"123123","feature":"12312123"},{"faceId":"123123","feature":"12312123"}]
*
* @param feature 特征码数据
*/
@JavascriptInterface
public void insertFeature(String feature)
// 特征码插入结果页面回调 content true 插入成功;false 插入失败
android('{"name":"insertFeature","action":"insertFeature","content":true}')
/**
* 删除人脸特征码
* <p></p>
* 参数数据格式:["id1", "id2"]
*
* @param uid 人脸唯一ID
*/
@JavascriptInterface
public void delFeature(String uid)
// 特征码删除结果页面回调 content true 删除成功;false 删除失败
android('{"name":"delFeature","action":"delFeature","content":"true"}')
/**
* 查询所有人脸特征码
*
* @return 是否成功 例子:["123","456"]
*/
public String queryAllFaceToken()
人脸采集相关
/**
* 采集人脸
*
* @param x x轴位置
* @param y y轴位置
* @param width 预览界面宽
* @param height 预览界面高
*/
@JavascriptInterface
void collectingFace(int x, int y, int width, int height)
/**
* 采集人脸,不显示位置图片
*
* @param x x轴位置
* @param y y轴位置
* @param width 预览界面宽
* @param height 预览界面高
*/
@JavascriptInterface
void collectingFaceWithoutPositionImg(int x, int y, int width, int height)
/**
* 自动采集人脸,采集到后自动关闭采集框,保存照片到/sdcard/SmartClass/assets/img/pictures/facePhoto.jpg文件,并回调前端takePicture
*
* @param x x轴位置
* @param y y轴位置
* @param width 预览界面宽
* @param height 预览界面高
*/
@JavascriptInterface
@android.webkit.JavascriptInterface
public void collectingFaceAuto(int x, int y, int width, int height)
人脸采集回调
调用了 collectingFace 接口后,会收到关于人脸位置信息的回调,在 code 为 0 时 才允许执行采集动作
// code参数说明 0 位置正确 1 人脸过多 2 请往右移 3 请往左移 4 请往下移 5 请往上移 6 请往前移
android('{"name":"collectingFace","action":"collectingFace","code":"code"}')
图片转特征码
/**
* 图片转特征码
* @param name 图片路径
*/
void getFaceToken(String name)
页面调用完该接口,多媒体程序把生成结果通过网页接口传回:
// facetoken 为结果;-1-参数有问题的时候返回 1-没有识别到人脸 2-图片质量不合格
android('{"name":"getFaceToken","action":"getFaceToken","content":["facetoken"]}')
/**
* 图片转人脸特征码
* @param name 图片路径
*/
void getFaceFeature(String name)
// content 为结果;-1-参数有问题的时候返回 1-没有识别到人脸 2-图片质量不合格
android('{"name":"getFaceFeature","action":"getFaceFeature","content":""')
测温相关
/**
* 获取温度
*
* @return 温度值 比如:25.5
*/
@JavascriptInterface
String getTemperatureValue()
/**
* 开始循环获取温度数据
*
* @param delay 每隔多少ms获取一次,推荐不低于300
* @return 是否成功
*/
@JavascriptInterface
boolean loopGetTemperature(int delay)
/**
* 开始循环获取温度数据
*
* @param delay 每隔多少ms获取一次,推荐800~1200
* @param warningTemperatureThreshold 报警温度阈值,超过该温度后显示框变成橘色
* 如果传入的参数无效,使用默认值36.9
* @return 是否成功
*/
@JavascriptInterface
boolean loopGetTemperature(int delay, String warningTemperatureThreshold)
/**
* 开始循环获取温度数据,基于gpio上的设备检测
*
* @param delay 每隔多少ms发送一次,推荐100~300
*/
@JavascriptInterface
public void loopGetTemperatureWithGpio(int delay)
/**
* 获取温度数据
*
* @return 是否获取成功
*/
@JavascriptInterface
public boolean getTemperature()
/**
* 停止循环获取温度数据
*/
@JavascriptInterface
void stopLoopGetTemperature()
/**
* 根据phone_url获取温度
*
* @param phoneUrl 学生对象对应的phone_url
* @return 温度数据
*/
@JavascriptInterface
String getTemperature(String phoneUrl)
温度数据回调
android(android('{"name":"temperature","action":"temperature","content":"温度数值"}'))
班牌相关
/**
* 加载页面
*
* @param url 页面地址
*/
@JavascriptInterface
public void loadUrl(String url)
/**
* 获取学校ID
*
* @return 学校ID
*/
@JavascriptInterface
public String getSchoolId()
/**
* 设置学校ID
* 调用该接口后会去下载服务器的pw文件
* 下载成功后立马授权
*
* @param schoolId 学校ID
*/
@JavascriptInterface
public void setSchoolId(String schoolId)
文件相关
/**
* 写内容到文件
*
* @param filePath 文件绝对路径,如果不存在则自动创建,建议使用/sdcard/shine/web作为根目录
* @param content 写入内容
* @param append 是否追加写入
* @return 写入结果
*/
@JavascriptInterface
public boolean writeFile(String filePath, String content, boolean append)
/**
* 读文件
*
* @param filePath 文件绝对路径
* @return 读取内容
*/
@JavascriptInterface
public String readFile(String filePath)
/**
* 文件是否存在
*
* @param filePath 文件绝对路径
* @return 文件是否存在
*/
public boolean isFileExists(String filePath)
/**
* 下载文件
*
* @param name 文件名
* @param paths 文件路径
* @param md5 文件md5
* @param needDel 不得而知
* @param isPicture 是否是图片
*/
public void downLoad(String name, String[] paths, String[] md5,boolean needDel, boolean isPicture)
/**
* 下载文件
*
* @param name 文件名
* @param paths 文件路径
* @param md5 文件md5
* @param needDel 不得而知
*/
@JavascriptInterface
public void downLoad(String name, String[] paths, String[] md5, boolean needDel)
/**
* 上传文件
*
* @param src 文件名
* @param path 文件路径
* @param type 文件类型
*/
@JavascriptInterface
public void uploadFile(String src, String path, int type)
/**
* 删除班牌项目中的图片
*
* @param paths 图片路径
* 多媒体会在路径前拼接/sdcard/SmartClass/assets/img/
*/
@JavascriptInterface
public void deleteImg(String[] paths)
/**
* 删除文件
*
* @param src 文件的相对路径,不要以/开头
* 例如:assets/img/post/101/4.mp4
* 下载结果通知action为deleteFile
* content为结果码 0-成功;10301-无效参数;10302-删除失败
*/
@JavascriptInterface
public void deleteFile(String src)
/**
* 批量删除文件
*
* @param paths 文件的相对路径数组,路径不要以/开头
* 例如:{"assets/img/post/101/4.mp4", "assets/img/post/101/5.mp4"}
* 每删除一个文件回调一次,删除结果通知action为deleteFile
* content为结果码 0-成功;10301-无效参数;10302-删除失败
*/
@JavascriptInterface
public void deleteFiles(String[] paths)
/**
* 检测文件是否存在
*
* @param path 文件的相对路径数组,路径不要以/开头
* 例如:"assets/img/post/101/5.mp4"
*
* @return true:存在 false:不存在
*/
@JavascriptInterface
public boolean checkFileExists(String path)
/**
* 获取指定目录下文件列表,包括子目录
* @param path 文件目录路径 例如:/sdcard/SmartClass/assets/img/post/
* @return 文件列表 例如:["/sdcard/SmartClass/assets/img/post/1/15.mp4"]
*/
@JavascriptInterface
public String listFilesInDir(String path)
文件下载回调
// 下载FTP文件进度通知
android({name:"downloadProgress",action:"downloadProgress",content:"progress"})
/**
* 下载结果
*
* @param name FTP服务器文件名
* @param content 下载结果
* success 成功
* failed 失败
*/
android({name:"file_name",action:"downloadFile",content:"success"})
// 上传FTP文件结果通知
android({name:"file_name",action:"fileUpload",content:"success"})
文件删除回调
/**
* 删除文件结果通知
* result 0-成功;10301-无效参数(文件不存在或不是一个文件);10302-删除失败;
* file_name 当前删除的文件相对路径
*/
android({name:"file_name",action:"deleteFile",content:"result"})
直播相关
/**
* 开启直播,目前全平台不支持rtmp协议的流
*
* @param path 直播流路径
*/
@JavascriptInterface
public void openLive(String path)
/**
* 开启直播
*
* @param path 直播流地址
* @param x 预览窗口x轴位置
* @param y 预览窗口y轴位置
* @param width 预览窗口宽度
* @param height 预览窗口高度
*/
@JavascriptInterface
public void openLive(String path, int x, int y, int width, int height)
/**
* 打开直播流,隐藏自带的loading界面
*
* @param path 直播流地址
* @param x 预览窗口x轴位置
* @param y 预览窗口y轴位置
* @param width 预览窗口宽度
* @param height 预览窗口高度
*/
@JavascriptInterface
public void openLiveHideLoadingView(String path, int x, int y, int width, int height)
/**
* 开启直播,不显示关闭按钮
* @param path 直播流地址
* @param x 预览窗口x轴位置
* @param y 预览窗口y轴位置
* @param width 预览窗口宽度
* @param height 预览窗口高度
*/
@JavascriptInterface
public void openLiveWithoutCloseBtn(String path, int x, int y, int width, int height)
/**
* 关闭直播流
*/
@JavascriptInterface
public void closeLive()
直播事件通知
// 识别失败 code 10900 直播流加载成功 10901 直播流加载失败 10902 手动停止直播流
android('{"name":"live","action":"live","content":"","type":"","code":"code"}')
跑马灯相关
/**
* 播放跑马灯
*
* @param content 内容
* @param startDate 开始日期 "2013-03-27"
* @param startTime 开始时间 "00:00:00"
* @param stopDate 停止日期 "2013-05-10"
* @param stopTime 停止时间 "23:59:00"
* @param id 任务ID
*/
@JavascriptInterface
public void playText(String content, String startDate, String startTime, String stopDate, String stopTime, int id)
/**
* 播放跑马灯
*
* @param content 内容
* @param startDate 开始日期
* @param startTime 开始时间
* @param stopDate 停止日期
* @param stopTime 停止时间
* @param id 任务ID
* @param marginLeft 左边距
* @param marginRight 右边距
* @param textSize 字体大小
* @param boldText 字体加粗
*/
@JavascriptInterface
public void playTextWithMargin(String content, String startDate, String startTime, String stopDate, String stopTime, int id,
int marginLeft, int marginRight, int textSize, boolean boldText)
/**
* 停止跑马灯
*
* @param id 任务ID
*/
@JavascriptInterface
public void stopText(int id)
/**
* 显示跑马灯
*/
@JavascriptInterface
public void showText()
/**
* 隐藏跑马灯
*/
@JavascriptInterface
public void hideText()
门禁相关
/**
* 开门
*/
@JavascriptInterface
public void openDoor()
/**
* 关门
*/
@JavascriptInterface
public void closeDoor()
/**
* 给门禁控制器发送指令
* 设备安装了门禁控制器后,发送在线检测指令,一般情况下1s内串口会响应在线检测指令
* 响应内容通过回调页面js函数android('{"name":"serialReceived","action":"serialReceived","content":""}中的content字段返回
* @param command 门禁控制指令
* 关门:7F10030000026EAA
* 开门:7F10030000016DAA
* 在线检测:7F10050000006AAA
@see
<a href="https://www.yuque.com/docs/share/0721bb33-f948-4612-927b-a2646d3c2fb5?#6edd">门禁协议文档</a>
*/
@JavascriptInterface
public void sendDoorLockControlCommand(String command)
mqtt 相关
/**
* mqtt是否连接成功
* @return 是否连接成功
*/
public boolean isMqttConnected()
/**
* 订阅mqtt主题
*
* @param topic mqtt主题
* @return 是否订阅成功
*/
@JavascriptInterface
public boolean subscribeToTopic(String topic)
/**
* 解除订阅mqtt主题
*
* @param topic mqtt主题
* @return 是否解除订阅成功
*/
@JavascriptInterface
public boolean disSubscribeToTopic(String topic)
/**
* 发送mqtt消息
*
* @param message mqtt消息
* @param topic mqtt主题
*/
@JavascriptInterface
public void sendMqtt(String message, String topic)
mqtt 连接状态通知
// 连接成功,重新连接成功通知
android('{"name":"mqttConnectComplete","action":"mqttConnectComplete"}')
// 连接断开
android('{"name":"mqttConnectionLost","action":"mqttConnectionLost"}')
屏幕控制相关
/**
* 关屏
* @return 结果码 0成功 非0失败
*/
@JavascriptInterface
public int closeScreen()
/**
* 开屏
* @return 结果码 0成功 非0失败
*/
@JavascriptInterface
public int openScreen()
腾讯 TRTC 音视频接口
/**
* 进入房间
* <br>
* 调用接口后,您会收到来自 TRTCCloudListener 中的 onEnterRoom(result) 回调:
* <br>
* 如果加入成功,result 会是一个正数(result > 0),表示加入房间所消耗的时间,单位是毫秒(ms)。
* 如果加入失败,result 会是一个负数(result < 0),表示进房失败的错误码。
* <br>
* 进房失败的错误码含义请参见<a href="https://cloud.tencent.com/document/product/647/32257">错误码</a>。
*
* @param sdkAppId 可以在腾讯云实时音视频控制台(https://console.cloud.tencent.com/rav)获取
* @param roomId 音视频房间号,自动创建房间,比如 125
* @param uid 用户名,它是一个字符串
* @param secretKey 计算签名用的加密密钥
* <p>
* step1. 进入腾讯云实时音视频[控制台](https://console.cloud.tencent.com/rav ),如果还没有应用就创建一个,
* step2. 单击您的应用,并进一步找到“快速上手”部分。
* step3. 点击“查看密钥”按钮,就可以看到计算 UserSig 使用的加密的密钥了,请将其拷贝并复制到如下的变量中
* <p>
* 注意:该方案仅适用于调试Demo,正式上线前请将 UserSig 计算代码和密钥迁移到您的后台服务器上,以避免加密密钥泄露导致的流量盗用。
* 文档:https://cloud.tencent.com/document/product/647/17275#Server
* @param startVideo 是否开启视频
* @param previewViewParams 预览窗口位置参数,localViewRotation 本地图像的顺时针旋转角度,参数只能是0,90,180,270
* 比如 {"localViewX":0,"localViewY":100,"localViewWidth":500,"localViewHeight":500,"remoteViewX":0,
* "remoteViewY":500,"remoteViewWidth":300,"remoteViewHeight":300}
* @return 0:无错误 10401:预览窗口位置参数无效
*/
@JavascriptInterface
public int joinRoom(int sdkAppId, int roomId, String uid, String secretKey, boolean startVideo, String previewViewParams)
/**
* 离开房间
* <br>
* 调用 exitRoom() 接口会执行退出房间的相关逻辑,例如释放音视频设备资源和编解码器资源等。 待资源释放完毕,SDK 会通过 TRTCCloudListener 中的 onExitRoom() 回调通知到您。
* <br>
* 如果您要再次调用 enterRoom() 或者切换到其他的音视频 SDK,请等待 onExitRoom() 回调到来之后再执行相关操作。 否则可能会遇到摄像头或麦克风被占用等各种异常问题,例如常见的 Android 媒体音量和通话音量切换问题等等
*/
@JavascriptInterface
public void exitRoom()
/**
* 暂停/恢复推送本地的视频数据
* <br>
* 当暂停推送本地视频后,房间里的其它成员将会收到 onUserVideoAvailable(userId, false) 回调通知 当恢复推送本地视频后,房间里的其它成员将会收到 onUserVideoAvailable(userId, true) 回调通知
*
* @param mute true:暂停;false:恢复
*/
@JavascriptInterface
public void muteLocalVideo(boolean mute)
/**
* 开启本地视频的预览画面,并将采集到的画面编码并发送出去
* <br>
* 当开始渲染首帧摄像头画面时,您会收到 TRTCCloudListener 中的 onFirstVideoFrame(null) 回调。
*/
@JavascriptInterface
public void startLocalPreview()
/**
* 停止本地视频采集及预览
*/
@JavascriptInterface
public void stopLocalPreview()
/**
* 设置 SDK 采集音量
*
* @param volume 音量大小,取值0 - 100,默认值为100
*/
@JavascriptInterface
public void setAudioCaptureVolume(int volume)
/**
* 设置 SDK 播放音量
* <br>
* 该函数会控制最终交给系统播放的声音音量,会影响录制本地音频文件的音量大小,但不会影响耳返的音量。
*
* @param volume 音量大小,取值0 - 100,默认值为100
*/
@JavascriptInterface
public void setAudioPlayoutVolume(int volume)
事件通知
// 报错 content为错误码
android('{"name":"trtcEvent","action":"onError","content":""}')
// 进入房间 content > 0 时为进房耗时(ms),content < 0 时为进房错误码
android('{"name":"trtcEvent","action":"onEnterRoom","content":""}')
// 远端用户是否存在可播放的音频数据 content为用户标识
android('{"name":"trtcEvent","action":"onUserAudioAvailable","content":""}')
// 远端用户是否存在可播放的主路画面 content为用户标识
android('{"name":"trtcEvent","action":"onUserVideoAvailable","content":""}')
// 离开房间的事件回调 content为离开房间原因,0:主动调用 exitRoom 退房;1:被服务器踢出当前房间;2:当前房间整个被解散
android('{"name":"trtcEvent","action":"onExitRoom","content":""}')
// 远端用户加入房间 content为用户标识
android('{"name":"trtcEvent","action":"onRemoteUserEnterRoom","content":"uid"}')
// 远端用户离开房间 content为用户标识
android('{"name":"trtcEvent","action":"onRemoteUserLeaveRoom","content":"uid"}')
存储签到信息相关
/**
* 插入签到数据
* @param signData json格式的签到数据
*/
@JavascriptInterface
public void insertSignData(String signData)
/**
* 删除指定时间点之前的数据
* @param timestamp 时间戳
*/
@JavascriptInterface
public void deleteSignLessThanTime(long timestamp)
/**
* 加载所有签到数据,由于Android和页面之间无法传递大量数据
* 获取所有签到数据之前需要提前加载
*/
@JavascriptInterface
public void loadAllSigns()
/**
* 获取所有签到数据
* @return json格式的签到数据
*/
@JavascriptInterface
public String getAllSigns()
事件通知
// 插入签到数据,content非0为插入失败,此时content表示报错信息
android('{"name":"signData","action":"insert","content":"0"}')
// 删除签到数据,content非0为删除失败,此时content表示报错信息
android('{"name":"signData","action":"deleteSignLessThanTime","content":"0"}')
// 加载所有签到数据,content非0为加载失败,此时content表示报错信息
android('{"name":"signData","action":"loadAllSigns","content":"0"}')
摄像头检测
针对北京交大 3288 设备 USB 摄像头总挂载不上的问题,增加了一块 USBHUB,可以通过串口控制 USB 断电重启。目前是 10s 检测一次,如果检测到摄像头未挂载会通知页面并给 USB 断电,断电指令发送 3s 后发送关狗指令用来给 USB 上电。
如果多次检测都发现摄像头未挂载,每失败一次断电时长加 2s,最长断电间隔 9s。连续失败 5 次后重启设备,并把重启时间记录到 /sdcard/shine/reboot.log 文件中。
事件通知
// video0摄像头状态;content为当前状态,true:video0摄像头挂载,false:video0摄像头未挂载
android('{"name":"video0State","action":"video0State","content":"true"}')
浏览器相关
/**
* 加载页面
*
* @param url 页面地址
*/
@JavascriptInterface
public void loadUrl(String url)
/**
* reload页面
*/
@JavascriptInterface
public void reload()
/**
* 预览浏览器打开url
* 会单独打开一个窗口加载url
* @param url 页面url
* @param x 预览窗口x轴位置
* @param y 预览窗口y轴位置
* @param width 预览窗口宽度
* @param height 预览窗口高度
* @return 是否打开成功
*/
@JavascriptInterface
public boolean openUrlInPreviewWebView(String url, int x, int y, int width, int height)
/**
* 预览浏览器返回上一页
*/
@JavascriptInterface
public void clickBackInPreviewWebView()
/**
* 关闭预览浏览器
*/
@JavascriptInterface
public void closePreviewWebView()
//副屏异显
public void loadJSWebPresentation(String url)
串口相关
/**
* 发送串口设备控制指令
*
* @param type 设备类型:
* 7-串口灯
* 班牌串口灯蓝色灯测试数据:DD55EE000000010099010000003600010000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFAABB
* 独立串口灯蓝灯控制协议:7E0101010000000000FF80AA
* 独立串口灯红灯控制协议:7E01010200000000FF0083AA
* 独立串口灯绿灯控制协议:7E010103000000FF000082AA
* 独立串口灯白灯控制协议:7E0101040000000000FF85AA
* 独立串口灯关灯控制协议:7E0101050000000000007BAA
* @param command 指令
*/
@android.webkit.JavascriptInterface
public void sendSerialDeviceControlCommand(int type, String command)
GPIO 相关
/**
* 设置 gpio 模式
* @param gpio gpio 号
* @param value 0:输入模式 1:输出模式
*/
public void setGpioDirection(int gpio, int value)
/**
* 设置 gpio 值
* @param gpio gpio 号
* @param value 0:低电平 1:高电平
*/
public void writeGpioValue(int gpio, String value)
摄像头扫描相关
/**
* 开始扫码,扫描成功后会通过js回调函数返回扫描结果,回调函数名为android,参数为json格式的扫描结果,格式如下:
* {"name":"cardCode","action":"cardCode","content":[1231231],"type":"scanqrcode","code":"0"}
*
* @param x 扫码框的x坐标
* @param y 扫码框的y坐标
* @param width 扫码框的宽度
* @param height 扫码框的高度
*/
public void startScan(int x, int y, int width, int height)
/**
* 停止扫码
*/
public void stopScan()
重启应用
void relaunchApp()
关机通知
// 设备会在关机前5s发送关机通知
android('{"name":"onShutdown","action":"onShutdown"}')
5V 电源控制
/**
* 重启 5V 电源
*/
windows.CallObject.reset5VPower()
/**
* 关闭 5V 电源
*/
windows.CallObject.close5VPower()
/**
* 打开 5V 电源
*/
windows.CallObject.open5VPower()