tag 标签: surfaceview

相关博文
  • 热度 20
    2012-12-14 13:16
    5777 次阅读|
    0 个评论
    問題1: 如何將camera surfaceview 顯示在最上層:用了this.setZOrderOnTop(true);這個方法 問題2: 如何用一個BUTTON來自由控制camera 可以出現預覽效果或者取消預覽效果,但是仍然能得到camera 回調數據 方法是:         lleftLayout.removeView(cameraPreview);         cameraPreview.setZOrderOnTop(true/false);///這個方法將當前的camera surface 帶到最上層         lleftLayout.addView(cameraPreview);   問題3: 如果出現以下異常: 04-09 12:51:30.475: E/AndroidRuntime(3980): FATAL EXCEPTION: main 04-09 12:51:30.475: E/AndroidRuntime(3980): java.lang.RuntimeException: Method called after release() 04-09 12:51:30.475: E/AndroidRuntime(3980):  at android.hardware.Camera.setHasPreviewCallback(Native Method) 04-09 12:51:30.475: E/AndroidRuntime(3980):  at android.hardware.Camera.access$600(Camera.java:120) 04-09 12:51:30.475: E/AndroidRuntime(3980):  at android.hardware.Camera$EventHandler.handleMessage(Camera.java:617) 主要引起是因為在 camera.stopPreview();   camera.release(); 前沒有將setPreviewCallback 設置為null, 解決情況: public void surfaceDestroyed(SurfaceHolder holder) {   camera.setPreviewCallback(null) ;   camera.stopPreview();   camera.release();   camera = null;   Log.e("CameraPreview", "sufaceDestroyed---------camera release");  } //////////////////////////////////////////////////////////////////////////////////////////// 直接上原碼: package com.test.surfaceview; import java.io.IOException; import java.util.List; import android.content.Context; import android.hardware.Camera; import android.hardware.Camera.PreviewCallback; import android.util.Log; import android.view.SurfaceHolder; import android.view.SurfaceView; public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback ,PreviewCallback{  SurfaceHolder mHolder;  private Camera camera;  public CameraPreview(Context context) {   super(context);   mHolder = getHolder();   mHolder.addCallback(this);   mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);  }   public void surfaceCreated(SurfaceHolder holder) {   camera = Camera.open();   camera.setPreviewCallback(this);   try {    camera.setPreviewDisplay(holder);   } catch (IOException exception) {    camera.release();    camera = null;   }  }  public void surfaceDestroyed(SurfaceHolder holder) {   camera.setPreviewCallback(null) ;   camera.stopPreview();   camera.release();   camera = null;   Log.e("CameraPreview", "sufaceDestroyed---------camera release");  }  public void surfaceChanged(SurfaceHolder holder, int format, int w,    int h) {   Camera.Parameters parameters = camera.getParameters();   ListCamera.Size lSize = parameters.getSupportedPreviewSizes();   Log.i("size", "width="+lSize.get(0).width+",height="+lSize.get(0).height); //  parameters.setPreviewSize(200, 200);   camera.setParameters(parameters);   camera.startPreview();  }  @Override  public void onPreviewFrame(byte[] arg0, Camera arg1) {   // TODO Auto-generated method stub   Log.d("CameraPreview","-------onPreviewFrame------");  } } -------------------------------------------------------- package com.test.surfaceview;   import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.util.Log; import android.view.SurfaceHolder; import android.view.SurfaceView; public class OtherSurfaceView extends SurfaceView {  Canvas canvas;  private SurfaceHolder mHolderControl=null;  public OtherSurfaceView(Context context) {   super(context);    mHolderControl=this.getHolder();    mHolderControl.addCallback(new SurfaceHolder.Callback(){    @Override    public void surfaceChanged(SurfaceHolder holder, int format,      int width, int height) {     // TODO Auto-generated method stub         }    @Override    public void surfaceCreated(SurfaceHolder holder) {     // TODO Auto-generated method stub     draw();    }    @Override    public void surfaceDestroyed(SurfaceHolder holder) {     // TODO Auto-generated method stub         }});   // TODO Auto-generated constructor stub  }  private void draw(){   Log.d("TAG", "---------------");   canvas=mHolderControl.lockCanvas();   if(mHolderControl == null || canvas == null){    return;   }   ----------------------------------------------------------------------   package com.test.surfaceview; import android.app.Activity; import android.os.Bundle; import android.widget.FrameLayout; import android.widget.FrameLayout.LayoutParams; import android.widget.LinearLayout; public class TestMultiSurfaceviewActivity extends Activity {     /** Called when the activity is first created. */  private Button btSwitchBlue=null;  private boolean bShowCamera = true;  private  LinearLayout lleftLayout;  private CameraPreview cameraPreview;     @Override     public void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);        // setContentView(R.layout.main);         FrameLayout lLayout =new FrameLayout(this); //        LayoutParams lp = new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT); //        //        lLayout.setLayoutParams(lp);         this.addContentView(lLayout,new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT));                         lleftLayout =new LinearLayout(this);         LinearLayout.LayoutParams lpCamera =  new LinearLayout.LayoutParams(300,400);       //  lpCamera.weight = 1;         lleftLayout.setLayoutParams(lpCamera);         lLayout.addView(lleftLayout);                 cameraPreview = new CameraPreview(this);         cameraPreview.setZOrderOnTop(true);         lleftLayout.addView(cameraPreview);                 lLayout.bringChildToFront(lleftLayout);                                         LinearLayout lrightLayout =new LinearLayout(this);         LinearLayout.LayoutParams lpOther =  new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT);        // lpOther.weight = 1;         lLayout.addView(lrightLayout);                 OtherSurfaceView otherSurfaceView = new OtherSurfaceView(this);         otherSurfaceView.setLayoutParams(lpOther);         lrightLayout.addView(otherSurfaceView);                         //btSwitchBlue.findViewById(R.id.show);         btSwitchBlue = new Button(this);                   btSwitchBlue.setText("hide");          FrameLayout.LayoutParams lpbutton =  new FrameLayout.LayoutParams(120,80);          lpbutton.gravity = Gravity.BOTTOM | Gravity.RIGHT;          btSwitchBlue.setLayoutParams(lpbutton);          btSwitchBlue.setOnClickListener(new OnClickListener(){    @Override    public void onClick(View v) {     if (!bShowCamera)    {           lleftLayout.removeViewInLayout(cameraPreview);         cameraPreview = new CameraPreview(TestMultiSurfaceviewActivity.this);         cameraPreview.setZOrderOnTop(true);         /*lrightLayout.removeView(otherSurfaceView);         cameraPreview.setZOrderOnTop(true);         lrightLayout.addView(otherSurfaceView);*/         bShowCamera = true;                  lleftLayout.addView(cameraPreview);        // camera.startPrevie();         //lLayout.bringChildToFront(lrightLayout);                  btSwitchBlue.setText("hide");          }        else if(bShowCamera){                  lleftLayout.removeViewInLayout(cameraPreview);         cameraPreview = new CameraPreview(TestMultiSurfaceviewActivity.this);         cameraPreview.setZOrderOnTop(false);         lleftLayout.addView(cameraPreview);         bShowCamera = false;         btSwitchBlue.setText("show");        }         }});          //btSwitchBlue.setBackgroundColor(Color.RED);          lLayout.addView(btSwitchBlue);     }    }