我正在开发虚幻引擎4上的VR项目,该项目需要使用Android的原生相机。由于UE4中没有内置函数可以使用Android的原生方法进行迭代,因此我根据需要自定义了this plugin。
原始插件使用JNI接口迭代C ++代码。它在UE4的camera.open()
上呼叫camera.startPreview()
和EventBeginPlay
,并在UE4 camera.stopPreview()
上呼叫camera.Release()
和EventEndPlay
。由于EventEndPlay
onResume()
永远不会在Android平台上启动,因此我决定使用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
方法)。再次按下主页按钮,然后切换回来 - 相机正常工作。等等,相机每隔一段时间工作一次。
有人对这个问题有任何想法吗?这与android.hardware.camera2
被弃用的事实有关吗?我使用的是API版本19,因此无法使用较新的{% load staticfiles %}
。
答案 0 :(得分:2)
这是我的onStop和onResume方法。我没有使用onPause。它完美地运作:
@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);
}
也许某些实现不等于你的,但我认为它对你有帮助。