Как сказать zxing, чтобы он читал только мой QR-код и игнорировал все остальные?

#java #android #qr-code #zxing

#java #Android #qr-код #zxing

Вопрос:

Итак, у меня запущен сканер штрих-кодов zxing, и в моем основном действии у меня есть функция onResultActivity, указывающая моему действию перейти к новому действию с результатом от сканера.

Проблема в том, что мой сканер просто сканирует любой старый QR-код, независимо от того, что это такое. Мне нужно, чтобы сканер принимал только мой QR-код для передачи успешного результата и игнорировал все остальные QR-коды (это должно передать тостеру сообщение «неправильный QR-код, попробуйте еще раз»).

Вот что у меня есть на данный момент:

MainActivity

 ...
static final int SCAN_RESULT = 1;  // The request code
...
  @Override
  public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        // Check which request we're responding to
        if (requestCode == SCAN_RESULT) {
            // Make sure the request was successful
            if (resultCode == RESULT_OK) {
            // Action to take if result successful
                Intent intent = new Intent(this, ResultActivity.class);
                startActivity(intent);

            }
        }
    }  

ScannerActivity

 ...
public class ScanBarcodeActivity extends AppCompatActivity {

    Button mBtnClose;

    private CaptureManager capture;
    private DecoratedBarcodeView barcodeScannerView;
    private ViewfinderView viewfinderView;

    private void initViews() {
        mBtnClose = findViewById(R.id.barcode_header_close);
        barcodeScannerView = findViewById(R.id.zxing_barcode_scanner);
        viewfinderView = findViewById(R.id.zxing_viewfinder_view);
    }

    private void initListener() {
        mBtnClose.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                finish();
            }
        });
    }

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

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

        changeMaskColor(null);
    }

    @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);
    }
    
    public void changeMaskColor(View view) {

    }

}  

РЕДАКТИРОВАТЬ: я пробовал это, но это, очевидно, не работает, это в основном то, что я ищу, чтобы заставить работать. Если SCAN_RESULT = QR_CODE, то перейдите к следующему действию, иначе появится сообщение с просьбой повторить попытку.

 static final int SCAN_RESULT = 1;  // The request code

    String QR_CODE = "EC0111-1234567899";
    int RESULT = Integer.parseInt(QR_CODE);

@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        // Check which request we're responding to
        if (requestCode == SCAN_RESULT) {
            // Make sure the request was successful
            if (SCAN_RESULT == RESULT) {
                Intent intent = new Intent(this, ResultActivity.class);
                startActivity(intent);
            } else {
                Toast.makeText(this, "Incorrect QR code, please try again", Toast.LENGTH_LONG).show();
            }

        }
    }  

Комментарии:

1. когда все, кроме вашего QR-кода, должно быть «правильным», приложению необходимо знать содержимое вашего QR-кода перед сканированием, чтобы оно могло свериться с ним … итак… зачем использовать QR-код, если приложение уже знает, что это за контент?

2. Мне нужно, чтобы сканер принимал только мой QR-код для передачи успешного результата и игнорировал все остальные QR-коды — QR-коды являются общими, «моего QR-кода» нет. Что вы можете сделать, так это сохранить «специальные» данные в самом QR-коде, чтобы ваше приложение могло декодировать их и проверить, соответствуют ли указанные данные структуре «вашего QR-кода».

3. Я знаю, что QR-коды являются общими, поэтому я сгенерировал уникальный код для QR. Мне просто нужно знать, как настроить сканер для регистрации этого уникального кода. В настоящее время сканирование любого QR-кода просто переходит непосредственно к моему экрану результатов, что не идеально. Мне нужно проверить это перед передачей результатов. Например, onActivityResult должен выполнить проверку if else, как мне создать исключение для этого оператора для уникального кода, который создает мой QR?

Ответ №1:

Есть несколько подходов, которые вы можете попробовать.

  1. Зашифровать информацию: Вы можете зашифровать информацию, закодированную в QR, чтобы другие не могли ее прочитать, а также вы можете идентифицировать свой собственный QR. Для этого

    • Зашифруйте информацию с помощью ключа
    • Сгенерируйте QR-код с зашифрованной информацией
    • Прочитайте и попытайтесь расшифровать информацию. Если вы можете расшифровать, то это ваш QR.
  2. Разработайте свой собственный QR-код: это может быть дорого для вас, но это замечательная идея — создать свой собственный QR-код в facebook messenger, snapchat и WhatsApp и т.д. В этом случае вы не сможете использовать стандартную библиотеку ZXING. Вам нужно настроить библиотеку ZXING или разработать новую.

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

  3. Добавить тег к информации: Вы можете добавить уникальный тег (текст) в свою QR-информацию. С помощью которого вы можете идентифицировать свой QR-код.

Комментарии:

1. Спасибо за информацию, но я на самом деле не собираюсь создавать QR-код, поскольку я уже это сделал. Я смотрю, как реализовать использование этого QR-кода в качестве пропуска после завершения сканирования. QR в основном должен быть ключом к успеху if else после сканирования, в противном случае следует повторить сканирование.

2. Вы можете добавить уникальный тег (текст) в свою QR-информацию. С помощью которого вы можете идентифицировать свой QR-код.