扫描qrcode关闭应用程序而不是提供结果

时间:2014-10-08 09:28:02

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

我使用zxing库提供qrcodes并扫描到应用程序但是我遇到了问题。在尝试扫描时,我尝试了几种方法。推荐:

IntentIntegrator integrator = new IntentIntegrator(this);
integrator.initiateScan();

或意图方法:

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

两者似乎都能正常工作,因为扫描应用程序或选择应用程序来处理意图对话框。但是,扫描后,应用程序立即关闭。没有错误也没有结果。再见。

捕获结果的方法,在从不显示super()之后立即注意Log.d。

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    Log.d(LOG_TAG, "resultcode = " + resultCode);
    switch (requestCode) {
        case IntentIntegrator.REQUEST_CODE:
            IntentResult scanResult = IntentIntegrator.parseActivityResult(
                    requestCode, resultCode, data);
            if (scanResult == null) {
                return;
            }
            final String result = scanResult.getContents(); // Your result

            if (result != null) {
                Log.d(LOG_TAG, "Your result is: " + result);
            }
            break;
        default:
    }
}

我在一些教程中看到了如何在AndroidManifest.xml中实现zxing make条目的参考资料。见下文:

 <activity android:name="com.google.zxing.client.android.CaptureActivity"
       android:screenOrientation="landscape"
       android:configChanges="orientation|keyboardHidden"
       android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
       android:windowSoftInputMode="stateAlwaysHidden">
       <intent-filter>
          <action android:name="android.intent.action.MAIN"/>
          <category android:name="android.intent.category.DEFAULT"/>
       </intent-filter>
       <intent-filter>
          <action android:name="com.google.zxing.client.android.SCAN"/>
          <category android:name="android.intent.category.DEFAULT"/>
        </intent-filter>
</activity>

到目前为止我没有运气,缺乏日志并没有帮助我指向任何方向。

我正在使用Android Studio,并为依赖项中的lib设置了gradle:

compile files('libs/core-3.1.1.jar')
compile files('libs/android-integration-3.1.1.jar')

非常感谢帮助。

4 个答案:

答案 0 :(得分:0)

试试这个

  public void onActivityResult(int requestCode, int resultCode, Intent intent) {
IntentResult scanResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, intent);
if (scanResult != null) {
  // handle scan result
 }
 // else continue with any other code you need in the method
 ...
  }

答案 1 :(得分:0)

问题不在于zxing,而在于你开始它的方式。 startActivityForResult方法的第二个参数是requestCodedocumentation)。然后,您将检查requestCode上的onActivityResult以处理响应。另外,请勿先在super中致电onActivityResult

例如:

startActivityForResult(intent, 123);

将导致Android使用请求代码123

调用onActivityResult
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == 123 && resultCode == RESULT_OK) {
        //do some stuff...
    } else {
        super.onActivityResult(requestCode, resultCode, data);
    }
}

答案 2 :(得分:0)

尝试实现这一点,希望它可能有用。

onCrearte()中的

- 调用doScan()方法。

//点击扫描按钮。

Button btn_scan = (Button) findViewById(R.id.stbcheck_btn_scan);
        btn_scan.setOnClickListener(new View.OnClickListener() {

            public void onClick(View arg0) {
                doScan();
            }
        });

doScan():

//条形码扫描选项和API集成

public void doScan() {
        IntentIntegrator.initiateScan(this);
    }

onActivityResult():

public void onActivityResult(int request, int result, Intent i) {
        IntentResult scan=IntentIntegrator.parseActivityResult(request, result, i);

        if (scan!=null) {
            //format.setText(scan.getFormatName());
            //Set the returned content from Scanner to edit text
            et_stbNo.setText(scan.getContents());
        }
    }

注意:您必须调用这些onSavedInstanceState()和onRestoreInstanceState()方法,因为您的活动在更改方向时会被销毁并重新创建。

@Override
public void onSaveInstanceState(Bundle state) {
    //state.putString("format", format.getText().toString());
    state.putString("contents", et_stbNo.getText().toString());
}

@Override
public void onRestoreInstanceState(Bundle state) {
    //format.setText(state.getString("format"));
    et_stbNo.setText(state.getString("contents"));
}

希望有所帮助:

答案 3 :(得分:0)

使用以下代码,它适用于我的代码。

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
    IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
    if (result != null)
    {
        if (result.getContents() == null)
        {

        }
        else
        {

        }
    }
    else
    {
        // This is important, otherwise the result will not be passed to the fragment
        super.onActivityResult(requestCode, resultCode, data);
    }
}