2012-12-07 22 views
5

Fotoğraf makinesinin önizleme çerçevelerini bir yüzeye sahip bir uygulamam var. Android 4.0.4 üzerinde çalışıyordu ancak güncelleme sonrasında aynı cihazda Jelly Bean, 4.1.2 ile çalışmıyor. Basitçe, geri arama asla geri çağrılmaz. İşte kod: biraz snipped:Android Camera Preview Geri çağrılmadı 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) { 
      } 
     } 
    } 
} 

video kareleri aktivite görüntülenen ediliyor, bu yüzden ben yanlış yapıyorum anlamaya olamaz.

+0

Yüzünüz işleniyor mu? – spartygw

+0

Üzgünüz, kodu uzun zaman önce değiştirdim, şimdi emin değilim. – Mustafa

cevap

4

Kodu başka bir eğitici kullanarak yeniden yazdım. Çalışıyor, ama şimdi daha yavaş. Ben

CameraPreview.java (bu, 4.1 farklı uygulanmıştır emin değildir kullandığım sızan N7000 ROM nedeniyle, bir hata olabilir nedeniyle olabilir veya olabilir) tam nedenini bilmiyoruz

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

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

}