【问题标题】:When power button on Android Tablet is pressed, surface view camera freezes and does not release按下 Android 平板电脑上的电源按钮时,表面视图相机冻结并且不释放
【发布时间】:2015-05-29 08:06:10
【问题描述】:

当我的应用程序打开并按下电源Button 并重新打开平板电脑时,Camera 挂起。我再次尝试在onResume() 方法上设置 SurfaceView 摄像头,但无法解决问题并尝试启动(camera1.startpreview()),但我仍然面临同样的问题。

我的 Surface View 的摄像头代码是:

SurfaceView cameraPreview1;
SurfaceHolder previewHolder1;
public static  Camera camera2;
boolean inPreview;

@Override
protected void onCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  inPreview = false;

  cameraPreview1 = (SurfaceView)findViewById(R.id.cameraPreview1);
  previewHolder1 = cameraPreview1.getHolder();
  previewHolder1.addCallback(surfaceCallback);
  previewHolder1.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

 }
@Override
    public void onResume() {
      super.onResume();


      camera2=Camera.open(1);
      mPicture1 = getPictureCallback();


    }

    @Override
    public void onPause() {


      super.onPause();
        //when on Pause, release camera in order to be used from other applications

        releaseCamera();
    }

    private void releaseCamera() {
        // stop and release camera
        if (camera2 != null) {
            camera2.release();
            camera2 = null;
        }
    }

     SurfaceHolder.Callback surfaceCallback=new SurfaceHolder.Callback() {
        public void surfaceCreated(SurfaceHolder holder) {
            try {
                camera2.setPreviewDisplay(previewHolder1);  
            }
            catch (Throwable t) {
                Log.e(TAG, "Exception in setPreviewDisplay()", t);
            }
        }

        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
            Camera.Parameters parameters=camera2.getParameters();
            Camera.Size size=getBestPreviewSize(width, height, parameters);

            if (size!=null) {
                parameters.setPreviewSize(size.width, size.height);
                camera2.setParameters(parameters);
                camera2.startPreview();
                inPreview=true;
            }
    }

        public void surfaceDestroyed(SurfaceHolder holder) {
            // not used

        }

【问题讨论】:

    标签: android android-camera


    【解决方案1】:

    您在surfaceCreated() 中调用setPreviewDisplay(),但是当您使用电源按钮(see notes here)关闭并重新打开屏幕时,表面不一定会被破坏和重新创建。我认为相机没有挂起,我认为它只是没有将预览帧发送到 Surface,因为surfaceCreated() 没有被第二次调用。

    解决这个问题的方法是通过在surfaceCreated() 中设置一个静态变量并在surfaceDestroyed() 中清除它来检测Surface 是否已经创建。如果输入 onResume() 时 Surface 已经设置好,则需要在新的 Camera 对象上调用 setPreviewDisplay()。

    Grafika 的“texture from camera”活动演示了使用静态变量跟踪 Surface。 FWIW,Grafika 的“连续捕获”活动gets this wrong 也是如此。

    【讨论】:

      猜你喜欢
      • 2015-12-27
      • 2015-12-24
      • 2019-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多