显示对话框时暂停 QR 码检测
Suspend QR code detection while dialog is shown
我正在尝试创建一个实时 QR 码解码器,它允许用户 confirm/cancel 从相机视图中读取数据。
(当然,根据确认或取消,它会执行一些代码...)
但是有一个不好的地方:
我编写的应用程序即使在对话框中也会继续读取二维码数据,我找不到阻止它的方法。
这是我的主要内容 activity:
public class MainReadActivity extends Activity {
private SurfaceView cameraView;
private TextView barcodeInfo;
private BarcodeDetector barcodeDetector;
private CameraSource cameraSource;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_read);
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
cameraView = (SurfaceView) findViewById(R.id.camera_view);
cameraView.requestFocus();
barcodeInfo = (TextView) findViewById(R.id.code_info);
barcodeDetector = new BarcodeDetector.Builder(this).setBarcodeFormats(Barcode.QR_CODE).build();
cameraSource = new CameraSource.Builder(this, barcodeDetector).build();
cameraView.getHolder().addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
try {
cameraSource.start(cameraView.getHolder());
} catch (IOException ie) {
Log.e("CAMERA SOURCE", ie.getMessage());
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
cameraSource.stop();
}
});
barcodeDetector.setProcessor(new Detector.Processor<Barcode>() {
@Override
public void release() {
}
@Override
public void receiveDetections(Detector.Detections<Barcode> detections) {
final SparseArray<Barcode> barcodes = detections.getDetectedItems();
if (barcodes.size() != 0) {
barcodeInfo.post(new Runnable() { // Use the post method of the TextView
public void run() {
ConfirmationDialogFragment myDialog = new ConfirmationDialogFragment();
myDialog.show(getFragmentManager(),"");
barcodeInfo.setVisibility(View.VISIBLE);
barcodeInfo.setText(barcodes.valueAt(0).displayValue);
}
});
}
}
});
}
这是我的 DialogFragment:
public class ConfirmationDialogFragment extends DialogFragment {
public Dialog ConfirmationDialogFragment(Bundle savedInstanceState){
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
LayoutInflater inflater = getActivity().getLayoutInflater();
View v = inflater.inflate(R.layout.dialog_confirmation,null);
builder.setView(v);
Dialog dialog = builder.create();
return dialog;
}
}
谁能帮帮我?
最佳,
P.
我想你忘记了一些这样的东西。
builder.setPositiveButton(Ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss(); //this close the dialog.
}
});
builder.setNegativeButton(Back, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
///do another thing
}
});
希望对你有所帮助
在 barcodeDetector 回调中停止和启动相机
barcodeDetector.setProcessor(new Detector.Processor<Barcode>() {
@Override
public void release() {
}
@Override
public void receiveDetections(Detector.Detections<Barcode> detections) {
final SparseArray<Barcode> barcodes = detections.getDetectedItems();
if (barcodes.size() != 0) {
cameraSource.stop();
barcodeInfo.post(new Runnable() { // Use the post method of the TextView
public void run() {
builder
.setMessage("Are you sure you want to reset the count?")
.setNegativeButton("No", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
cameraSource.start(cameraView.getHolder());
}
})
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
Toast.makeText(MainActivity.this, "Did Reset!", 5).show();
}
})
.create();
barcodeInfo.setVisibility(View.VISIBLE);
barcodeInfo.setText(barcodes.valueAt(0).displayValue);
}
});
}
}
});
检测完就调用Camera.release()方法
@Override
public void receiveDetections(Detector.Detections < TextBlock > detections) {
final SparseArray < TextBlock > items = detections.getDetectedItems();
if (items.size() != 0) {
mTextView.post(new Runnable() {
@Override
public void run() {
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < items.size(); i++) {
TextBlock item = items.valueAt(i);
stringBuilder.append(item.getValue());
stringBuilder.append("\n");
}
mTextView.setText(stringBuilder.toString());
mCameraSource.release();
}
});
}
}
我正在尝试创建一个实时 QR 码解码器,它允许用户 confirm/cancel 从相机视图中读取数据。 (当然,根据确认或取消,它会执行一些代码...)
但是有一个不好的地方: 我编写的应用程序即使在对话框中也会继续读取二维码数据,我找不到阻止它的方法。
这是我的主要内容 activity:
public class MainReadActivity extends Activity {
private SurfaceView cameraView;
private TextView barcodeInfo;
private BarcodeDetector barcodeDetector;
private CameraSource cameraSource;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_read);
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
cameraView = (SurfaceView) findViewById(R.id.camera_view);
cameraView.requestFocus();
barcodeInfo = (TextView) findViewById(R.id.code_info);
barcodeDetector = new BarcodeDetector.Builder(this).setBarcodeFormats(Barcode.QR_CODE).build();
cameraSource = new CameraSource.Builder(this, barcodeDetector).build();
cameraView.getHolder().addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
try {
cameraSource.start(cameraView.getHolder());
} catch (IOException ie) {
Log.e("CAMERA SOURCE", ie.getMessage());
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
cameraSource.stop();
}
});
barcodeDetector.setProcessor(new Detector.Processor<Barcode>() {
@Override
public void release() {
}
@Override
public void receiveDetections(Detector.Detections<Barcode> detections) {
final SparseArray<Barcode> barcodes = detections.getDetectedItems();
if (barcodes.size() != 0) {
barcodeInfo.post(new Runnable() { // Use the post method of the TextView
public void run() {
ConfirmationDialogFragment myDialog = new ConfirmationDialogFragment();
myDialog.show(getFragmentManager(),"");
barcodeInfo.setVisibility(View.VISIBLE);
barcodeInfo.setText(barcodes.valueAt(0).displayValue);
}
});
}
}
});
}
这是我的 DialogFragment:
public class ConfirmationDialogFragment extends DialogFragment {
public Dialog ConfirmationDialogFragment(Bundle savedInstanceState){
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
LayoutInflater inflater = getActivity().getLayoutInflater();
View v = inflater.inflate(R.layout.dialog_confirmation,null);
builder.setView(v);
Dialog dialog = builder.create();
return dialog;
}
}
谁能帮帮我?
最佳, P.
我想你忘记了一些这样的东西。
builder.setPositiveButton(Ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss(); //this close the dialog.
}
});
builder.setNegativeButton(Back, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
///do another thing
}
});
希望对你有所帮助
在 barcodeDetector 回调中停止和启动相机
barcodeDetector.setProcessor(new Detector.Processor<Barcode>() {
@Override
public void release() {
}
@Override
public void receiveDetections(Detector.Detections<Barcode> detections) {
final SparseArray<Barcode> barcodes = detections.getDetectedItems();
if (barcodes.size() != 0) {
cameraSource.stop();
barcodeInfo.post(new Runnable() { // Use the post method of the TextView
public void run() {
builder
.setMessage("Are you sure you want to reset the count?")
.setNegativeButton("No", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
cameraSource.start(cameraView.getHolder());
}
})
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
Toast.makeText(MainActivity.this, "Did Reset!", 5).show();
}
})
.create();
barcodeInfo.setVisibility(View.VISIBLE);
barcodeInfo.setText(barcodes.valueAt(0).displayValue);
}
});
}
}
});
检测完就调用Camera.release()方法
@Override
public void receiveDetections(Detector.Detections < TextBlock > detections) {
final SparseArray < TextBlock > items = detections.getDetectedItems();
if (items.size() != 0) {
mTextView.post(new Runnable() {
@Override
public void run() {
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < items.size(); i++) {
TextBlock item = items.valueAt(i);
stringBuilder.append(item.getValue());
stringBuilder.append("\n");
}
mTextView.setText(stringBuilder.toString());
mCameraSource.release();
}
});
}
}