封装成Helper类,特此记载,也希望能帮助到后来者
实现接口中OnResult方法
定义了一个回调接口用于解码后输出结果,运行于新线程,如要进行UI操作自行调用Handler接口
public class CameraDecodeHelper implements SurfaceHolder.Callback, PreviewCallback {
// 回调接口
public interface Callback {
public void onResult(String reslut, String barFormat);
}
/**
* 自动对焦
*/
private Camera.AutoFocusCallback mAutoFocusCallBack = new Camera.AutoFocusCallback() {
@Override
public void onAutoFocus(boolean success, Camera camera) {
if (success) { // 对焦成功,回调Camera.PreviewCallback
mCamera.setOneShotPreviewCallback(previewCallback);
}
}
};
// 执行自动对焦后解码条码和二维码
private Camera.PreviewCallback previewCallback = new Camera.PreviewCallback() {
@Override
public void onPreviewFrame(final byte[] data, Camera arg1) {
// 如果是竖屏则旋转取得的对焦结果
new Thread(new Runnable() {
@Override
public void run() {
// TODO 自动生成的方法存根
Decode(data);
}
}).start();
}
};
private void Decode(byte[] data){
if (shuflag) {
byte[] rotatedData = new byte[data.length];
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++)
rotatedData[x * height + height - y - 1] = data[x + y
* width];
}
data = rotatedData;
}
// 取得指定范围的帧的数据
try {
PlanarYUVLuminanceSource source;
source = shuflag ? new PlanarYUVLuminanceSource(data, height,
width, 0, 0, height, width, false)
: new PlanarYUVLuminanceSource(data, width, height, 0,
0, width, height, false);
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(
source));
MultiFormatReader reader = new MultiFormatReader();
Result result = reader.decode(bitmap);
String reText = result.getText();
String barFormat = result.getBarcodeFormat().toString();
if (callback!=null) {
callback.onResult(reText, barFormat);
}
mTimer.cancel();
} catch (Exception e) {
}
}
// 开关闪光灯
public void setFlash() {
if (shanflag) {
Camera.Parameters parameter = mCamera.getParameters();
parameter.setFlashMode(Parameters.FLASH_MODE_OFF);
mCamera.setParameters(parameter);
shanflag = false;
} else {
Camera.Parameters parameter = mCamera.getParameters();
parameter.setFlashMode(Parameters.FLASH_MODE_TORCH);
mCamera.setParameters(parameter);
shanflag = true;
}
}
private SurfaceHolder holder = null;
private Camera mCamera;
private int width = 640;
private int height = 480;
private Callback callback;
private boolean shanflag = false;
private boolean shuflag = true;
private Timer mTimer;
public CameraDecodeHelper(SurfaceHolder mHolder, Camera arg,
boolean portrait, Callback c) {
this.holder = mHolder;
this.holder.addCallback(this);
this.holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
mTimer = new Timer();
mCamera = arg;
callback = c;
shuflag = portrait;
if (shuflag) {
mCamera.setDisplayOrientation(90);
}
}
@Override
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
Camera.Parameters parameters = mCamera.getParameters();
parameters.setPreviewSize(width, height);// 设置尺寸
parameters.setPictureFormat(PixelFormat.JPEG);
mCamera.setParameters(parameters);
mCamera.startPreview();// 开始预览
}
@Override
public void surfaceCreated(SurfaceHolder arg0) {
// mCamera = Camera.open();//启动服务
try {
mCamera.setPreviewDisplay(holder);// 设置预览
mCamera.setPreviewCallback(this);
} catch (IOException e) {
mCamera.release();// 释放
mCamera = null;
}
}
@Override
public void surfaceDestroyed(SurfaceHolder arg0) {
mCamera.setPreviewCallback(null);
mCamera.stopPreview();// 停止预览
holder.removeCallback(this);
}
// 启动自动对焦并回调
public void AutoFocusAndPreviewCallback(long when, long replay) {
if (mCamera != null) {
mTimer.schedule(new TimerTask() {
@Override
public void run() {
// TODO 自动生成的方法存根
mCamera.autoFocus(mAutoFocusCallBack);
}
}, when, replay);
}
}
//退出
public void exit(){
mTimer.cancel();
}
@Override
public void onPreviewFrame(final byte[] arg0, Camera arg1) {
// TODO 自动生成的方法存根
new Thread(new Runnable() {
@Override
public void run() {
// TODO 自动生成的方法存根
Decode(arg0);
}
}).start();
}
}
private void getCode(){
//surfaceView请自行创建,相机记得在activity中打开
decodeHelper = new CameraDecodeHelper(cview.getHolder(), camera, true, this);
//500ms后开始对焦,400ms循环
decodeHelper.AutoFocusAndPreviewCallback(500, 400);
}
实现接口中OnResult方法
public void onResult(final String reslut,final String barFormat) {
new Handler().post(new Runnable() {
@Override
public void run() {
// TODO 自动生成的方法存根
alert.cancel();
camera.setPreviewCallback(null);
Toast.makeText(ScreenNewSpecies.this,barFormat+":"+ reslut, 3000).show();
}
});
}