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

时间:2017-03-30 12:43:51

标签: android c++ camera unreal-engine4

问题背景

我正在开发虚幻引擎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 %}

1 个答案:

答案 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);
    }

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