【问题标题】:Not called surfaceCreated when add camera object in surface in new runOnUiThread在新的 runOnUiThread 中的表面中添加相机对象时不调用 surfaceCreated
【发布时间】:2016-04-21 11:34:10
【问题描述】:

对不起我的英语。我有activity1activity2。在activity1 我有按钮,当我单击此按钮时,此按钮会冻结几秒钟,然后打开activity2。为了在单击activity1 中的按钮时消除冻结,我添加了在新runOnUiThread 中启动相机但现在不称为surfaceCreated 的代码。

mPreview - 我的自定义surfaceView

mCamera - 物体相机

我的代码:

new Thread(new Runnable() {
    @Override
    public void run() {
        CameraActivity.this.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                mPreview.addCamera(mCamera);
                mPreview.addParent(CameraActivity.this);
                mCamera.getParameters().setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
                mPreview.refreshDrawableState();
                mCamera.startPreview();
            }
        });
    }
}).start();

我的客户SurfaceView(我只添加重要代码)

public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
    public CameraPreview (Context context){
        super(context);
    }
    public CameraPreview(Context context, AttributeSet attrs){
        super(context, attrs);
    }
    public CameraPreview(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public void addCamera(Camera camera){
            mCamera = camera;
            mHolder = getHolder();
            mHolder.addCallback(this);
            mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        try {

            mCamera.setPreviewDisplay(holder);
            mCamera.startPreview();

        } catch (IOException e) {
        }
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        try {
            if(mCamera!=null){
                mCamera.stopPreview();
                mCamera.setPreviewCallback(null);

                mCamera.release();
                mCamera = null;
            }
        } catch (Exception e){
                Toast.makeText(this.getContext(), e.getMessage(), Toast.LENGTH_LONG).show();
        }
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
    //code
    mCamera.startPreview();
    }
}

【问题讨论】:

    标签: android android-camera surfaceview


    【解决方案1】:

    这是预期的行为,SurfaceSurfaceView 维护,作为一种解决方法,您可以检查表面是否有效并且具有非 0 维度并手动调用您的 surfaceCreated/surfaceChanged函数

    你需要的代码:

    Surface surface = mHolder.getSurface();
    if(surface != null && surface.isValid()){
        Rect frame = mHolder.getSurfaceFrame();
        if(frame.width() > 0 && frame.height() > 0){
             surfaceCreated(mHolder);
             surfaceChaged(mHolder, PixelFormat.OPAQUE, frame.width(), frame.height()); //pixel format OPAQUE is the default one
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2023-03-28
      • 2012-08-07
      • 1970-01-01
      • 2021-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-16
      相关资源
      最近更新 更多