Как заставить ZBar работать дважды в Android? - PullRequest
0 голосов
/ 27 октября 2018

Я реализовал 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
}

}

...