2012-12-07 15 views
5

Mam aplikację, aby uzyskać ramki podglądu kamery z powierzchnią. Pracował na systemie Android 4.0.4, ale nie działa z Jelly Bean, 4.1.2 na tym samym urządzeniu po aktualizacji. Po prostu wywołanie zwrotne nigdy nie jest wywoływane. Oto kod: snipped trochę:Podgląd kamery AndroidOdwołanie nie wywołano w 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) { 
      } 
     } 
    } 
} 

klatek wideo są wyświetlane na działalność, więc nie mogę dowiedzieć się, co robię źle.

+0

Czy twoja powierzchnia została wywołana? – spartygw

+0

Niestety, zmieniłem kod dawno temu, nie jestem teraz pewien. – Mustafa

Odpowiedz

4

Przepisałem kod za pomocą innego samouczka. Działa, ale teraz wolniej. Nie znam dokładnej przyczyny (może to być spowodowane przeciekły N7000 ROM używam, może mieć błąd lub ten jest realizowany w różny sposób w 4.1, nie jestem pewien)

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

} 
Powiązane problemy