2016-01-27 54 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鏈接以獲得更多的說明。 。順便謝謝你的建議... –