【问题标题】:Android Studio Bar Code Scanner App. Scanning Via IntentAndroid Studio 条码扫描仪应用程序。通过意图扫描
【发布时间】:2015-09-03 08:34:44
【问题描述】:

我有一个布局非常简单的安卓应用。一个按钮 (scan_barcode1) 后跟一个编辑文本 (scan_content),另一个按钮 (scan_barcode2) 后跟另一个编辑文本 (scan_content2)。

     <Button
    style="?android:attr/buttonStyleSmall"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/scanner"
    android:id="@+id/scan_barcode1"
    android:layout_below="@+id/spinner7"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_marginTop="25dp"
    android:onClick="openScanner1" />

<EditText
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:inputType="number"
    android:ems="10"
    android:id="@+id/scan_content"
    android:layout_below="@+id/scan_barcode1"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:hint="@string/serial_number"
    android:layout_alignRight="@+id/spinner7"
    android:layout_alignEnd="@+id/spinner7" />

<Button
    style="?android:attr/buttonStyleSmall"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/scanner"
    android:id="@+id/scan_barcode2"
    android:layout_below="@+id/scan_content"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:onClick="openScanner2" />

<EditText
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:inputType="number"
    android:ems="10"
    android:id="@+id/scan_content2"
    android:layout_below="@+id/scan_barcode2"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:hint="@string/serial_number"
    android:layout_alignRight="@+id/scan_content"
    android:layout_alignEnd="@+id/scan_content" />

我想让我的应用程序做什么:按下按钮后,扫描功能将打开,扫描条形码并将序列号放在其下方的编辑文本中。例如,如果您按scan_barcode1,则序列号将放在scan_content中,如果按scan_barcode2,则序列号将出现在scan_content2中。

我的应用程序做什么:按下按钮后,扫描功能将打开,扫描条码放置在活动中的两个editext中。比如我按scan_barcode1,序列号放在scan_content和scan_content2中。

以下是调用条形码扫描仪的意图的代码。我正在使用 zxing 库,仅供参考。

    //This method opens the barcode scanner when scan_barcode1 button is pressed

    public void openScanner1 (View view) {
    IntentIntegrator scanIntegrator = new IntentIntegrator (this);
    scanIntegrator.initiateScan();
}



    //This method opens the bar code scanner when scan_barcode2 is pressed

    public void openScanner2 (View view) {
    IntentIntegrator scanIntegrator = new IntentIntegrator(this);
    scanIntegrator.initiateScan();
}

我将两个editText初始化为contentTxt和contentTxt2

     contentTxt = (EditText) findViewById(R.id.scan_content);
    contentTxt2 = (EditText) findViewById(R.id.scan_content2);

然后我开始 OnActivityResult 方法,该方法检索编辑文本并应该将其放置在正确的编辑文本中(它没有)

    public void onActivityResult(int requestCode, int resultCode, Intent intent) {
    IntentResult scanningResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, intent);

    //Places barcode in the scan_content editext

    if (scanningResult != null) {
        String scanContent = scanningResult.getContents();
        contentTxt.setText(scanContent);
    }

    //places bar code in the scan_content2 edittext
    if (scanningResult !=null) {
        String scanContent = scanningResult.getContents();
        contentTxt2.setText(scanContent);
    }


    else{
        Toast toast = Toast.makeText(getApplicationContext(),
                "No scan data received!", Toast.LENGTH_SHORT);
        toast.show();
    }

}

相反,条形码只是在两个编辑文本中复制。我已经被这个问题困扰了一段时间,我迫切需要一个解决方案。非常感谢任何帮助!

所以我已经更新了我的代码,但现在我完全没有检索条形码,结果我得到 null 并且我的 toast 消息弹出。有谁知道发生了什么?无论我按什么按钮都会发生这种情况。

     private int scanFieldPosition = 0;

public void openScanner1 (View view) {
    scanFieldPosition = 1;
    IntentIntegrator scanIntegrator = new IntentIntegrator (this);
    scanIntegrator.initiateScan();

}

public void openScanner2 (View view) {
    scanFieldPosition = 2;
    IntentIntegrator scanIntegrator = new IntentIntegrator(this);
    scanIntegrator.initiateScan();

}

