09 摄像机预览功能API - MiEcosystem/NewXmPluginSDK GitHub Wiki
摄像机预览功能API
落地页视频接入
首页顶部第三屏的“我的智能摄像机”。
更新MessageReceiver类
处理MSG_INIT_CAMERA_FRAME_SENDER, MSG_STAR_REQUEST_CAMERA_FRAME和MSG_STOP_REQUEST_CAMERA_FRAME和MSG_DESTROY_REQUEST_CAMERA_FRAME
- MSG_INIT_CAMERA_FRAME_SENDER:初始化发送数据流通道,请调用XmPluginHostApi.initCameraFrameSender
- MSG_REQUEST_CAMERA_FRAME:开始请求视频流
- MSG_STOP_CAMERA_FRAME:停止请求视频流
- MSG_DESTROY_REQUEST_CAMERA_FRAME:关闭发送通道,请调用XmPlguinHostApi.closeCameraFrameSender
请求视频格式会在intent中
int frameRate = intent.getIntExtra("request_frame_rate", 0); //0代表自动,1代表480p,2代表720p,3代表1080p
boolean isMute = intent.getBooleanExtra("mute", false);//true代表mute
开始请求数据之后,音频流由米家扩展程序负责播放,然后将视频流发送给APP。
public class MessageReceiver implements IXmPluginMessageReceiver {
public static final String MODEL = "xiaomi.demo.v1";
@Override
public boolean handleMessage(Context context, XmPluginPackage xmPluginPackage, int type,
Intent intent,
DeviceStat deviceStat) {
switch (type) {
case LAUNCHER: {// 启动入口
XmPluginHostApi.instance().startActivity(context, xmPluginPackage, intent,
deviceStat.did, MainActivity.class);
return true;
}
case MSG_INIT_CAMERA_FRAME_SENDER: {
CameraFrameManager.instance().initCameraFrameSender(xmPluginPackage, deviceStat);
return true;
}
case MSG_STAR_REQUEST_CAMERA_FRAME: {
//开始请求视频流数据,如果视频流已经开启,则需要根据intent调整视频格式和音量
CameraFrameManager.instance().startRequestData(xmPluginPackage, deviceStat, intent);
return true;
}
case MSG_STOP_REQUEST_CAMERA_FRAME: {
CameraFrameManager.instance().stopPlay(xmPluginPackage, deviceStat);
return true;
}
case MSG_DESTROY_REQUEST_CAMERA_FRAME: {
CameraFrameManager.instance().stopRequestData(xmPluginPackage, deviceStat);
return true;
}
default:
break;
}
return false;
}
@Override
public boolean handleMessage(Context context, XmPluginPackage xmPluginPackage, int type,
Intent intent, DeviceStat deviceStat, MessageCallback callback) {
// TODO Auto-generated method stub
return false;
}
}
实现发送逻辑
调用XmPluginHostApi实现发送逻辑 在发送之前一定要调用initCameraFrameSender。
/**
* ApiLevel: 36
* 初始化相机发送通道
*/
public abstract void initCameraFrameSender(String did);
/**
* ApiLevel: 36
* 摄像机设备发送video接口
* isIFrame 当前264帧是否为i frame
*/
public abstract void sendCameraFrame(String did, byte[] data, long seq, int frameSize, long timestamp, boolean isIFrame, int width, int height);
/**
* ApiLevel: 36
* 关闭发送通道
*/
public abstract void closeCameraFrameSender(String did);
实现悬浮窗逻辑
使用悬浮窗之前,需要先实现数据流获取。
在米家扩展程序中点击视频悬浮窗之后,首先需要判断是否有悬浮窗权限,6.0之前默认添加,6.0之后用Settings.canDrawOverlays 之后调用XmPluginHostApi.openCameraFloatingWindow开启悬浮窗,最后finish自己的主activity。
当进入米家扩展程序时,需要先调用closeCameraFloatingWindow来关闭悬浮窗。
app验证方法
把设备model上报给我,我在云端配置之后,本地debug安装的就可以调试了。
米家扩展程序上线时,需要把packageId提供给我,云端配置之后就用户就可以在app上看到。