Я реализовал ZBar / ZXing API из этого git: https://github.com/dm77/barcodescanner
Эта библиотека, кажется, очень хорошо работает для чтения QR-кодов.
Я использую ее во фрагменте, которыйЯ создаю много раз.Каждый раз, когда создается этот фрагмент, я создаю представление «Сканер», запускаю свой сканер в onResume
и останавливаю сканер в методе onPause
.Этот фрагмент заменен менеджером фрагментов, поэтому два экземпляра этого фрагмента не выполняются одновременно .
Когда я выполняю этот фрагмент во второй раз, предварительный просмотр камеры не отображается.
Это мой фрагмент
public class IntentionFragment extends TimedFragment implements
ZBarScannerView.ResultHandler{
public static final String TAG = "IntentionFragment";
private MainActivity parent;
private ZBarScannerView mScannerView;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fr_intention_vote, container, false);
parent = (MainActivity) getActivity();
if(mScannerView == null){
mScannerView = new ZBarScannerView(parent);
mScannerView.setAspectTolerance(0.5f);
List<BarcodeFormat> formats = new ArrayList<>();
formats.add(BarcodeFormat.QRCODE);
mScannerView.setFormats(formats);
mScannerView.setAutoFocus(true);
mScannerView.setBackground(ContextCompat.getDrawable(parent, R.drawable.rectangle_white));
mScannerView.startCamera(-1);
}
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(0, ViewGroup.LayoutParams.MATCH_PARENT, 1f);
qrcode = v.findViewById(R.id.qrcode);
qrcodeText = v.findViewById(R.id.qrcode_text);
qrcode.addView(mScannerView, params);
return v;
}
@Override
public void handleResult(Result result) {
String qrcode_text = result.getContents();
Log.e(TAG, "QRCode : "+qrcode_text);
String decoded = decryptQRCode(qrcode_text);
final int X = Integer.parseInt(decoded);
mScannerView.resumeCameraPreview(this);
parent.checkIfRightTablet(X); // Checking info with a TCP server and replacing Fragment
}
@Override
public void onResume() {
super.onResume();
mScannerView.setResultHandler(this);
mScannerView.startCamera(); // Start camera on resume
}
@Override
public void onPause() {
super.onPause();
mScannerView.stopCamera(); // Stop camera on pause
}
}