You need to enable JavaScript to run this app.
文档中心
云手机

云手机

复制全文
下载 pdf
Android SDK
音视频控制接口
复制全文
下载 pdf
音视频控制接口
暂停​
描述:当 vePhoneEngine 处于播放状态时,调用 pause() 暂停从云机拉流,此时并不改变云机的运行状态。​
返回值:暂停成功会收到 onStreamPaused 的接口回调。​
​
// vePhoneEngine class ​
void pause()​
​
恢复​
描述:当 vePhoneEngine 处于暂停状态时,调用 resumePlay() 重新从云机拉流播放。​
返回值:恢复播放成功会收到 onStreamResumed 的接口回调。​
​
// vePhoneEngine class ​
void resume()​
​
静音开关​
描述:媒体流静音开关,及检查静音状态。​
​
// vePhoneEngine class ​
void muteAudio(boolean mute) //true: 静音; false: 开音。​
boolean isAudioMuted() //当前是否处在静音状态,返回:true: 静音;false: 开音。​
​
视频开关​
描述:媒体流视频开关,及检查视频状态。​
​
// vePhoneEngine class​
void muteVideo(boolean mute) //true: 停止播放视频流; false: 播放视频流。​
boolean isVideoMuted() //当前是否处在暂停状态,返回:true: 暂停; false:播放。​
​
调节本地播放和采集音量​
描述:调节客户端本地播放和采集音量。​
​
// AudioService class ​
int getLocalAudioPlaybackVolume() //获取客户端本地播放音量​
int setLocalAudioPlaybackVolume(int volume) //设置客户端本地播放音量,范围 [0,100]​
int setLocalAudioCaptureVolume(int volume) //设置采集客户端本地音量,范围 [0,100]​
​
设置音频 JitterBuffer 缓冲时长​
描述:设置(获取)音频 JitterBuffer 缓冲时长。​
​
接口名称​
接口描述​
setJitterBufferDelay(int delay, int duration)​
设置音频 JitterBuffer 缓冲时长:​
  • delay:音频 JitterBuffer 缓冲时长,单位:ms。当 delay<30ms 时,内部会处理成30以防止过低;可以通过设置 delay=0 使延迟时间恢复到正常值​
  • duration:平滑过渡时长,单位:ms,推荐设置为5000以上;该值越小,音频快放慢放现象越明显​
getJitterBufferDelay()​
获取音频 JitterBuffer 缓冲时长,返回:delay,单位:ms​
​
​
// AudioService class​
void setJitterBufferDelay(int delay, int duration); //设置音频JitterBuffer缓冲时长​
int getJitterBufferDelay(); //获取音频JitterBuffer缓冲时长​
​
设置音频输入输出源​
描述:设置或切换播放、采集音频的设备。​
  • 设置音频播放设备时,需要保证已开启音频数据发送,否则设置无效;​
  • 当使用蓝牙耳机进行音频采集、播放时,需要获取蓝牙权限。​
