2016-01-27 55 views
1

如何使用zxing库获取自定义扫描仪的扫描条形码结果?活动结果不起作用。扫描部分工作正常,并得到结果。但是我没有收到活动结果中的任何数据。如何获得条码扫描器android的活动结果?

public class ScannerActivity extends Activity implements ZXingScannerView.ResultHandler{ 

ResultHandler resultHandler; 
Parameters parameters; 
private CaptureManager capture; 
private CompoundBarcodeView barcodeScannerView; 
private Button switchFlashlightButton; 
private ZXingScannerView mScannerView; 
BarcodeView test; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_custom_scanner); 

    Bundle extras = this.getIntent().getExtras(); 
    resultHandler = (ResultHandler) extras.getSerializable("RESULT_HANDLER"); 
    parameters = (Parameters) extras.getSerializable("PARAMETERS"); 

    barcodeScannerView = (CompoundBarcodeView)findViewById(R.id.zxing_barcode_scanner); 
    this.getIntent().putExtra("Result_handle",resultHandler); 
    capture = new CaptureManager(this, barcodeScannerView); 
    capture.initializeFromIntent(getIntent(), savedInstanceState); 
    capture.decode(); 
} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent intent) { 
    Log.d("onActivityResult", "onActivityResult: ."); 
    if (resultCode == Activity.RESULT_OK) { 
     IntentResult scanResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, intent); 
     String re = scanResult.getContents(); 
     String message = re; 
     Log.d("onActivityResult", "onActivityResult: ."+ re); 
     Result handlerResult = new Result(Result.STATUS_SUCCESS, "qrcode", message); 
     resultHandler.onHandleResult(handlerResult); 
     this.finish(); 
    } 
    // else continue with any other code you need in the method 

} 


@Override 
protected void onResume() { 
    Log.d("onResume", "onResume: ."); 
    super.onResume(); 
    capture.onResume(); 
} 

@Override 
protected void onPause() { 
    Log.d("onPause", "onPause: ."); 
    super.onPause(); 
    capture.onPause(); 
} 

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    capture.onDestroy(); 
} 


@Override 
protected void onSaveInstanceState(Bundle outState) { 
    Log.d("onSaveInstanceState", "onSaveInstanceState: ."); 
    super.onSaveInstanceState(outState); 
    capture.onSaveInstanceState(outState); 
} 

}

+0

你怎么发的结果?请分享您的代码 – 0X0nosugar

+0

这就是结果。但它来自CaptureManager.java类,它是一个库 protected void returnResult(BarcodeResult rawResult){ Intent intent = resultIntent(rawResult,getBarcodeImagePath(rawResult)); activity.setResult(Activity.RESULT_OK,intent); finish(); } https://github.com/journeyapps/zxing-android-embedded/blob/master/zxing-android-embedded/src/com/journeyapps/barcodescanner/CaptureManager.java – jgm

+1

我想知道是否有可能任何冲突,因为你似乎在同一活动中要求和接收结果*。通常ActivityA会“startActivityForResult(ActivityA.this,ActivityB.class);”然后AcitivtyB会(通过“getIntent()”)确定它应该做什么,最后调用“setResult()”和“finish()”。然后最后调用ActivityA的“onActivityResult()”。 – 0X0nosugar

回答

0

我解决它。这是我做到的。

我创建了第二个活动CustomScannerActivity。我在哪里做扫描部分。

public class CustomScannerActivity extends Activity { 

private CaptureManager capture; 
private CompoundBarcodeView barcodeScannerView; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_custom_scanner); 

    barcodeScannerView = (CompoundBarcodeView)findViewById(R.id.zxing_barcode_scanner); 
    capture = new CaptureManager(this, barcodeScannerView); 
    capture.initializeFromIntent(getIntent(), savedInstanceState); 
    capture.decode(); 

} 

@Override 
protected void onResume() { 
    super.onResume(); 
    capture.onResume(); 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    capture.onPause(); 
} 

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    capture.onDestroy(); 
} 

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    capture.onSaveInstanceState(outState); 
} 

} 

然后从第一个活动。我从这个调用了CustomScannerActivity。所以现在你会得到结果。希望能帮助到你。确保您在清单中声明活动,以便它能够正常工作。

