Android Studio 条码扫描器应用程序。通过意图扫描
Android Studio Bar Code Scanner App. Scanning Via Intent
我有一个 android 应用程序,它的布局非常简单。一个按钮 (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.
中
我的应用程序的功能:按下按钮后,扫描功能将打开,扫描条形码位于 activity 中的两个编辑文本中。比如我按scan_barcode1,序列号放在scan_content和scan_content2.
以下是调用条码扫描器的intent代码。我正在使用 zxing 库 fyi。
//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 方法,该方法检索 edittext 并应该将其放置在正确的 edittext 中(它没有)
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;
您可以为此设置一个 static
标志,并在按下 button1 时分配 1
并在按下 button2 时分配 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();
}
}
如果 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
了。
您没有在 IntentIntegrator 中显示扫描意图的构造,但我猜您使用的是相同的 requestCode。
更改扫描意图的构造以具有不同的 requestCode(除了上下文之外,可能通过将值传递给 IntentIntegrator),然后在调用 onActivityResult 时,您将能够检查它以了解哪个扫描按钮是按下并填充相关的 EditText。
这就是 requestCode 的设计目的,而不是保存可能导致状态问题的变量。
我有一个 android 应用程序,它的布局非常简单。一个按钮 (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.
中我的应用程序的功能:按下按钮后,扫描功能将打开,扫描条形码位于 activity 中的两个编辑文本中。比如我按scan_barcode1,序列号放在scan_content和scan_content2.
以下是调用条码扫描器的intent代码。我正在使用 zxing 库 fyi。
//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 方法,该方法检索 edittext 并应该将其放置在正确的 edittext 中(它没有)
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;
您可以为此设置一个 static
标志,并在按下 button1 时分配 1
并在按下 button2 时分配 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();
}
}
如果 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
了。
您没有在 IntentIntegrator 中显示扫描意图的构造,但我猜您使用的是相同的 requestCode。
更改扫描意图的构造以具有不同的 requestCode(除了上下文之外,可能通过将值传递给 IntentIntegrator),然后在调用 onActivityResult 时,您将能够检查它以了解哪个扫描按钮是按下并填充相关的 EditText。
这就是 requestCode 的设计目的,而不是保存可能导致状态问题的变量。