​
// AudioService class​
void setAudioPlaybackDevice(deviceId) //指定音频播放设备(系统喇叭、外接喇叭和耳机、有线外接播放器,蓝牙播放器等)​
​
开启/关闭音频数据发送​
描述:开启或关闭采集麦克风音频数据后发送给云机实例,进而注入到实例的 Android 系统中。注意: 需要开启麦克风使用权限。​
​
// AudioService class​
void onRemoteAudioStartRequest() //收到云机实例请求开始发送音频数据事件​
void onRemoteAudioStopRequest() //收到云机实例请求停止发送音频数据事件​
​
int startSendAudioStream() //获取麦克风权限后,采集并发送音频数据​
int stopSendAudioStream() //关闭音频数据发送,并且不进行音频采集​
​
音频注入状态​
描述:设置及获取音频注入状态,用于多端同时对同一个 pod 进行拉流的场景。​
​
接口名称​
接口描述​
setAudioInjectionState(boolean state)​
设置音频注入状态。​
参数:​
state:​
true:开启​
false:关闭​
返回值:​
0:调用成功​
-1:调用失败,DataChennel 为空​
getAudioInjectionState()​
获取音频注入状态。​
返回值:​
0:调用成功​
-1:调用失败,DataChennel 为空​
setAudioInjectionState(boolean state)​
设置音频注入状态监听器。​
参数:listener - 音频注入状态监听器,参看 AudioInjectionListener 说明​
​
​
// AudioService class​
int setAudioInjectionState(boolean state); //设置音频注入状态​
int getAudioInjectionState(); //获取音频注入状态​
void setAudioInjectionListener(AudioInjectionListener listener); //设置音频注入状态监听器​
​
AudioInjectionListener​
音频注入状态监听器​
​
interface AudioInjectionListener {​
/**​
* 音频注入状态改变的回调​
*​
* @param callUserId 改变音频注入状态的用户ID​
* @param state 音频注入状态 true:开启 false:关闭​
* @param code 错误码 0:成功 <0:失败​
* @param msg 错误信息​
*/​
void onAudioInjectionStateChanged(String callUserId, boolean state, int code, String msg);​
​
/**​
* 获取音频注入状态的结果回调​
*​
* @param state 音频注入状态 true:开启 false:关闭​
* @param code 错误码 0:成功 <0:失败​
* @param msg 错误信息​
*/​
void onGetAudioInjectionState(boolean state, int code, String msg);​
}​
​
音频自采集​
描述:设置音频数据的采集模式(自定义音频源或 SDK 内部采集音频),支持自采集音频数据。​
​
// AudioService class​
​
/**​
* 设置本地音频源类型​
* @param index 音频流索引​
* @param type 音频源类型​
* @return <code>-1</code>表示调用失败,<code>0</code>表示调用成功​
*/​
int setAudioSourceType(int index, int type);​
​
/**​
* 音频自采集推流接口​
* @param index 音频流索引​
* @param frame 音频帧​
* @return <code>-1</code>表示调用失败,<code>0</code>表示调用成功​
*/​
int pushExternalAudioFrame(int index, VeAudioFrame frame);​
​
/**​
* 发布本地音频,音频自采集需要调用此接口​
* @return <code>-1</code>表示调用失败,<code>0</code>表示调用成功​
*/​
int publishLocalAudio();​
​
/**​
* 取消发布本地音频,音频自采集需要调用此接口​
* @return <code>-1</code>表示调用失败,<code>0</code>表示调用成功​
*/​
int unpublishLocalAudio();​
​
​
接口名称​
接口描述​
setAudioSourceType(int index, int type)​
设置音频数据的采集模式​
参数:​
  • index:音频流索引​
  • 0(主流)​
  • 1(屏幕流)​
  • type:音频源类型​
  • 0(自定义采集音频源)​
  • 1(内部采集音频源)​
publishLocalAudio()​
发布本地音频,音频自采集需要调用此接口​
unpublishLocalAudio()​
取消发布本地音频,音频自采集需要调用此接口​
pushExternalAudioFrame(int index, VeAudioFrame frame)​
音频自采集推流接口(需要先调用 setAudioSourceType,将采集模式设置为自定义采集音频源,然后调用 publishLocalAudio 发布本地音频)​
参数:​
  • index:音频流索引​
  • frame:外部采集的音频流​