public class ScannerActivity extends Activity { 

ResultHandler resultHandler; 
Parameters parameters; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    IntentIntegrator integrator = new IntentIntegrator(this); 
    integrator.setCaptureActivity(CustomScannerActivity.class); 
    integrator.initiateScan(); 
} 


@Override 
public void onActivityResult(int requestCode, int resultCode, Intent intent) { 
    Log.d("onActivityResult", "onActivityResult: ."); 
    if (resultCode == Activity.RESULT_OK) { 
     IntentResult scanResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, intent); 
     String re = scanResult.getContents(); 
     String message = re; 
     Log.d("onActivityResult", "onActivityResult: ." + re); 
     Result handlerResult = new Result(Result.STATUS_SUCCESS, "qrcode", message); 
     resultHandler.onHandleResult(handlerResult); 
    } 
    // else continue with any other code you need in the method 
    this.finish(); 

} 

}

1

[ FULL SOURCE CODE EXAMPLE ]

你必须给允许进入宣言文件:

<uses-permission android:name="android.permission.CAMERA" /> 
<uses-permission android:name="android.permission.FLASHLIGHT" /> 
<uses-permission android:name="android.permission.WRITE_EXTERN 
AL_STORAGE" /> 

然后在宣言中应用的标签添加此下面的代码:

<activity 
      android:name=".encode.EncodeActivity" 
      android:label="@string/app_name" 
      android:stateNotNeeded="true" > 
      <intent-filter> 
       <action android:name="com.google.zxing.client.android.ENCODE" /> 

       <category android:name="android.intent.category.DEFAULT" /> 
      </intent-filter> 
      <!-- This allows us to handle the Share button in Contacts. --> 
      <intent-filter> 
       <action android:name="android.intent.action.SEND" /> 

       <category android:name="android.intent.category.DEFAULT" /> 

       <data android:mimeType="text/x-vcard" /> 
      </intent-filter> 
      <!-- This allows us to handle sharing any plain text . --> 
      <intent-filter> 
       <action android:name="android.intent.action.SEND" /> 

       <category android:name="android.intent.category.DEFAULT" /> 

       <data android:mimeType="text/plain" /> 
      </intent-filter> 
     </activity> 
     <activity 
      android:name="com.google.zxing.client.android.CaptureActivity" 
      android:configChanges="orientation|keyboardHidden" 
      android:screenOrientation="landscape" 
      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> 

然后你的onActivityResult()方法将是这个样子:

public void onActivityResult(int requestCode, int resultCode, Intent intent) { 
    super.onActivityResult(requestCode, resultCode, intent); 
    if (requestCode == 0) { 

     if (resultCode == RESULT_OK) { 
      textViewFormat.setText(intent.getStringExtra("SCAN_RESULT_FORMAT")); 
      textViewData.setText(intent.getStringExtra("SCAN_RESULT")); 

      Uri imageURI = intent.getData(); 
      Bitmap bitmap; 
      try{ 
       bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), imageURI); 
       scannedBitmap.setImageBitmap(bitmap); 
      } catch(Exception e){ 
       e.printStackTrace(); 
      } 

      //Toast.makeText(getApplicationContext(), intent.getStringExtra("SCAN_RESULT_FORMAT") + ":" + intent.getStringExtra("SCAN_RESULT"), 5000).show(); 
     } else if (resultCode == RESULT_CANCELED) { 
      textViewFormat.setText(""); 
      textViewData.setText("Cancelled By user"); 
     } 

    } 
} 


/** 
* This method used for converting BitMatrix to BitMap 
* @param matrix 
* @return bitmap 
*/ 
public static Bitmap toBitmap(BitMatrix bitMatrix){ 
    int height = bitMatrix.getHeight(); 
    int width = bitMatrix.getWidth(); 
    Bitmap bmp = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565); 
    for (int x = 0; x < width; x++){ 
     for (int y = 0; y < height; y++){ 
      bmp.setPixel(x, y, bitMatrix.get(x,y) ? Color.BLACK : Color.WHITE); 
     } 
    } 
    return bmp; 
} 

见我git source code

+0

请不要乱丢这个论坛,回答不解决问题。 – greenapps

+0

在这个应用程序中会有很多问题....一个会在manufesto文件中,另一个会是接收结果..我只是告诉他这个例子....并分享我的git链接以获得更多的说明。 。顺便谢谢你的建议... –