将另一个 class 中的 zxing 条码扫描器的结果发送到 Main class 和 activity

Sending result of zxing barcode scanner in another class to Main class and activity

我是 Java 和 Android 的新手,所以有些错误可能是基本的。

我创建了两个 classes:Rdiet_Main.javaRdiet_Zxing.java。过去一切都在同一个 class 中,但我想为每个 class.

保留一个功能

当按下扫描按钮时,这发生在 Rdiet_Main:

Rdiet_Zxing zxScan = new Rdiet_Zxing();
   zxScan.acquireBarcode(this);

然后进入 Rdiet_Zxing:

public void acquireBarcode(Rdiet_Main t){

    IntentIntegrator scanBarcodeIntegrator = new IntentIntegrator(t);
    scanBarcodeIntegrator.initiateScan();
}
public String onActivityResult(int requestCode, int resultCode, Intent intent) {
    IntentResult scanBarcodeResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, intent);
    if(scanBarcodeResult != null){
        String strResult;
        strResult = scanBarcodeResult.getContents();
        return strResult;
    }
    else{
        return null;
    }
}

我想将条形码发送到Rdiet_Main。我应该如何更改我的代码以使其成为可能?

编辑:

我现在用startActivityForResult。但是,当按下按钮时,扫描仪不会启动,应用程序只会崩溃(无法在 AndroidManifest.xml 中找到明确的 Activity Class)。我认为 Rdiet_Zxing 需要链接到 CaptureActivity 或类似的东西。

这是我的 AndroidManifest.xml

里面的东西
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.CAMERA"/>

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".Rdiet_Main">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

编辑2:

已更新Rdiet_Zxing.java

public class Rdiet_Zxing extends Activity{

    public static final int SUCCESS_RETURN_CODE = 1;
    public static final int FAILURE_RETURN_CODE = 2;

    public void acquireBarcode(Rdiet_Main t){

        IntentIntegrator scanBarcodeIntegrator = new IntentIntegrator(t);
        scanBarcodeIntegrator.initiateScan();
    }

    public void onActivityResult(int requestCode, int resultCode, Intent intent) {
        IntentResult scanBarcodeResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, intent);
        if(scanBarcodeResult != null){
            String strResult;
            strResult = scanBarcodeResult.getContents();
            //SOL1
            Intent intentResult = new Intent();
            Bundle b = new Bundle();
            b.putString("myResult", strResult);
            intentResult.putExtras(b);
            setResult(SUCCESS_RETURN_CODE, intentResult);
            finish();
            //-------------
        }
        else{
            setResult(FAILURE_RETURN_CODE, null);
            finish();
        }
    }
}

已更新Rdiet_Main.java

//Scan button
                    Intent i = new Intent(Rdiet_Main.this, Rdiet_Zxing.class);
                    startActivityForResult(i, SUB_ACTIVITY_REQUEST_CODE);

    //ScanResult

        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            if (requestCode == SUB_ACTIVITY_REQUEST_CODE) {
                Bundle b = data.getExtras();
                strBarcode = b.getString("myResult");
                tbxAPIbarcode.setText(strBarcode);

            }
        }

您可以在同一个 class 中完成所有这些事件,或者您可以使用 'sub activity'。

编辑:这里是例子

在您的主 activity 中,当您按下按钮时:

Intent i = new Intent(Rdiet_Main.this, Rdiet_Zxing.class);
startActivityForResult(i, SUB_ACTIVITY_REQUEST_CODE);

然后,您将启动扫描仪。当您得到结果时:

public String onActivityResult(int requestCode, int resultCode, Intent intent) {
IntentResult scanBarcodeResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, intent);
if(scanBarcodeResult != null){
    String strResult;
    strResult = scanBarcodeResult.getContents();
    //Add these lines
    Intent intent = new Intent();
    Bundle b = new Bundle();
    b.putString("myResult", strResult);
    intent.putExtras(b);
    setResult(SUCCESS_RETURN_CODE, intent);
    finish();
    //-------------
    return strResult;
}
else{
    return null;
}

}

同样在扫描器中 activity 将其添加为全局:

public static final int SUCCESS_RETURN_CODE = 1;

并且在主要 activity:

private static final int SUB_ACTIVITY_REQUEST_CODE = 100;

最后,要在 main 中得到结果:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == SUB_ACTIVITY_REQUEST_CODE) {
        Bundle b = data.getExtras();
        String result = b.getString("myResult");
    }
}

编辑2:

当您创建一个新的 activity 时,它必须添加到您的清单中,但如果没有,您可以这样添加,

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".Rdiet_Main">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>
<!-- added here -->
<activity android:name=".Rdiet_Zxing"></activity>
</application>

希望对您有所帮助。

  • 创建如下回调

    public interface CallbackToMain {
    
    void result(String scanvalue);
    
    }  
    
  • 在您的 Redit_Main Activity.

  • 上实施
  • Redit_Main 中创建 Rdiet_Zxing class 的对象并传递接口引用。

    Rdiet_Zxing zxScan = new Rdiet_Zxing(this); // this refered to callback interface.
    
    zxScan.acquireBarcode();
    
  • 在 Redit_Zxing 中执行如下操作。

     CallbackToMain callback;
     public void Rdiet_Zxing(CallbackToMain callback){
     this.callback=callback;
     }
    
    
     @Override
     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
     super.onActivityResult(requestCode, resultCode, data);
    
     callback.result("your scanned value");
     }