​
参考示例:​
​
private static class AudioRecordThread extends Thread {​
private final AudioRecord mAudioRecord;​
private static final int sampleRateInHz = VeAudioFrame.VeAudioSampleRate.AUDIO_SAMPLE_RATE_48000.value;​
private static final int samples = sampleRateInHz / 100;​
private static final int channelConfig = AudioFormat.CHANNEL_IN_MONO;​
private static final int audioFormat = AudioFormat.ENCODING_PCM_16BIT;​
private final int bufferSizeInBytes;​
private volatile boolean recording = true;​
private final AudioService mAudioService;​
​
@RequiresPermission(android.Manifest.permission.RECORD_AUDIO)​
private AudioRecordThread(AudioService audioService) {​
super("AudioRecordThread");​
mAudioService = audioService;​
if (channelConfig == AudioFormat.CHANNEL_IN_MONO) {​
bufferSizeInBytes = samples * 2;​
} else {​
bufferSizeInBytes = samples * 2 * 2;​
}​
mAudioRecord = new AudioRecord(​
MediaRecorder.AudioSource.MIC,​
sampleRateInHz,​
channelConfig,​
audioFormat,​
bufferSizeInBytes​
);​
}​
​
@Override​
public void run() {​
AudioDumper dumper = new AudioDumper();​
// 设置音频源为SDK外部采集​
mAudioService.setAudioSourceType(StreamIndex.MAIN, AudioSourceType.EXTERNAL);​
// 发布本地音频,需要先调用此接口才能调用后续的pushExternalAudioFrame​
mAudioService.publishLocalAudio();​
try {​
mAudioRecord.startRecording();​
byte[] audioBuffer = new byte[bufferSizeInBytes];​
int offset = 0;​
int ret = 0;​
VeAudioFrame frame = new VeAudioFrame(​
0,​
VeAudioFrame.VeAudioSampleRate.AUDIO_SAMPLE_RATE_48000,​
VeAudioFrame.VeAudioChannel.AUDIO_CHANNEL_MONO,​
ByteBuffer.allocateDirect(bufferSizeInBytes),​
0,​
VeAudioFrame.VeAudioFrameType.FRAME_TYPE_PCM16​
);​
outer:​
while (recording) {​
offset = 0;​
long startTime = System.currentTimeMillis();​
while (offset < bufferSizeInBytes && recording) {​
ret = mAudioRecord.read(audioBuffer, offset,bufferSizeInBytes - offset);​
if (ret < 0) {​
break outer;​
}​
offset += ret;​
}​
if (recording) {​
// Now we got audio frame data, deal with it.​
frame.timestamp_us = startTime;​
frame.dataSize = bufferSizeInBytes;​
frame.dataBuffer.clear();​
frame.dataBuffer.put(audioBuffer);​
frame.dataBuffer.flip();​
mAudioService.pushExternalAudioFrame(StreamIndex.MAIN, frame);​
​
}​
}​
} finally {​
mAudioRecord.stop();​
mAudioService.unpublishLocalAudio();​
// 可选:把音频输入源重新改回SDK内部采集​
mAudioService.setAudioSourceType(StreamIndex.MAIN, AudioSourceType.INTERNAL);​
}​
}​
}​
​
增大/减小音量​
描述:增大或减小云机设备音量。​
​
// vePhoneEngine class ​
void volumeUp()​
void volumeDown()​
​
更新画面渲染模式​
描述:更新视频流画面渲染模式。​
​
接口名称​
接口描述​
updateVideoRenderMode(int renderMode)​
设置视频流的渲染模式,renderMode 的枚举值为:​
  • 0:VIDEO_RENDER_MODE_FIT,等比缩放居中模式​
  • 画面等比缩放居中显示于 Container,当推流分辨率比例与 Container 比例一致时效果为全屏显示;​
  • 当推流分辨率与 Container 比例不一致时,效果为一个方向占满画布,另一个方向在两侧会有同等比例黑边;​
  • 无画面内容裁切​
  • 1:VIDEO_RENDER_MODE_FILL,非等比拉伸模式​
  • 非等比拉伸画面并充满整个 Container;​
  • 无画面内容裁切​
  • 2:VIDEO_RENDER_MODE_COVER,等比例缩放模式​
  • 画面短边撑满容器,长边被裁切;​
  • 可能有画面内容裁切​
