Android - не удается обнаружить QR-код с библиотекой zxing

1

Я разрабатываю приложение для Android для сканирования QR-кодов, используя библиотеку zxing следующим образом:

Сначала интеграция библиотеки в Gradle:

implementation 'com.journeyapps:zxing-android-embedded:3.0.2@aar'
implementation 'com.google.zxing:core:3.3.0'

Во-вторых, активность в AndroidManifest.xml:

<activity
            android:name="com.journeyapps.barcodescanner.CaptureActivity"
            android:screenOrientation="fullSensor"
            tools:replace="screenOrientation" />

Затем код для сканирования QR-кода при нажатии кнопки:

IntentIntegrator integrator = new IntentIntegrator(getActivity());
integrator.setPrompt("Start scanning");
integrator.setDesiredBarcodeFormats(IntentIntegrator.QR_CODE_TYPES);
integrator.setOrientationLocked(false);
integrator.initiateScan();

И, наконец, анализ информации, полученной от сканера (это никогда не выполняется)

IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
            if(result != null) {
                if(result.getContents() == null) {
                    Toast.makeText(getActivity(), "Cancelled", Toast.LENGTH_LONG).show();
                } else {
                    String code = result.getContents();
                    textView.setText(code);
                }
            } else {
                super.onActivityResult(requestCode, resultCode, data);
            }

Камера открывается и выглядит как сканирующая, но не в состоянии обнаружить и прочитать QR-код, ничего не возвращает.

Теги:
qr-code
zxing

2 ответа

1

Я не вижу, что не так с вашим кодом, но я могу дать вам мой точный код, который работает для меня:

(Я использую anyorientation, так что это означает, что вы должны создать новый файл класса Java)

Manifest:

<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
...
<activity
        android:name=".AnyOrientationCaptureActivity"
        android:screenOrientation="fullSensor"
        android:stateNotNeeded="true"
        android:theme="@style/zxing_CaptureTheme"
        android:windowSoftInputMode="stateAlwaysHidden"></activity>

build.gradle: приложение

implementation 'com.journeyapps:zxing-android-embedded:3.6.0'
implementation 'com.android.support:appcompat-v7:25.3.1'

AnyOrientationCaptureActivity Java:

package com.your.package;
import com.journeyapps.barcodescanner.CaptureActivity;

public class AnyOrientationCaptureActivity extends CaptureActivity {

}

Основная деятельность:

   IntentIntegrator integrator = new IntentIntegrator(this);
   integrator.setCaptureActivity(AnyOrientationCaptureActivity.class);
   integrator.setDesiredBarcodeFormats(IntentIntegrator.QR_CODE);
   integrator.setPrompt("Scan the QR code");
   integrator.setOrientationLocked(false);
   integrator.setBeepEnabled(false);
   integrator.initiateScan();
   ...
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode != CUSTOMIZED_REQUEST_CODE && requestCode != IntentIntegrator.REQUEST_CODE) {
        // This is important, otherwise the result will not be passed to the fragment
        super.onActivityResult(requestCode, resultCode, data);
        return;
    }
    switch (requestCode) {
        case CUSTOMIZED_REQUEST_CODE: {
            Toast.makeText(this, "REQUEST_CODE = " + requestCode, Toast.LENGTH_LONG).show();
            break;
        }
        default:
            break;
    }

    IntentResult result = IntentIntegrator.parseActivityResult(resultCode, data);

    if(result.getContents() == null) {
        Log.d("MainActivity", "Cancelled scan");
        //Toast.makeText(this, "Cancelled", Toast.LENGTH_LONG).show();
    } else {
        Log.d("MainActivity", "Scanned");
        String mvalue = result.getContents();
    }
}
  • 1
    Решением был ответ @SantanuSur: поместите камеру подальше от QR-кода. Но спасибо, полезный ответ, чтобы улучшить мой код
0
class ScanActivity : AppCompatActivity(), ZXingScannerView.ResultHandler {

private val FLASH_STATE = "FLASH_STATE"
private val AUTOFOCUS_STATE = "AUTOFOCUS_STATE"

private var mScannerView: ZXingScannerView? = null
private var mFlash: Boolean = true
private var mAutofocus: Boolean = true
private var resultText: String = ""

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_scaling_scanner)

    mScannerView = ZXingScannerView(this)

    content_frame.addView(mScannerView)

    mScannerView?.setFlash(mFlash)
    mScannerView?.setAutoFocus(mAutofocus)

    switchFlash.setOnClickListener({
        mFlash = !mFlash
        mScannerView?.setFlash(mFlash)
    })

    switchAutoFocus.setOnClickListener ({
        mAutofocus = mAutofocus
        mScannerView?.setAutoFocus(mAutofocus)
    })
}

override fun onResume() {
    super.onResume()
    mScannerView?.setResultHandler(this)
    mScannerView?.setAspectTolerance(0.2f)
    mScannerView?.setFlash(mFlash)
    mScannerView?.setAutoFocus(mAutofocus)
    mScannerView?.startCamera()

    switchAutoFocus.setChecked(mAutofocus)
    switchFlash.setChecked(mFlash)
}

override fun onPause() {
    super.onPause()
    mScannerView?.stopCamera()
}

override fun onSaveInstanceState(outState: Bundle?) {
    super.onSaveInstanceState(outState)
    outState?.putBoolean(FLASH_STATE, mFlash)
    outState?.putBoolean(AUTOFOCUS_STATE, mAutofocus)
}

override fun handleResult(result: Result?) {
    mScannerView?.resumeCameraPreview(this)

    if (result == null) {
        return
    }

    mScannerView?.stopCamera()

    resultText = result.text;
    val resultIntent: Intent= Intent().putExtra("BRCode", resultText)
    setResult(1, resultIntent)
    finish()
}
 }

Используйте этот класс ScanActivity.

тогда в своей деятельности используйте:

    scanView.setOnClickListener {
        val intent = Intent(this, ScanActivity::class.java)
        startActivityForResult(intent, 2)
    }


  override fun onActivityResult(requestCode: Int, resultCode: Int, data: 
      Intent?) 
  {
    super.onActivityResult(requestCode, resultCode, data)
    if (data == null) {
        showIncorrectQRCodeDialogue()
        return
    }

// here is your BRCode result //
    val brCode:String=data.getStringExtra("BRCode")


}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню