2016-03-18 43 views
5

używam biblioteki ZXing, w pełni zintegrowany z plików JAR w moim Android app i mam następujący problem:ZXing podwójnego obrazu/nakładkę po skanowaniu

Problem:

Po zeskanowaniu kodu kreskowego, zeskanowany obraz pozostaje na wierzchu obrazu z kamery na żywo z około 50% przezroczystością przez około 1-2 sekundy.

Pytanie:

Czy istnieje jakiś sposób, aby mieć tylko skanowany obraz pojawi się na 0% przejrzystości, zamiast dziwne nakładki? Lub, jeszcze lepiej, może pokazać niestandardowy fragment?

Dziękuję.

Kod: [W/O niezwiązanych elementów]

public static void initiateScan(Fragment fragment) { 
    IntentIntegrator ii = new IntentIntegrator(fragment); 
    DisplayMetrics dm = fragment.getResources().getDisplayMetrics(); 
    ii.addExtra("SCAN_WIDTH", dm.heightPixels); 
    ii.addExtra("SCAN_HEIGHT", dm.widthPixels/4); 
    ii.addExtra("SCAN_MODE", "ONE_D_MODE"); 

    List<String> c = new ArrayList<String>(); 
    c.add("CODE_39"); 

    ii.initiateScan(c, -1); 
} 

public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    if(requestCode==IntentIntegrator.REQUEST_CODE) { // scan from ZXing 
     String raw_vin=null; 
     String vin = null; 
     boolean success=false; 

     IntentResult result = IntentIntegrator.parseActivityResult(requestCode, 
           resultCode, data); 
     if(result!=null) 
     { 
      String content = result.getContents(); 
      if(content!=null) 
      { 
       raw_vin=content; 
       vin=raw_vin; 
       success=true; 
      } 
     } 
    } 
} 

przykład:

Example of double image

+0

jeśli używasz ZXing z kodem źródłowym można dostosować w zależności od zapotrzebowania – Pavan

+0

@Pavan Wszelkie sugestie lub wskazówki co do tego, gdzie będzie się znajdować? Masz pojęcie, co by się zmieniło, jeśli w ogóle możliwe? – Dima

+0

tutaj jest kod źródłowy, aby znaleźć aktywność lub widok, które chcesz dostosować https://github.com/zxing/zxing – Pavan

Odpowiedz

1

Tutaj, co mam na build.gradle pliku w zależności :

compile 'com.google.zxing:core:3.2.1' 
compile 'com.journeyapps:zxing-android-embedded:[email protected]' 

Spróbuj tego w metodzie initiateScan:

public static void initiateScan(Fragment fragment) { 
    IntentIntegrator ii = IntentIntegrator.forSupportFragment(fragment); 
    DisplayMetrics dm = fragment.getResources().getDisplayMetrics(); 
    ii.addExtra("SCAN_WIDTH", dm.heightPixels); 
    ii.addExtra("SCAN_HEIGHT", dm.widthPixels/4); 
    ii.addExtra("SCAN_MODE", "ONE_D_MODE"); 
    ii.initiateScan(Collections.singletonList("CODE_39")); 
} 

Daj mi znać, jak to działa dla Ciebie.

+0

To się skończyło; Dziękuję Ci. Dla niektórych osobiście uważam, że SCAN_MODE, SCAN_WIDTH, SCAN_HEIGHT nie są obsługiwane przez journeyapps. – Dima

+0

@Dima prawdopodobnie masz rację. Przeprowadziłem małe wyszukiwanie i nie mogłem ich znaleźć, ale zostawiłem je tam, ponieważ nie w pełni je przetestowałem. –

0

Nie jestem w stanie wyjaśnić, dlaczego ten problem się zdarza, ale używam ZXing do mojej aplikacji do skanowania kodów kreskowych bez 50% przezroczystości jak Ty. W poniższej moja rozwiązanie:

Układ:

<com.journeyapps.barcodescanner.CompoundBarcodeView 
    android:id="@+id/barcode_scanner" 
    android:layout_width="match_parent" 
    android:layout_height="200dp" 
    android:layout_margin="2dp"> 

</com.journeyapps.barcodescanner.CompoundBarcodeView> 

W fragmentu: function

private CompoundBarcodeView barcodeView; 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     if (container == null) { 
      return null; 
     } 

     View v = inflater.inflate(R.layout.webservice_layout, container, false); 

     barcodeView = (CompoundBarcodeView) v.findViewById(R.id.barcode_scanner); 

     barcodeView.decodeContinuous(callback); 
...... 
} 

oddzwanianie:

private BarcodeCallback callback = new BarcodeCallback() { 
     @Override 
     public void barcodeResult(BarcodeResult result) { 

      if (SOAP_ACTION.equals("") || SOAP_METHOD.equals("") || soapProperty.equals("")) { 
       barcodeView.pause(); 
      } else { 
       if (result.getText() != null) { 
        barcodeView.setStatusText(result.getText()); 

        barcodeView.pause(); 

        new Handler().postDelayed(new Runnable() { 
         @Override 
         public void run() { 
          barcodeView.resume(); 
         } 
        }, 1000); 
       } 
      } 
     } 
}; 

Mam nadzieję, że ta pomoc!

0

moje podejście jest następujące:

//start the scanning 
public void startQRCodeScanning() { 
    IntentIntegrator integrator = IntentIntegrator.forFragment(this); 
    integrator.setCaptureActivity(ScanActivity); 
    integrator.setDesiredBarcodeFormats(IntentIntegrator.QR_CODE_TYPES); 
    integrator.setBeepEnabled(false); 
    integrator.setOrientationLocked(true); 
    integrator.initiateScan(); 
} 

//onActivityResult: 
@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data); 
    if (result != null) { 
     if (result.getContents() == null) { 
      Log.d(TAG, "Cancelled scan"); 
      //we want to finish the current activity 
      //as it does not make sense to do anything else 
      finishActivity(); 
     } else { 
      Log.d(TAG, "Scanned " + result.getContents()); 
      setConnectionString(result.getContents()); 
     } 
    } else { 
     super.onActivityResult(requestCode, resultCode, data); 
    } 
} 

//next I have the QRCodeScanningActivity 

    public class QRCodeScannerActivity extends Activity { 

    private CaptureManager capture; 
    private CompoundBarcodeView barcodeScannerView; 

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

     if (getResources().getBoolean(R.bool.portrait_only)) { 
      setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
     } 

     ActionBar actionBar = getActionBar(); 
     if (actionBar != null) { 
      actionBar.setDisplayOptions(ActionBar.DISPLAY_HOME_AS_UP, ActionBar.DISPLAY_HOME_AS_UP); 
     } 

     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); 
    } 

    @Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) { 
     return barcodeScannerView.onKeyDown(keyCode, event) || super.onKeyDown(keyCode, event); 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     if (item.getItemId() == android.R.id.home) { 
      onBackPressed(); 
      return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 
} 

//Next you need to define the layouts and everything. 
    <RelativeLayout 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:app="http://schemas.android.com/apk/res-auto" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:background="@color/black"> 

    <com.journeyapps.barcodescanner.CompoundBarcodeView 
      android:id="@+id/zxing_barcode_scanner" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      app:zxing_scanner_layout="@layout/barcode_scanner_layout"/> 

    </FrameLayout> 
</RelativeLayout>