문제

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.");
        }
    }
}
도움이 되었습니까?

해결책

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.

다른 팁

a simply way. redirect to the playstore to install if havent the scanner

try {
        intentscan = new Intent(
                "com.google.zxing.client.android.SCAN");
        startActivityForResult(intentscan, 0);
    } catch (ActivityNotFoundException ex) {
        new AlertDialog.Builder(MainActivity.this)
                .setIcon(R.drawable.ic_launcher)
                .setTitle("You must install\nBarcode Scanner\nof Zxing")
                .setPositiveButton("OK",
                        new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog,int which) {
                                Intent i = new Intent(
                                        Intent.ACTION_VIEW,
                                        Uri.parse("https://play.google.com/store/apps/details?id=com.google.zxing.client.android"));
                                startActivity(i);
                                finish();
                            }
                        }).show();
    }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top