2016-04-21 12 views
0

對不起,我的英語。我有activity1activity2。在activity1我有按鈕,當我點擊這個按鈕時,這個按鈕會凍結幾秒鐘,然後打開activity2。點擊activity1中的按鈕時,要刪除凍結,我添加了啓動相機的代碼,新的runOnUiThread,但現在不叫surfaceCreated在新的運行中在表面中添加攝像頭對象時,未調用surfaceCreatedOnUiThread

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(); 
    } 
} 

回答

0

這是預期的行爲,該SurfaceSurfaceView維持,作爲一種解決方法,你可以檢查面是有效的,並具有非0 dimentions和手動調用您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 
    } 
} 
相關問題