Search code examples
androidzxingbarcode-scannerandroid-vision

Barcode scanning doesn't work if device doesn't have barcode reader app installed


I am trying to create barcode reader. I use Zxing library and I have a problem with device which has own barcode reader. My app is working perfectly. But on a device which has no barcode reader app, my app is not working.

This is a my code, how I can check if device has barcode reader?

public class MainActivity extends Activity {
TextView tvStatus;
TextView tvResult;
private static String BarCodeResult;

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

    tvStatus = (TextView) findViewById(R.id.tvStatus);
    tvResult = (TextView) findViewById(R.id.tvResult);
    BarCodeResult = tvResult.getText().toString();

    Button scanBtn = (Button) findViewById(R.id.btnScan);

    scanBtn.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {

            try {

                Intent intent = new Intent(
                        "com.google.zxing.client.android.SCAN");
                intent.putExtra("SCAN_MODE", "QR_CODE_MODE,PRODUCT_MODE");
                startActivityForResult(intent, 0);

            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                Toast.makeText(getApplicationContext(), "ERROR:" + e, 1)
                        .show();

            }

        }
    });

}

public void onActivityResult(int requestCode, int resultCode, Intent intent) {
    if (requestCode == 0) {
        if (resultCode == RESULT_OK) {
            tvStatus.setText(intent.getStringExtra("SCAN_RESULT_FORMAT"));
            tvResult.setText(intent.getStringExtra("SCAN_RESULT"));
            connectWithHttpGet(intent.getStringExtra("SCAN_RESULT"));
            BarCodeResult=intent.getStringExtra("SCAN_RESULT");

            Intent in = new Intent(getApplicationContext(), Result.class);
            in.putExtra("KEY_BarCodeResult", intent.getStringExtra("SCAN_RESULT"));

            startActivity(in);
        } else if (resultCode == RESULT_CANCELED) {
            tvStatus.setText("Press a button to start a scan.");
            tvResult.setText("Scan cancelled.");
        }
    }
}

Solution

  • You aren't handling the case where the app is not installed, yes, and there is nothing available to handle the Intent.

    Just use the IntentIntegrator class from the project in your app, which handles this:

    https://github.com/zxing/zxing/blob/4fb569cce8de8e7724b39cf3f62350441a559771/android-integration/src/main/java/com/google/zxing/integration/android/IntentIntegrator.java

    Or you can see what it does and do something similar with ActivityNotFoundException.