2012-12-07 38 views
5

में नहीं बुलाया गया है मेरे पास एक सतह के साथ कैमरा पूर्वावलोकन फ्रेम प्राप्त करने के लिए एक आवेदन है। यह एंड्रॉइड 4.0.4 पर काम कर रहा था लेकिन यह अपडेट के बाद उसी डिवाइस पर जेली बीन, 4.1.2 के साथ काम नहीं करता है। बस, कॉलबैक कभी वापस नहीं कहा जाता है। यहाँ कोड है: एक छोटा सा कतरना:एंड्रॉइड कैमरा पूर्वावलोकन कॉलबैक 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) { 
      } 
     } 
    } 
} 

वीडियो फ्रेम गतिविधि पर प्रदर्शित किया जा रहा है, तो मैं समझ नहीं मैं गलत क्या कर रहा हूँ।

+0

क्या आपकी सतह को कॉल किया जा रहा है? – spartygw

+0

क्षमा करें, मैंने बहुत समय पहले कोड बदल दिया है, मुझे अब यकीन नहीं है। – Mustafa

उत्तर

4

मैंने एक और ट्यूटोरियल का उपयोग करके कोड को फिर से लिखा है। यह काम करता है, लेकिन अब धीमा। मैं सही कारण पता नहीं है (यह जा वजह से लीक N7000 रोम करने के लिए मैं उपयोग करें, यह एक बग हो सकता है या यह अलग ढंग से 4.1 में, यकीन नहीं लागू किया गया है हो सकता है)

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

}