​
参考示例:​
​
// vePhoneEngine class ​
​
public interface VideoRenderModeManager {​
/**​
*​
* @param `renderMode` 渲染模式​
* @return -1 当前设置不支持;-2 未连接实例/视频流状态异常; -3 画布异常; -4 内部错误;-5 参数错误​
*/​
int `update``VideoRenderMode(int renderMode)`;​
​
视频自采集​
描述:设置视频数据的采集模式(自定义视频源或 SDK 内部采集视频),支持自采集视频数据。​
​
// CameraManager class​
​
/**​
* 设置本地视频源类型​
* @param index 视频流索引​
* @param type 视频源类型​
* @return <code>-1</code>表示调用失败,<code>0</code>表示调用成功​
*/​
int setVideoSourceType(int index, int type);​
​
/**​
* 视频自采集推流接口​
* @param index 视频流索引​
* @param frame 视频帧​
* @return <code>-1</code>表示调用失败,<code>0</code>表示调用成功​
*/​
int pushExternalVideoFrame(int index, VeVideoFrame frame);​
​
/**​
* 发布本地视频,视频自采集需要调用此接口​
* @return <code>-1</code>表示调用失败,<code>0</code>表示调用成功​
*/​
int publishLocalVideo();​
​
/**​
* 取消发布本地视频,视频自采集需要调用此接口​
* @return <code>-1</code>表示调用失败,<code>0</code>表示调用成功​
*/​
int unpublishLocalVideo();​
​
​
接口名称​
接口描述​
setVideoSourceType(int index, int type)​
设置视频数据的采集模式​
参数:​
  • index:视频流索引​
  • 0(主流)​
  • 1(屏幕流)​
  • type:视频源类型​
  • 0(自定义采集视频源)​
  • 1(内部采集视频源)​
publishLocalVideo()​
发布本地视频,视频自采集需要调用此接口​
unpublishLocalVideo()​
取消发布本地视频,视频自采集需要调用此接口​
pushExternalVideoFrame(int index, VeVideoFrame frame)​
视频自采集推流接口(需要先调用 setVideoSourceType,将采集模式设置为自定义采集视频源,然后调用 publishLocalVideo 发布本地视频)​
参数:​
  • index:视频流索引​
  • frame:外部采集的视频流​
​
参考示例:​
​
// mVideoFrameProducer为视频帧生产者​
if (mVideoFrameProducer != null) {​
if (start) {​
// 开启视频推流,首先设置视频源为SDK外部采集​
mCameraManager.setVideoSourceType(StreamIndex.MAIN, VideoSourceType.EXTERNAL);​
// 发布本地视频,需要先调用此接口才能调用后续的pushExternalVideoFrame​
mCameraManager.publishLocalVideo();​
mVideoFrameProducer.mFrameConsumer = frame -> {​
if (mCameraManager != null) {​
mCameraManager.pushExternalVideoFrame(StreamIndex.MAIN, frame);​
}​
};​
mVideoFrameProducer.start(mRequestCameraId);​
​
} else {​
// 关闭视频推流​
mVideoFrameProducer.stop();​
// 可选:恢复视频源为SDK内部采集​
mCameraManager.setVideoSourceType(StreamIndex.MAIN, VideoSourceType.INTERNAL);​
// 取消发布本地视频​
mCameraManager.unpublishLocalVideo();​
}​
}​
​
Camera 注入​
描述:获取 CameraManager 对象,该对象支持发送本地视频流和监听云机请求本地摄像头的打开和关闭。​
​
接口名称​
接口描述​
getCameraManager()​
获取 CameraManager 对象​
​
​
// vePhoneEngine class ​
public @Nullable CameraManager getCameraManager()​
​
​
public interface CameraManager {​
​
int switchCamera(CameraId cameraId);​
​
int startVideoStream(CameraId cameraId);​
​
void stopVideoStream();​
​
void setRemoteRequestListener(RemoteCameraRequestListener remoteRequestListener);​
​
void setCameraManagerListener(CameraManagerListener cameraManagerListener);​
​
void setLocalVideoCanvas(SurfaceView surfaceView, RenderMode mode);​
​
void setLocalVideoMirrorMode(MirrorMode mode);​
​
void setVideoEncoderConfig(List<VideoStreamDescription> videoStreamDescriptions);​
​
void enableAutoMaxScreenBrightness(boolean enable);​
​
boolean isAutoMaxScreenBrightnessEnabled();​
​
int setVideoInjectionState(boolean state);​
​
int getVideoInjectionState();​
​
void setVideoInjectionListener(VideoInjectionListener listener);​
}​
​
​
接口名称​
接口描述​
switchCamera(CameraId cameraId)​
切换前后摄像头,用于中途切换​
参数:​
CameraId:FRONT(前置摄像头);BACK(后置摄像头)​
返回值:​
0:调用成功​
-1:调用失败(可能原因为尚未收到 onPlaySuccess 播放成功回调)​
startVideoStream(CameraId cameraId)​
开始指定摄像头采集并推流​
参数:​
CameraId:FRONT(前置摄像头);BACK(后置摄像头)​
返回值:​
0:调用成功​
-1:调用失败(可能原因为尚未收到 onPlaySuccess 播放成功回调)​
调用时机:​
在收到 RemoteCameraRequestListener 的方法​
onVideoStreamStartRequested 中去调用​
调用结果:​
CameraManagerListener 回调接口的​
onLocalVideoStateChanged 方法中会回调调用结果​
stopVideoStream()​
停止推流​
调用时机:​
在收到 RemoteCameraRequestListener 的方法​
onVideoStreamStopRequested 中去调用​
setRemoteRequestListener()​
设置监听云机请求打开本地摄像头的回调方法​
参数:​
RemoteCameraRequestListener:云机请求打开(关闭)摄像头​
setCameraManagerListener()​
设置监听当前推流状态和首帧采集​
参数:​
CameraManagerListener:监听调用 startVideoStream 的推流结果​
setLocalVideoCanvas(SurfaceView surfaceView, RenderMode mode)​
设置本地视频画面布局​
参数:​
  • 1:RENDER_MODE_HIDDEN(默认,视窗填满优先;缩放完成后,视频帧的一边长和视窗的对应边长一致,另一边长大于等于视窗对应边长)​
  • 2:RENDER_MODE_FIT(视频帧内容全部显示优先;缩放完成后,视频帧的一边长和视窗的对应边长一致,另一边长小于等于视窗对应边长)​
  • 3:RENDER_MODE_Fill(视频帧自适应画布;视频帧非等比缩放,直至画布被填满。在此过程中,视频帧的长宽比例可能会发生变化)​
setLocalVideoMirrorMode(MirrorMode mode)​
使用“前置摄像头”采集时,是否开启镜像翻转本地摄像头画面​
参数:​
  • 0:MIRROR_MODE_OFF(默认,不开启镜像翻转)​
  • 1:MIRROR_MODE_ON(开启镜像翻转)​
setVideoEncoderConfig(List<VideoStreamDescription> videoStreamDescriptions)​
根据客户端的网络情况以及接收端的网络情况以及订阅方式,配置本地视频编码质量参数​
参数:​
  • width(宽度)​
  • height(高度)​
  • frameRate(帧率)​
  • maxBitrate(最大码率)​
enableAutoMaxScreenBrightness(boolean enable)​
在开启前置摄像头进行视频采集时,设置是否自动调节屏幕至最大亮度。建议在 startVideoStream 前调用。​
参数:​
  • enable​
  • true:(默认值)自动调节屏幕亮度至最大;​
  • false:不自动调节屏幕亮度。​
关闭前置摄像头时,屏幕亮度会恢复至之前的亮度。​
boolean isAutoMaxScreenBrightnessEnabled()​
是否已设置自动调节屏幕至最大亮度​
  • 返回值:​
  • true:是;​
  • false:否。​
setVideoInjectionState(boolean state)​
视频注入功能开关​
参数:​
  • state:true(开启);false(关闭)​
返回值:​
0:调用成功​
-1:调用失败,引擎未初始化​
getVideoInjectionState()​
查询视频注入功能开关状态​
返回值:​
0:调用成功​
-1:调用失败,引擎未初始化​
setVideoInjectionListener(VideoInjectionListener listener)​
注册视频注入回调​
参数:​
listener:视频注入回调,参看 VideoInjectionListener 说明​
​
RemoteCameraRequestListener​
监听云机请求本地摄像头的打开和关闭。​
​
public interface RemoteCameraRequestListener {​
​
/**​
* 云机请求本地摄像头​
* @param CameraId:FRONT(前置摄像头);BACK(后置摄像头)​
*​
*/​
void onVideoStreamStartRequested(CameraId cameraId);​
​
/**​
* 云机关闭本地摄像头回调​
*/​
void onVideoStreamStopRequested();​
​
}​
​
CameraManagerListener​
监听本地推流状态。​
​
public interface CameraManagerListener {​
​
/**​
*​
* @param localVideoStreamState 枚举值:当前推流状态​
* @param errorCode 错误码​
*/​
void onLocalVideoStateChanged(LocalVideoStreamState localVideoStreamState, LocalVideoStreamError errorCode);​
​
/**​
* 第一帧被采集​
*/​
void onFirstCapture();​
​
}​
​
VideoInjectionListener​
监听视频注入状态​
​
interface VideoInjectionListener {​
/**​
* 视频注入状态改变的回调​
*​
* @param callUserId 改变视频注入状态的用户ID​
* @param state 视频注入状态 true:开启 false:关闭​
* @param code 错误码 0:成功 <0:失败​
* @param msg 错误信息​
*/​
void onVideoInjectionStateChanged(String callUserId, boolean state, int code, String msg);​
​
/**​
* 获取视频注入状态的结果回调​
*​
* @param state 视频注入状态 true:开启 false:关闭​
* @param code 错误码 0:成功 <0:失败​
* @param msg 错误信息​
*/​
void onGetVideoInjectionState(boolean state, int code, String msg);​
}​
​
监听本地推流状态。​
LocalVideoStreamState​
​
public enum LocalVideoStreamState {​
LOCAL_VIDEO_STREAM_STATE_STOPPED(0), ​
LOCAL_VIDEO_STREAM_STATE_RECORDING(1), ​
LOCAL_VIDEO_STREAM_STATE_ENCODING(2),​
LOCAL_VIDEO_STREAM_STATE_FAILED(3);​
}​
​
推流状态说明:​
​
状态码​
说明​
LOCAL_VIDEO_STREAM_STATE_STOPPED​
本地视频采集停止状态(默认初始状态)​
LOCAL_VIDEO_STREAM_STATE_RECORDING​
本地视频采集设备启动成功​
LOCAL_VIDEO_STREAM_STATE_ENCODING​
本地视频采集后,首帧编码成功​
LOCAL_VIDEO_STREAM_STATE_FAILED​
本地视频启动失败​
​
LocalVideoStreamError​
​
public enum LocalVideoStreamError {​
LOCAL_VIDEO_STREAM_ERROR_OK(0),​
LOCAL_VIDEO_STREAM_ERROR_FAILURE(1),​
LOCAL_VIDEO_STREAM_ERROR_DEVICE_NO_PERMISSION(2),​
LOCAL_VIDEO_STREAM_ERROR_DEVICE_BUSY(3),​
LOCAL_VIDEO_STREAM_ERROR_DEVICE_NOT_FOUND(4),​
LOCAL_VIDEO_STREAM_ERROR_CAPTURE_FAILURE(5),​
LOCAL_VIDEO_STREAM_ERROR_ENCODE_FAILURE(6);​
}​
​
错误码说明:​
​
错误码​
说明​
LOCAL_VIDEO_STREAM_ERROR_OK​
状态正常​
LOCAL_VIDEO_STREAM_ERROR_FAILURE​
本地视频流发布失败​
LOCAL_VIDEO_STREAM_ERROR_DEVICE_NO_PERMISSION​
没有权限启动本地视频采集设备​
LOCAL_VIDEO_STREAM_ERROR_DEVICE_BUSY​
本地视频采集设备被占用​
LOCAL_VIDEO_STREAM_ERROR_DEVICE_NOT_FOUND​
本地视频采集设备不存在或已移除​
LOCAL_VIDEO_STREAM_ERROR_CAPTURE_FAILURE​
本地视频采集失败,建议检查采集设备是否正常工作​
LOCAL_VIDEO_STREAM_ERROR_ENCODE_FAILURE​
本地视频编码失败​
​
参考代码​
​
// 在收到 IPlayerListener 的 onPlaySuccess 回调后,获取 CameraManager,监听远端请求,同时调用对应的方法​
​
@Override​
public void onServiceInit(@NonNull Map<String, Object> extras) {​
CameraManager mCameraManager = VePhoneEngine.getInstance().getCameraManager();​
mCameraManager.setRemoteRequestListener(new RemoteCameraRequestListener() {​
@Override​
public void onVideoStreamStartRequested(CameraId cameraId) {​
AcLog.d(TAG, "onVideoStreamStartRequested, cameraId :" + cameraId);​
mRequestCameraId = cameraId;​
// 注意:需要camera使用权限,请提前申请​
PermissionUtils.permission(Manifest.permission.CAMERA)​
.callback(new PermissionUtils.SimpleCallback() {​
@Override​
public void onGranted() {​
mCameraManager.startVideoStream(mRequestCameraId);​
}​
​
@Override​
public void onDenied() {​
// 提示用户使用摄像头注入功能需要授予camera使用权限​
}​
}).request();​
});​
VePhoneEngine.getInstance().getCameraManager().setCameraManagerListener(new CameraManagerListener() {​
@Override​
public void onLocalVideoStateChanged(LocalVideoStreamState localVideoStreamState, LocalVideoStreamError errorCode) {​
// 打印当前推流状态,用于排查问题​
AcLog.d(TAG, "LocalVideoStreamState" + localVideoStreamState.toString() + ",LocalVideoStreamError" + errorCode);​
}​
​
@Override​
public void onFirstCapture() {​
AcLog.d(TAG, "onFirstCapture");​
}​
});​
}​
​
​
最近更新时间:2026.05.14 14:54:37
这个页面对您有帮助吗?
有用
有用
无用
无用