public void onActivityResult(int requestCode, int resultCode, Intent intent) {
    IntentResult scanningResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, intent);
    if (scanningResult != null && scanFieldPosition == 1) {
        String scanContent = scanningResult.getContents();
        contentTxt.setText(scanContent);
    }

    if (scanningResult !=null && scanFieldPosition == 2) {
        String scanContent = scanningResult.getContents();
        contentTxt2.setText(scanContent);
    }


    else{
        Toast toast = Toast.makeText(getApplicationContext(),
                "No scan data received!", Toast.LENGTH_SHORT);
        toast.show();
    }

}

问题是我没有静态变量。我仍然收到 toast 消息,但我的条形码位于正确的编辑文本中,这很奇怪。无论如何,感谢您的帮助,我的应用现在可以运行了!

    private static int scanFieldPosition = 0;

【问题讨论】:

    标签: java android android-intent barcode-scanner onactivityresult


    【解决方案1】:

    您可以为此设置static 标志,并在按下按钮1 时将1 分配给它,并在按下按钮2 时将2 分配给它。然后您可以检查onActivityResult() 中的标志。你可以这样做:

    public static int editTextNumber = 0;
    
    
    public void openScanner1 (View view) {
    IntentIntegrator scanIntegrator = new IntentIntegrator (this);
    scanIntegrator.initiateScan();
    editTextNumber  = 1;
    }
    
    
    public void openScanner2 (View view) {
    IntentIntegrator scanIntegrator = new IntentIntegrator(this);
    scanIntegrator.initiateScan();
    editTextNumber = 2;
    }
    

    然后在你的onActivityResult()

    public void onActivityResult(int requestCode, int resultCode, Intent intent) {
    IntentResult scanningResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, intent);
    
    //Places barcode in the scan_content editext
    
    
    Log.e("editTextNumber",""+ editTextNumber ); // check whats value here
    if (scanningResult != null && editTextNumber == 1) { // checking for flag here
        String scanContent = scanningResult.getContents();
        contentTxt.setText(scanContent);
    }
    
    //places bar code in the scan_content2 edittext
    else if (scanningResult !=null && editTextNumber == 2) {  // checking for flag also
        String scanContent = scanningResult.getContents();
        contentTxt2.setText(scanContent);
    }
    
    
    else{
        Toast toast = Toast.makeText(getApplicationContext(),
                "No scan data received!", Toast.LENGTH_SHORT);
        toast.show();
       }
    
    }
    

    【讨论】:

    • 嘿,谢谢您的帮助。我觉得我们在正确的轨道上,但是当我扫描条形码时,结果为 null,并且弹出消息“未收到扫描数据!”知道出了什么问题吗?
    • @Gabriel 它总是为空吗?
    • 我一直收到 toast 消息,好像它是空的,但扫描数据仍然收到.... 很奇怪
    • 哪条吐司留言No scan data received!"这个?
    • @Gabriel,我已经记录了 editTextNumber 变量的值,运行它并告诉我值是什么,或者如果您在设备上进行测试,则敬酒。
    【解决方案2】:

    如果scanningResult 不为空(换句话说,如果if 子句的条件为真),则您正在为两个EditText 设置文本。 您需要在创建扫描 Intent 时保存一些标识要填充的 EditText 的信息,并在您的 onActivityResult 中检索该信息,例如:

    private int scanFieldPosition = 0;
    
    public void openScanner1 (View view) {
        scanFieldPosition = 1;
        IntentIntegrator scanIntegrator = new IntentIntegrator (this);
        scanIntegrator.initiateScan();
    }
    
    
    public void openScanner2 (View view) {
        scanFieldPosition = 2;
        IntentIntegrator scanIntegrator = new IntentIntegrator(this);
        scanIntegrator.initiateScan();
    }
    

    然后在onActivityResult 中查看scanFieldPosition 以知道要填写哪个EditText

    【讨论】:

      【解决方案3】:

      您没有在 IntentIntegrator 中展示您对扫描意图的构造,但我猜您使用的是相同的 requestCode。

      将扫描意图的构造更改为具有不同的 requestCode(可能通过将值传递给 IntentIntegrator 以及上下文),然后当 onActivityResult 被调用时,您将能够检查它以了解按下了哪个扫描按钮和填充相关的 EditText。

      这是 requestCode 的设计目的,而不是保存可能导致状态问题的变量。

      【讨论】:

        最近更新 更多