Могу ли я при использовании IntentIntegrator из библиотеки ZXing добавить флэш-кнопку в сканер штрих-кода через Intent?

Я сканирую штрих-коды и QR-коды из приложения Android с помощью Intent, используя библиотеку ZXing и его порт приложения для Android. Я добавил следующие две строки в свои зависимости Gradle, чтобы использовать код интеграции Android без изменений:

compile 'com.journeyapps:zxing-android-embedded:3.2.0@aar'
compile 'com.google.zxing:core:3.2.1'

И я использую IntentIntegrator в моем действии для сканирования штрих-кода в onCreate() следующим образом:

integrator = new IntentIntegrator(this);
integrator.setOrientationLocked(false);
integrator.setPrompt(getString(R.string.scanner_text)); // Set the text of the scanner
integrator.setCameraId(0);  // Use a specific camera of the device
integrator.setBeepEnabled(true); // Enable beep in the scanner
integrator.setBarcodeImageEnabled(false); // Do not fetch image from the camera
integrator.initiateScan();

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

введите здесь описание изображения

Я уже могу управлять вспышкой с помощью клавиш увеличения и уменьшения громкости, потому что я переопределяю CaptureActivity. Есть ли в сканере штрих-кода кнопка-вспышка, подобная приведенной выше, которая может переключаться между режимами AUTO, ON и OFF? Если есть, могу ли я использовать addExtra() метод IntentIntegrator для его активации? Или единственный способ реализовать это - изменить весь код в соответствии с моими потребностями?


person Ashin Mandal    schedule 14.03.2016    source источник


Ответы (3)


Я пропустил эту страницу о внедрении BarcodeView и эти примеры действий, которые показывают как настроить сканер штрих-кода в соответствии с вашими потребностями. Пример активности, который мне помог, был CustomScannerActivity.

В IntentIntegrator для встроенной реализации флэш-кнопки. Вместо этого я должен создать собственный макет для сканера штрих-кода, использовать его в пользовательской активности и вызвать эту активность из файла IntentIntegrator.

У меня два вида деятельности. Один ScannerActivity, другой CallingActivity. Ошибка, которая некоторое время меня смущала, заключалась в том, что я создал экземпляр IntentIntegrator в методе onCreate() ScannerActivity. Это должно быть в CallingActivity.

В приведенном примере используется Button, а текст Button изменяется в соответствии с flash. Я создал новый макет Android под названием activity_custom_scanner, в котором я заменил кнопку на ToggleButton и вместо этого использовал изображения для кнопки, чтобы получить желаемую кнопку включения/выключения вспышки.

Итак, моя ScannerActivity выглядит так:

public class CustomScannerActivity extends Activity implements
        CompoundBarcodeView.TorchListener {

    private static final int BarCodeScannerViewControllerUserCanceledErrorCode = 99991;

    private static final String TAG = CustomScannerActivity.class.getSimpleName();

    private CaptureManager capture;
    private CompoundBarcodeView barcodeScannerView;
    private ToggleButton switchFlashlightButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_custom_scanner);

        barcodeScannerView = (CompoundBarcodeView)findViewById(R.id.zxing_barcode_scanner);
        barcodeScannerView.setTorchListener(this);

        switchFlashlightButton = (ToggleButton)findViewById(R.id.switch_flashlight);

        switchFlashlightButton.setText(null);
        switchFlashlightButton.setTextOn(null);
        switchFlashlightButton.setTextOff(null);

        // if the device does not have flashlight in its camera,
        // then remove the switch flashlight button...
        if (!hasFlash()) {
            switchFlashlightButton.setVisibility(View.GONE);
        }

        switchFlashlightButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                // Save the state here
                if (isChecked) {
                    barcodeScannerView.setTorchOn();
                } else {
                    barcodeScannerView.setTorchOff();
                }
            }
        });

        capture = new CaptureManager(this, barcodeScannerView);
        capture.initializeFromIntent(getIntent(), savedInstanceState);
        capture.decode();
    }

    @Override
    protected void onResume() {
        super.onResume();
        capture.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
        capture.onPause();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        capture.onDestroy();
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        capture.onSaveInstanceState(outState);
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        return barcodeScannerView.onKeyDown(keyCode, event) || super.onKeyDown(keyCode, event);
    }

    /**
     * Check if the device's camera has a Flashlight.
     * @return true if there is Flashlight, otherwise false.
     */
    private boolean hasFlash() {
        return getApplicationContext().getPackageManager()
                .hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);
    }

    @Override
    public void onTorchOn() {
        // necessary override..
    }


    @Override
    public void onTorchOff() {
        // necessary override..
    }

}

И CallingActivity выглядит так:

public class CallingActivity extends Activity {

    private static final String TAG = CallingActivity.class.getSimpleName();

    private static final int BarCodeScannerViewControllerUserCanceledErrorCode = 99991;

    String uuid;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        uuid = getIntent().getStringExtra("uuid");
        new IntentIntegrator(this).setOrientationLocked(false).setCaptureActivity(CustomScannerActivity.class).initiateScan();
    }



    public void onActivityResult(int requestCode, int resultCode, Intent intent) {

        IntentResult scanResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, intent);

        if (resultCode == RESULT_OK) {
            if (scanResult != null) {

                // handle scan result
                Log.i(TAG, "Text from Barcode Scanner: " + scanResult.getContents());
                getIntent().putExtra("data", scanResult.getContents());
                getIntent().putExtra("uuid", uuid);
            }
        }
        else if (resultCode == RESULT_CANCELED) {
            getIntent().putExtra("error", "User canceled");
            getIntent().putExtra("error_code", BarCodeScannerViewControllerUserCanceledErrorCode);
        }
        else
        {
            getIntent().putExtra("error", getString(R.string.scanner_error));
            getIntent().putExtra("error_code", BarCodeScannerViewControllerUserCanceledErrorCode);
        }

        setResult(resultCode, this.getIntent());

        this.finish();
    }

}

Я не уверен, что это идеальный способ, но я так и сделал.

Надеюсь, это поможет кому-то!

person Ashin Mandal    schedule 21.03.2016

В CompoundBarcodeView есть метод setTorchOn, поэтому вы можете проверить этот метод и попытаться реализовать его для своих нужд. Надеюсь, поможет.

person Bruno    schedule 17.03.2016
comment
Спасибо за Ваш ответ. Я понял это, и я реализую класс CompoundBarcodeView, чтобы сделать CustomScannerActivity. Написание ответа, чтобы кратко объяснить, что я сделал. - person Ashin Mandal; 20.03.2016
comment
Где этот класс CompoundBarcodeView, который вы упомянули? - person Spektakulatius; 24.05.2016

Этот вопрос, вероятно, слишком стар, но вы можете использовать кнопки громкости для включения / выключения фонарика во время сканирования.

person RanSh    schedule 20.01.2021