2012-12-07 29 views
5

Tôi có một ứng dụng để có được khung xem trước máy ảnh với một bề mặt. Nó hoạt động trên Android 4.0.4 nhưng nó không hoạt động với Jelly Bean, 4.1.2 trên cùng một thiết bị sau khi cập nhật. Đơn giản, gọi lại không bao giờ được gọi lại. Đây là đoạn mã: Đã cắt một chút:Android Camera PreviewCallback không được gọi trong 4.1

public class Panel extends Activity { 
    Camera myCamera; 
    int cameraId = -1; 
    MyCameraSurfaceView myCameraSurfaceView; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_panel); 

     myCamera = getCameraInstance(); 
     myCamera.setPreviewCallback(new Camera.PreviewCallback() { 
      @Override 
      public void onPreviewFrame(byte[] data, Camera camera) { 
       Log.d("Camera Preview", data.length + ""); 
      } 
     }); 

     myCameraSurfaceView = new MyCameraSurfaceView(this, myCamera); 
     FrameLayout myCameraPreview = (FrameLayout) findViewById(R.id.videoview); 
     myCameraPreview.addView(myCameraSurfaceView); 
    } 

    private Camera getCameraInstance() { 
     Camera c = null; 
     try { 
      c = Camera.open(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return c; 
    } 


    public class MyCameraSurfaceView extends SurfaceView implements 
      SurfaceHolder.Callback { 

     private SurfaceHolder mHolder; 
     private Camera mCamera; 

     public MyCameraSurfaceView(Context context, Camera camera) { 
      super(context); 
      mCamera = camera; 
      mHolder = getHolder(); 
      mHolder.addCallback(this); 
     } 

     @Override 
     public void surfaceCreated(SurfaceHolder holder) { 
      try { 
       mCamera.setPreviewDisplay(holder); 
       mCamera.startPreview(); 
      } catch (IOException e) { 
      } 
     } 
    } 
} 

Khung hình video đang được hiển thị trên hoạt động, vì vậy tôi không thể hiểu được mình đang làm gì sai.

+0

Bề mặt của bạnCó được gọi là không? – spartygw

+0

Xin lỗi, tôi đã thay đổi mã một thời gian dài trước đây, tôi không chắc chắn bây giờ. – Mustafa

Trả lời

4

Tôi đã viết lại mã bằng cách sử dụng một hướng dẫn khác. Nó hoạt động, nhưng bây giờ chậm hơn. Tôi không biết lý do chính xác (nó có thể được do bị rò rỉ N7000 ROM tôi sử dụng, nó có thể có một lỗi hoặc này được thực hiện khác nhau trong 4.1, không chắc chắn)

CameraPreview.java

public class CameraPreview implements SurfaceHolder.Callback, 
     Camera.PreviewCallback { 
    int PreviewSizeWidth; 
    int PreviewSizeHeight; 
    SurfaceHolder mSurfHolder; 
    Camera mCamera; 

    public CameraPreview(int PreviewlayoutWidth, int PreviewlayoutHeight) { 
     PreviewSizeWidth = PreviewlayoutWidth; 
     PreviewSizeHeight = PreviewlayoutHeight; 
    } 



    @Override 
    public void onPreviewFrame(byte[] data, Camera camera) { 
     Parameters p = camera.getParameters(); 
     int width = p.getPreviewSize().width; 
     int height = p.getPreviewSize().height; 

     ByteArrayOutputStream outstr = new ByteArrayOutputStream(); 
     Rect rect = new Rect(0, 0, width, height); 
     YuvImage yuvimage = new YuvImage(data, ImageFormat.NV21, width, 
       height, null); 
     yuvimage.compressToJpeg(rect, 80, outstr); // outstr contains image in jpeg 
     String encodedImage = Base64.encodeToString(
       outstr.toByteArray(), Base64.DEFAULT); // this is base64 encoding of image 


    } 

    @Override 
    public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) { 
     Parameters parameters; 
     mSurfHolder = arg0; 

     parameters = mCamera.getParameters(); 
     parameters.setPreviewSize(PreviewSizeWidth, PreviewSizeHeight); 

     mCamera.setParameters(parameters); 
     mCamera.startPreview(); 
    } 

    public void surfaceCreated(SurfaceHolder arg0) { 
     mCamera = Camera.open(); 
     try { 
      // If did not set the SurfaceHolder, the preview area will be black. 
      mCamera.setPreviewDisplay(arg0); 
      mCamera.setPreviewCallback(this); 
      Parameters p = mCamera.getParameters(); 
      p.setPreviewSize(PreviewSizeWidth, PreviewSizeHeight); 
      mCamera.setParameters(p); 
     } catch (IOException e) { 
      mCamera.release(); 
      mCamera = null; 
     } 
    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder arg0) { 
     mCamera.setPreviewCallback(null); 
     mCamera.stopPreview(); 
     mCamera.release(); 
     mCamera = null; 
    } 
} 

PanelActivity.java

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_panel); 


    SurfaceView camView = new SurfaceView(this); 
    SurfaceHolder camHolder = camView.getHolder(); 
    int width = 352; // must set a compatible value, otherwise it gets the default width and height 
    int height = 288; 

    camPreview = new CameraPreview(width, height); 

    camHolder.addCallback(camPreview); 
    camHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

    mainLayout = (FrameLayout) findViewById(R.id.videoview); 
    mainLayout.addView(camView, new LayoutParams(width, height)); 

}