问题已解决,发现public void onPreviewFrame(byte[] data, Camera camera) {}并不是所有机器都支持,我用的MID就不行。而且不同机器支持的data格式也不尽相同,例如moto里程碑就很标准,支持的是NV25.有点机器就是别的格式。
你把下面这个类设置成Activity的ContentView/** * The camera preview control. */ class Preview extends SurfaceView implements SurfaceHolder.Callback { /** * Display surface holder. */ private SurfaceHolder m_holder; /** * The camera object. */ private Camera m_camera; /** * The process running context. */ private TakePhoto m_context; /** * Constructor. * * @param context */ Preview(Context context) { super(context); m_context = (TakePhoto) context; m_holder = getHolder(); m_holder.addCallback(this); m_holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); } /** * This is called immediately after the surface is first created. * * @param holder The surface to display. */ @Override public void surfaceCreated(SurfaceHolder holder) { // start camera. m_camera = Camera.open(); try { m_camera.setPreviewDisplay(holder); } catch (IOException exception) { m_camera.release(); m_camera = null; } } /** * This is called immediately before a surface is being destroyed. * * @param holder The surface to destroy. */ @Override public void surfaceDestroyed(SurfaceHolder holder) { m_camera.stopPreview(); m_camera.release(); m_camera = null; } /** * This is called immediately after any structural changes (format or size) * have been made to the surface. * * @param holder The surface to display. * format The format of the picture. * w The width of the holder. * h The height of the holder. */ @Override public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { Camera.Parameters parameters = m_camera.getParameters(); parameters.setPictureFormat(PixelFormat.JPEG); parameters.setPreviewSize(getWidth(), getHeight()); m_camera.setParameters(parameters); m_camera.startPreview(); } /** * Taking photo. */ public void takePicture() { if (m_camera != null) { m_camera.takePicture(null, null, jpegCallback); } } /** * Output photos after taking. */ private PictureCallback jpegCallback = new PictureCallback() { public void onPictureTaken(byte[] _data, Camera _camera) { // 这里的_data就是你要的图片数据啦 } }; }然后在按键的响应事件中调用takePicture()即可
* 拍照的回调接口
*/
PictureCallback mPictureCallback = new PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
Log.v(“PictureCallback”, “…onPictureTaken…”);
if (data != null) {
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0,
data.length);
mImageView.setImageBitmap(bitmap);
mImageView.setVisibility(View.VISIBLE);
mSurfaceView.setVisibility(View.GONE);
if (mPreviewRunning) {
mCamera.stopPreview();
mPreviewRunning = false;
}
}
}
};
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/xiongyingzhuantu/archive/2010/12/11/6069454.aspx
谢谢提示,我想实现“比较连拍的两张图片的变化”,是不是每次都要把图片数据put到Intent中,然后通过程序获取出来进行比较处理?
public void onPreviewFrame(byte[] data, Camera camera) {}
代码一直没有被执行?PreviewCallback我已经设置了。
public void onPreviewFrame(byte[] data, Camera camera) {}
来动态处理每一帧数据?
比如一个像素点是顺序排放在byte[1] byte[2] byte[3] 这样排放的吗 ?
* The camera preview control.
*/
class Preview extends SurfaceView implements SurfaceHolder.Callback
{
/**
* Display surface holder.
*/
private SurfaceHolder m_holder; /**
* The camera object.
*/
private Camera m_camera; /**
* The process running context.
*/
private TakePhoto m_context; /**
* Constructor.
*
* @param context
*/
Preview(Context context)
{
super(context);
m_context = (TakePhoto) context; m_holder = getHolder();
m_holder.addCallback(this);
m_holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
} /**
* This is called immediately after the surface is first created.
*
* @param holder The surface to display.
*/
@Override
public void surfaceCreated(SurfaceHolder holder)
{
// start camera.
m_camera = Camera.open();
try
{
m_camera.setPreviewDisplay(holder);
}
catch (IOException exception)
{
m_camera.release();
m_camera = null;
}
} /**
* This is called immediately before a surface is being destroyed.
*
* @param holder The surface to destroy.
*/
@Override
public void surfaceDestroyed(SurfaceHolder holder)
{
m_camera.stopPreview();
m_camera.release();
m_camera = null;
} /**
* This is called immediately after any structural changes (format or size)
* have been made to the surface.
*
* @param holder The surface to display.
* format The format of the picture.
* w The width of the holder.
* h The height of the holder.
*/
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h)
{
Camera.Parameters parameters = m_camera.getParameters();
parameters.setPictureFormat(PixelFormat.JPEG);
parameters.setPreviewSize(getWidth(), getHeight());
m_camera.setParameters(parameters);
m_camera.startPreview();
} /**
* Taking photo.
*/
public void takePicture()
{
if (m_camera != null)
{
m_camera.takePicture(null, null, jpegCallback);
}
} /**
* Output photos after taking.
*/
private PictureCallback jpegCallback = new PictureCallback()
{
public void onPictureTaken(byte[] _data, Camera _camera)
{
// 这里的_data就是你要的图片数据啦
}
};
}然后在按键的响应事件中调用takePicture()即可