android.hardware.Camera 无法每隔 2 次打开一次

android.hardware.Camera fails to open every second time

本文关键字:一次 Camera hardware android      更新时间:2023-10-16

问题背景

我正在虚幻引擎4上开发一个VR项目,该项目需要使用Android的原生摄像机。由于UE4中没有内置函数来迭代Android的本机方法,因此我根据需要自定义了此插件。

原始插件使用 JNI 接口对C++代码进行迭代。它在UE4的EventBeginPlay上调用camera.open()camera.startPreview(),在UE4的EventEndPlay上调用camera.stopPreview()camera.Release()。由于这是一个已知问题,EventEndPlay永远不会在Android平台上启动,因此我决定以onResume()onPause()方法操纵相机。这是代码:

<gameActivityClassAdditions>
<insert>
/* Unrelevant code goes here */
...
...
/* End of unrelevant code */
public void AndroidThunkJava_startCamera()
{                        
surfaceTexture = new SurfaceTexture(10);
surfaceTexture.setDefaultBufferSize(preferredWidth, preferredHeight);
if (camera == null){
try {
camera = Camera.open();
} catch (RuntimeException exc) {
return;
}
}               
try {
camera.setPreviewTexture(surfaceTexture);
} catch (IOException t) {
return;
}
Parameters cameraParam = camera.getParameters();
cameraParam.setPreviewFormat(ImageFormat.NV21);
cameraParam.setPreviewSize(preferredWidth, preferredHeight);
cameraParam.setPreviewFpsRange(preferredFPS, preferredFPS);
cameraParam.setFocusMode(Camera.Parameters.FOCUS_MODE_MACRO);
if (cameraParam.isVideoStabilizationSupported()) {
cameraParam.setVideoStabilization(false);
}
if (cameraParam.isAutoWhiteBalanceLockSupported()) {
cameraParam.setAutoWhiteBalanceLock(false);
}
camera.setParameters(cameraParam);
camera.setPreviewCallback(new PreviewCallback() {
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
int Height = camera.getParameters().getPreviewSize().height;
int Width = camera.getParameters().getPreviewSize().width;
// calling C++ function via JNI interface
processFrameData(Width, Height, data);
}
});
camera.startPreview();
}
public void AndroidThunkJava_stopCamera()
{
if (camera != null)
{
camera.stopPreview();
camera.release();
camera = null;
}
}
</insert>
</gameActivityClassAdditions>
<gameActivityOnPauseAdditions>
<insert>
AndroidThunkJava_stopCamera();
</insert>
</gameActivityOnPauseAdditions>
<gameActivityOnResumeAdditions>
<insert>  
AndroidThunkJava_startCamera();
</insert>
</gameActivityOnResumeAdditions>

问题所在

相机每隔一段时间工作正常。这意味着:

我打开应用程序,相机正在工作。我按下了主页按钮(触发onPause()方法),然后切换回应用程序(触发onResume()方法)。再次按下主页按钮,然后切换回来 - 相机工作。 依此类推,相机每隔一段时间工作一次。

有人对这个问题有任何想法吗?这与android.hardware.Camera被弃用有关吗?我使用的是 API 版本 19,因此无法使用较新的android.hardware.camera2

这是我的onStop和onResume方法。我没有使用暂停。它完美地工作:

@Override
protected void onResume() {
super.onResume();
if (mCamera == null) {
restartPreview();
}
}
@Override
public void onStop() {
// stop the preview
if (mCamera != null) {
stopCameraPreview();
mCamera.release();
mCamera = null;
}
super.onStop();
}
private void restartPreview() {
if (mCamera != null) {
stopCameraPreview();
mCamera.release();
mCamera = null;
}

getCamera(mCameraID);
startCameraPreview();
}
private void startCameraPreview() {

try {
mCamera.setPreviewDisplay(mSurfaceHolder);
mCamera.startPreview();
setSafeToTakePhoto(true);
setCameraFocusReady(true);
} catch (IOException e) {
Log.d("st", "Can't start camera preview due to IOException " + e);
e.printStackTrace();
}
}
private void stopCameraPreview() {
setSafeToTakePhoto(false);
setCameraFocusReady(false);
// Nulls out callbacks, stops face detection
mCamera.stopPreview();
mPreviewView.setCamera(null);
}

也许有些实现不等于你的,但我认为它可以帮助你。