使用Zxing库无法扫描QR码

3
我将尝试将Zxing集成到我的Android应用程序中,以便用户可以扫描QR码并返回QR码的内容。我已经能够打开条形码扫描器,但是虽然它看起来正在做某些事情,但它没有扫描QR码。我已经在条形码上进行了测试,它可以正常工作,因此问题似乎是特定于QR码的。下面是一些代码片段。
清单文件:
<activity
            android:name="com.journeyapps.barcodescanner.CaptureActivity"
            android:screenOrientation="portrait"
            tools:replace="android:screenOrientation"
            android:stateNotNeeded="true"/>

QR扫描器碎片

package com.example.ntuevent.ui.qrScanner;

import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProviders;

import com.example.ntuevent.R;
import com.google.zxing.integration.android.IntentIntegrator;
import com.google.zxing.integration.android.IntentResult;

public class QRScannerFragment extends Fragment implements View.OnClickListener {

    private QRScannerViewModel qrScannerViewModel;

    public View onCreateView(@NonNull LayoutInflater inflater,
                             ViewGroup container, Bundle savedInstanceState) {
        qrScannerViewModel =
                ViewModelProviders.of(this).get(QRScannerViewModel.class);
        View root = inflater.inflate(R.layout.fragment_qr_scanner, container, false);
        final TextView textView = root.findViewById(R.id.text_qr_scanner);
        qrScannerViewModel.getText().observe(this, new Observer<String>() {
            @Override
            public void onChanged(@Nullable String s) {
                textView.setText(s);
            }
        });

        root.findViewById(R.id.qr_scanner_button).setOnClickListener(this);

        return root;
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.qr_scanner_button:
                /* Request camera access */
                ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.CAMERA}, 1);
                launchQrScanner();
        }
    }

    private void launchQrScanner() {
        if (validateCameraPermission()) {
            /* Start the scanner */
            IntentIntegrator intentIntegrator = new IntentIntegrator(getActivity());

            /* Customisation options */
            intentIntegrator.setDesiredBarcodeFormats(IntentIntegrator.ONE_D_CODE_TYPES);
            intentIntegrator.setPrompt("Scan a barcode");
            intentIntegrator.setCameraId(0);  // Use a specific camera of the device
            intentIntegrator.setBeepEnabled(false);
            intentIntegrator.setOrientationLocked(true);


            /* Start QR scanner */
            intentIntegrator.initiateScan();
        }
    }

    private boolean validateCameraPermission() {
        /* Validates if app has access to camera */
        if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.CAMERA)
                != PackageManager.PERMISSION_GRANTED) {
            Toast.makeText(getContext().getApplicationContext(), "Enable camera permissions to access this feature", Toast.LENGTH_SHORT).show();
            return false;
        }

        return true;
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        IntentResult intentResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);

        if (intentResult != null) {
            if (intentResult.getContents() == null)
                Toast.makeText(getContext().getApplicationContext(), "Scan was cancelled", Toast.LENGTH_SHORT).show();
            else
                Toast.makeText(getContext().getApplicationContext(), intentResult.getContents(), Toast.LENGTH_SHORT).show();
        } else {
            super.onActivityResult(requestCode, resultCode, data);
        }
    }
}

任何帮助都将是很棒的!
1个回答

3

如果您想使用QR码扫描器,请按照我的方式进行操作,我在两个项目中都使用了以下代码,并且没有出现任何问题。

首先,将以下库添加到您的Gradle中:

  implementation 'me.dm7.barcodescanner:zxing:1.9.13'
  implementation 'com.journeyapps:zxing-android-embedded:3.6.0@aar'
  implementation 'com.google.zxing:core:3.3.3'

其次,在您的二维码扫描器活动中添加以下代码:

private IntentIntegrator qrScan;

在 onCreate 中添加以下内容:

    qrScan = new IntentIntegrator(this);
    qrScan.setOrientationLocked(false);
    qrScan.initiateScan();

在 onCreate 后添加以下代码:
  @Override
   protected void onActivityResult(int requestCode, int resultCode, Intent data) {
   IntentResult result = IntentIntegrator.parseActivityResult(requestCode, 
   resultCode, data);
    if (result != null) {
        if (result.getContents() == null) {
         //scan have an error 
        } else {
           //scan is successful 
        }
    } else {
        super.onActivityResult(requestCode, resultCode, data);
    }
}

顺便说一句,我还需要在defaultConfig {}中添加multiDexEnabled true,并添加以下依赖项implementation "androidx.multidex:multidex:2.0.1" - Pedro Machado
如果我使用IntentIntegrator,它总是想要安装Barcode Scanner应用程序。有没有一种方法可以将扫描仪嵌入到我的活动中? - Yuri S

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接