要实现不关闭zxing相机,可以使用以下代码示例:
import android.content.Context;
import android.hardware.Camera;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.DecodeHintType;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.PlanarYUVLuminanceSource;
import com.google.zxing.ReaderException;
import com.google.zxing.Result;
import com.google.zxing.common.GlobalHistogramBinarizer;
import java.io.IOException;
import java.util.Map;
public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback, Camera.PreviewCallback {
private static final String TAG = "CameraPreview";
private Context mContext;
private SurfaceHolder mHolder;
private Camera mCamera;
private Handler mHandler;
private DecodeCallback mDecodeCallback;
public CameraPreview(Context context, DecodeCallback decodeCallback) {
super(context);
mContext = context;
mDecodeCallback = decodeCallback;
mHolder = getHolder();
mHolder.addCallback(this);
}
public void surfaceCreated(SurfaceHolder holder) {
try {
mCamera = Camera.open();
mCamera.setPreviewDisplay(holder);
mCamera.setDisplayOrientation(90);
mHandler = new Handler(Looper.getMainLooper());
mCamera.setPreviewCallback(this);
mCamera.startPreview();
} catch (IOException e) {
Log.d(TAG, "Error setting camera preview: " + e.getMessage());
}
}
public void surfaceDestroyed(SurfaceHolder holder) {
releaseCamera();
}
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
if (mHolder.getSurface() == null) {
return;
}
try {
mCamera.stopPreview();
} catch (Exception e) {
// ignore: tried to stop a non-existent preview
}
try {
mCamera.setPreviewDisplay(mHolder);
mCamera.setDisplayOrientation(90);
mHandler = new Handler(Looper.getMainLooper());
mCamera.setPreviewCallback(this);
mCamera.startPreview();
} catch (Exception e) {
Log.d(TAG, "Error starting camera preview: " + e.getMessage());
}
}
public void releaseCamera() {
if (mCamera != null) {
try {
mCamera.setPreviewCallback(null);
mCamera.stopPreview();
mCamera.release();
mCamera = null;
} catch (Exception e) {
Log.e(TAG, "Error releasing camera: " + e.getMessage());
}
}
}
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
mHandler.post(new Runnable() {
@Override
public void run() {
if (mCamera != null) {
Camera.Parameters parameters = mCamera.getParameters();
int imageFormat = parameters.getPreviewFormat();
int width = parameters.getPreviewSize().width;
int height = parameters.getPreviewSize().height;
PlanarYUVLuminanceSource source = new PlanarYUVLuminanceSource(data, width, height, 0, 0, width, height, false);
BinaryBitmap bitmap = new BinaryBitmap(new GlobalHistogramBinarizer(source));
MultiFormatReader reader = new MultiFormatReader();
Map hints = new Hashtable<>();
hints.put(DecodeHintType.TRY_HARDER, Boolean.TRUE);
hints.put(DecodeHintType.POSSIBLE_FORMATS, DecodeFormat.ALL_FORMATS);
reader.setHints(hints);
try {
Result result = reader.decode(bitmap);
mDecodeCallback.onDecodeSuccess(result);
} catch (ReaderException e) {
// QR code not found, do nothing
} finally {
mCamera.setPreviewCallback(CameraPreview.this);
}
}
}
});
}
public interface DecodeCallback {
void onDecodeSuccess(Result result);
}
}
上面的代码是一个自定义的CameraPreview类,继承自SurfaceView,并实现了SurfaceHolder.Callback和Camera.PreviewCallback接口。在surfaceCreated方法中打开相机并设置预览,同时设置PreviewCallback用于获取预览帧数据。在surfaceDestroyed方法中释放相机资源。在onPreviewFrame方法中进行解码操作,并通过DecodeCallback将解码结果返回。
使用时可以在Activity中添加以下代码:
public class MainActivity extends AppCompatActivity implements CameraPreview.DecodeCallback {
private static final String TAG = "MainActivity";
private CameraPreview mCameraPreview;
private TextView mResultTextView;
@Override
下一篇:不观察静态变量的didSet