关于后台运行的话,应该自己建一个Service,在Service中用MediaRecoder录像。
但是有一个问题需要解决,需要改一下Android源码:
在得到android.hardware.Camera对象后,如果不给Camera设置SurfaceHolder的话,CameraService会报错:
mSurface or mPreviewWindow must be set before startRecordingMode.
可以暂时先把报错的地方 屏蔽掉,或许还有其他更好办法,我还没发现。
报错的地方在: \framework\base\services\camera\libcameraservice\CameraService.cpp
// start preview or recording
status_t CameraService::Client::startCameraMode(camera_mode mode) {
LOG1("startCameraMode(%d)", mode);
Mutex::Autolock lock(mLock);
status_t result = checkPidAndHardware();
if (result != NO_ERROR) return result;
switch(mode) {
case CAMERA_PREVIEW_MODE:
if (mSurface == 0 && mPreviewWindow == 0) {
LOG1("mSurface is not set yet.");
// still able to start preview in this case.
}
return startPreviewMode();
case CAMERA_RECORDING_MODE:
//zhaoch86 marked for usb camera background recording
/*
if (mSurface == 0 && mPreviewWindow == 0) {
LOGE("mSurface or mPreviewWindow must be set before startRecordingMode.");
return INVALID_OPERATION;
}
*/
return startRecordingMode();
default:
return UNKNOWN_ERROR;
}
}
如此,编译重新刷包后,就能实现后台录像!
但是有一个问题需要解决,需要改一下Android源码:
在得到android.hardware.Camera对象后,如果不给Camera设置SurfaceHolder的话,CameraService会报错:
mSurface or mPreviewWindow must be set before startRecordingMode.
可以暂时先把报错的地方 屏蔽掉,或许还有其他更好办法,我还没发现。
报错的地方在: \framework\base\services\camera\libcameraservice\CameraService.cpp
// start preview or recording
status_t CameraService::Client::startCameraMode(camera_mode mode) {
LOG1("startCameraMode(%d)", mode);
Mutex::Autolock lock(mLock);
status_t result = checkPidAndHardware();
if (result != NO_ERROR) return result;
switch(mode) {
case CAMERA_PREVIEW_MODE:
if (mSurface == 0 && mPreviewWindow == 0) {
LOG1("mSurface is not set yet.");
// still able to start preview in this case.
}
return startPreviewMode();
case CAMERA_RECORDING_MODE:
//zhaoch86 marked for usb camera background recording
/*
if (mSurface == 0 && mPreviewWindow == 0) {
LOGE("mSurface or mPreviewWindow must be set before startRecordingMode.");
return INVALID_OPERATION;
}
*/
return startRecordingMode();
default:
return UNKNOWN_ERROR;
}
}
如此,编译重新刷包后,就能实现后台录像!