扫描条形码时,Zxing库的CaptureActivity没有返回

奥洛金

我已经在我的应用程序中集成了zxing库,我曾经通过intent调用zxing:

    Intent intent = new Intent("com.google.zxing.client.android.SCAN");
    intent.putExtra("SCAN_MODE", "ONE_D_MODE");
    intent.putExtra("SCAN_FORMATS", "CODE_39,CODE_93,CODE_128,DATA_MATRIX,ITF,CODABAR,EAN_13,EAN_8,UPC_A,QR_CODE");
    startActivityForResult(intent, 1);

但是com.google.zxing.client.android.SCAN允许用户选择扫描应用程序(如果他还有另一个条形码扫描仪),我希望如果用户从我的应用程序开始扫描,而不是统计我的zxing CaptureActivity.class,我会通过意图调用它

    Intent intent = new Intent(this, CaptuureActivity.class);
    intent.putExtra("SCAN_MODE", "ONE_D_MODE");
    intent.putExtra("SCAN_FORMATS", "CODE_39,CODE_93,CODE_128,DATA_MATRIX,ITF,CODABAR,EAN_13,EAN_8,UPC_A,QR_CODE");
    startActivityForResult(intent, 1);

但是,当“捕获活动”未检测到条形码时,什么也没有发生,它并没有返回到先前的活动。

这是CaptureACtivity:

public final class CaptureActivity extends Activity implements SurfaceHolder.Callback {

    private static final String TAG = CaptureActivity.class.getSimpleName();

   private static final long DEFAULT_INTENT_RESULT_DURATION_MS = 1500L;
    private static final long BULK_MODE_SCAN_DELAY_MS = 1000L;
private static final String[] ZXING_URLS = { "http://zxing.appspot.com/scan", "zxing://scan/" };

public static final int HISTORY_REQUEST_CODE = 0x0000bacc;

private static final Collection<ResultMetadataType> DISPLAYABLE_METADATA_TYPES =
        EnumSet.of(ResultMetadataType.ISSUE_NUMBER,
                ResultMetadataType.SUGGESTED_PRICE,
                ResultMetadataType.ERROR_CORRECTION_LEVEL,
                ResultMetadataType.POSSIBLE_COUNTRY);

private CameraManager cameraManager;
private CaptureActivityHandler handler;
private Result savedResultToShow;
private ViewfinderView viewfinderView;
private TextView statusView;
private View resultView;
private Result lastResult;
private boolean hasSurface;
private boolean copyToClipboard;
private IntentSource source;
private String sourceUrl;
private ScanFromWebPageManager scanFromWebPageManager;
private Collection<BarcodeFormat> decodeFormats;
private Map<DecodeHintType,?> decodeHints;
private String characterSet;
private HistoryManager historyManager;
private InactivityTimer inactivityTimer;
private BeepManager beepManager;
private AmbientLightManager ambientLightManager;

ViewfinderView getViewfinderView() {
    return viewfinderView;
}

public Handler getHandler() {
    return handler;
}

CameraManager getCameraManager() {
    return cameraManager;
}

@Override
public void onCreate(Bundle icicle) {
    super.onCreate(icicle);

    Window window = getWindow();
    window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    setContentView(R.layout.capture);

    hasSurface = false;
    historyManager = new HistoryManager(this);
    historyManager.trimHistory();
    inactivityTimer = new InactivityTimer(this);
    beepManager = new BeepManager(this);
    ambientLightManager = new AmbientLightManager(this);

    PreferenceManager.setDefaultValues(this, R.xml.preferences, false);
}

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

    // CameraManager must be initialized here, not in onCreate(). This is necessary because we don't
    // want to open the camera driver and measure the screen size if we're going to show the help on
    // first launch. That led to bugs where the scanning rectangle was the wrong size and partially
    // off screen.
    cameraManager = new CameraManager(getApplication());

    viewfinderView = (ViewfinderView) findViewById(R.id.viewfinder_view);
    viewfinderView.setCameraManager(cameraManager);

    resultView = findViewById(R.id.result_view);
    statusView = (TextView) findViewById(R.id.status_view);

    handler = null;
    lastResult = null;

    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);

//    if (prefs.getBoolean(PreferencesActivity.KEY_DISABLE_AUTO_ORIENTATION, true)) {
//      setRequestedOrientation(getCurrentOrientation());
//    } else {
//      setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);

//    }

        resetStatusView();
    SurfaceView surfaceView = (SurfaceView) findViewById(R.id.preview_view);
    SurfaceHolder surfaceHolder = surfaceView.getHolder();
    if (hasSurface) {
        // The activity was paused but not stopped, so the surface still exists. Therefore
        // surfaceCreated() won't be called, so init the camera here.
        initCamera(surfaceHolder);
    } else {
        // Install the callback and wait for surfaceCreated() to init the camera.
        surfaceHolder.addCallback(this);
    }

    beepManager.updatePrefs();
    ambientLightManager.start(cameraManager);

    inactivityTimer.onResume();

    Intent intent = getIntent();

    copyToClipboard = prefs.getBoolean(PreferencesActivity.KEY_COPY_TO_CLIPBOARD, true)
            && (intent == null || intent.getBooleanExtra(Intents.Scan.SAVE_HISTORY, true));

    source = IntentSource.NONE;
    decodeFormats = null;
    characterSet = null;

    if (intent != null) {

        String action = intent.getAction();
        String dataString = intent.getDataString();

        if (Intents.Scan.ACTION.equals(action)) {

            to the calling activity.
            source = IntentSource.NATIVE_APP_INTENT;
            decodeFormats = DecodeFormatManager.parseDecodeFormats(intent);
            decodeHints = DecodeHintManager.parseDecodeHints(intent);


            if (intent.hasExtra(Intents.Scan.WIDTH) && intent.hasExtra(Intents.Scan.HEIGHT)) {
                int width = intent.getIntExtra(Intents.Scan.WIDTH, 0);
                int height = intent.getIntExtra(Intents.Scan.HEIGHT, 0);
                if (width > 0 && height > 0) {
                    cameraManager.setManualFramingRect(width, height);
                }
            }

            String customPromptMessage = intent.getStringExtra(Intents.Scan.PROMPT_MESSAGE);
            if (customPromptMessage != null) {
                statusView.setText(customPromptMessage);
            }

        } else if (dataString != null &&
                dataString.contains("http://www.google") &&
                dataString.contains("/m/products/scan")) {

            // Scan only products and send the result to mobile Product Search.
            source = IntentSource.PRODUCT_SEARCH_LINK;
            sourceUrl = dataString;
            decodeFormats = DecodeFormatManager.PRODUCT_FORMATS;

        } else if (isZXingURL(dataString)) {

            // Scan formats requested in query string (all formats if none specified).
            // If a return URL is specified, send the results there. Otherwise, handle it ourselves.
            source = IntentSource.ZXING_LINK;
            sourceUrl = dataString;
            Uri inputUri = Uri.parse(dataString);
            scanFromWebPageManager = new ScanFromWebPageManager(inputUri);
            decodeFormats = DecodeFormatManager.parseDecodeFormats(inputUri);
            // Allow a sub-set of the hints to be specified by the caller.
            decodeHints = DecodeHintManager.parseDecodeHints(inputUri);

        }

        characterSet = intent.getStringExtra(Intents.Scan.CHARACTER_SET);

    }
}

private int getCurrentOrientation() {
    int rotation = getWindowManager().getDefaultDisplay().getRotation();
    switch (rotation) {
        case Surface.ROTATION_0:
        case Surface.ROTATION_90:
            return ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
        default:
            return ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
    }
}

private static boolean isZXingURL(String dataString) {
    if (dataString == null) {
        return false;
    }
    for (String url : ZXING_URLS) {
        if (dataString.startsWith(url)) {
            return true;
        }
    }
    return false;
}

@Override
protected void onPause() {
    if (handler != null) {
        handler.quitSynchronously();
        handler = null;
    }
    inactivityTimer.onPause();
    ambientLightManager.stop();
    cameraManager.closeDriver();
    if (!hasSurface) {
       /* SurfaceView surfaceView = (SurfaceView) findViewById(R.id.preview_view);
        SurfaceHolder surfaceHolder = surfaceView.getHolder();
        surfaceHolder.removeCallback(this);*/
    }
    super.onPause();
}

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

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    switch (keyCode) {
        case KeyEvent.KEYCODE_BACK:
            if (source == IntentSource.NATIVE_APP_INTENT) {
                setResult(RESULT_CANCELED);
                finish();
                return true;
            }
            if ((source == IntentSource.NONE || source == IntentSource.ZXING_LINK) && lastResult != null) {
                restartPreviewAfterDelay(0L);
                return true;
            }
            break;
        case KeyEvent.KEYCODE_FOCUS:
        case KeyEvent.KEYCODE_CAMERA:
            // Handle these events so they don't launch the Camera app
            return true;
        // Use volume up/down to turn on light
        case KeyEvent.KEYCODE_VOLUME_DOWN:
            cameraManager.setTorch(false);
            return true;
        case KeyEvent.KEYCODE_VOLUME_UP:
            cameraManager.setTorch(true);
            return true;
    }
    return super.onKeyDown(keyCode, event);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater menuInflater = getMenuInflater();
    menuInflater.inflate(R.menu.capture, menu);
    return super.onCreateOptionsMenu(menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
    switch (item.getItemId()) {
        case R.id.menu_share:
            intent.setClassName(this, ShareActivity.class.getName());
            startActivity(intent);
            break;
        case R.id.menu_history:
            intent.setClassName(this, HistoryActivity.class.getName());
            startActivityForResult(intent, HISTORY_REQUEST_CODE);
            break;
        case R.id.menu_settings:
            intent.setClassName(this, PreferencesActivity.class.getName());
            startActivity(intent);
            break;
        case R.id.menu_help:
            intent.setClassName(this, HelpActivity.class.getName());
            startActivity(intent);
            break;
        default:
            return super.onOptionsItemSelected(item);
    }
    return true;
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
    if (resultCode == RESULT_OK) {
        if (requestCode == HISTORY_REQUEST_CODE) {
            int itemNumber = intent.getIntExtra(Intents.History.ITEM_NUMBER, -1);
            if (itemNumber >= 0) {

                HistoryItem historyItem = historyManager.buildHistoryItem(itemNumber);
                decodeOrStoreSavedBitmap(null, historyItem.getResult());
            }
        }
    }
}

private void decodeOrStoreSavedBitmap(Bitmap bitmap, Result result) {
    // Bitmap isn't used yet -- will be used soon
    if (handler == null) {
        savedResultToShow = result;
    } else {
        if (result != null) {
            savedResultToShow = result;
        }
        if (savedResultToShow != null) {
            Message message = Message.obtain(handler, R.id.decode_succeeded, savedResultToShow);
            handler.sendMessage(message);
        }
        savedResultToShow = null;
    }
}

@Override
public void surfaceCreated(SurfaceHolder holder) {
    if (holder == null) {
        Log.e(TAG, "*** WARNING *** surfaceCreated() gave us a null surface!");
    }
    if (!hasSurface) {
        hasSurface = true;
        initCamera(holder);
    }
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
    hasSurface = false;
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

}

/**
 * A valid barcode has been found, so give an indication of success and show the results.
 *
 * @param rawResult The contents of the barcode.
 * @param scaleFactor amount by which thumbnail was scaled
 * @param barcode   A greyscale bitmap of the camera data which was decoded.
 */
public void handleDecode(Result rawResult, Bitmap barcode, float scaleFactor) {
    inactivityTimer.onActivity();
    lastResult = rawResult;
    ResultHandler resultHandler = ResultHandlerFactory.makeResultHandler(this, rawResult);

    boolean fromLiveScan = barcode != null;
    if (fromLiveScan) {
        historyManager.addHistoryItem(rawResult, resultHandler);
        // Then not from history, so beep/vibrate and we have an image to draw on
        beepManager.playBeepSoundAndVibrate();
        //drawResultPoints(barcode, scaleFactor, rawResult);
    }

    switch (source) {
        case NATIVE_APP_INTENT:
            handleDecodeExternally(rawResult, resultHandler, barcode);
            break;
        case PRODUCT_SEARCH_LINK:
            handleDecodeExternally(rawResult, resultHandler, barcode);
            break;
        case ZXING_LINK:
            if (scanFromWebPageManager == null || !scanFromWebPageManager.isScanFromWebPage()) {
                handleDecodeInternally(rawResult, resultHandler, barcode);

            } else {
                handleDecodeExternally(rawResult, resultHandler, barcode);
            }
            break;
        case NONE:
            SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
            if (fromLiveScan && prefs.getBoolean(PreferencesActivity.KEY_BULK_MODE, false)) {
                Toast.makeText(getApplicationContext(),
                        getResources().getString(R.string.msg_bulk_mode_scanned) + " (" + rawResult.getText() + ')',
                        Toast.LENGTH_SHORT).show();
                // Wait a moment or else it will scan the same barcode continuously about 3 times
               // restartPreviewAfterDelay(BULK_MODE_SCAN_DELAY_MS);
            } else {
                handleDecodeInternally(rawResult, resultHandler, barcode);
            }
            break;
    }
}

/**
 * Superimpose a line for 1D or dots for 2D to highlight the key features of the barcode.
 *
 * @param barcode   A bitmap of the captured image.
 * @param scaleFactor amount by which thumbnail was scaled
 * @param rawResult The decoded results which contains the points to draw.
 */
private void drawResultPoints(Bitmap barcode, float scaleFactor, Result rawResult) {
    ResultPoint[] points = rawResult.getResultPoints();
    if (points != null && points.length > 0) {
        Canvas canvas = new Canvas(barcode);
        Paint paint = new Paint();
        paint.setColor(getResources().getColor(R.color.result_points));
        if (points.length == 2) {
            paint.setStrokeWidth(4.0f);
            drawLine(canvas, paint, points[0], points[1], scaleFactor);
        } else if (points.length == 4 &&
                (rawResult.getBarcodeFormat() == BarcodeFormat.UPC_A ||
                        rawResult.getBarcodeFormat() == BarcodeFormat.EAN_13)) {
            // Hacky special case -- draw two lines, for the barcode and metadata
            drawLine(canvas, paint, points[0], points[1], scaleFactor);
            drawLine(canvas, paint, points[2], points[3], scaleFactor);
        } else {
            paint.setStrokeWidth(10.0f);
            for (ResultPoint point : points) {
                if (point != null) {
                    canvas.drawPoint(scaleFactor * point.getX(), scaleFactor * point.getY(), paint);
                }
            }
        }
    }
}

private static void drawLine(Canvas canvas, Paint paint, ResultPoint a, ResultPoint b, float scaleFactor) {
    if (a != null && b != null) {
        canvas.drawLine(scaleFactor * a.getX(),
                scaleFactor * a.getY(),
                scaleFactor * b.getX(),
                scaleFactor * b.getY(),
                paint);
    }
}

// Put up our own UI for how to handle the decoded contents.
private void handleDecodeInternally(Result rawResult, ResultHandler resultHandler, Bitmap barcode) {

    CharSequence displayContents = resultHandler.getDisplayContents();

    if (copyToClipboard && !resultHandler.areContentsSecure()) {
        ClipboardInterface.setText(displayContents, this);
    }

    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);

    if (resultHandler.getDefaultButtonID() != null && prefs.getBoolean(PreferencesActivity.KEY_AUTO_OPEN_WEB, false)) {
        resultHandler.handleButtonPress(resultHandler.getDefaultButtonID());
        return;
    }

    statusView.setVisibility(View.VISIBLE);
    viewfinderView.setVisibility(View.VISIBLE);
    resultView.setVisibility(View.VISIBLE);


    /*ImageView barcodeImageView = (ImageView) findViewById(R.id.barcode_image_view);
    if (barcode == null) {
        barcodeImageView.setImageBitmap(BitmapFactory.decodeResource(getResources(),
                R.drawable.launcher_icon));
    } else {
        barcodeImageView.setImageBitmap(barcode);
    })*/

    TextView formatTextView = (TextView) findViewById(R.id.format_text_view);
    formatTextView.setText(rawResult.getBarcodeFormat().toString());

    TextView typeTextView = (TextView) findViewById(R.id.type_text_view);
    typeTextView.setText(resultHandler.getType().toString());

    DateFormat formatter = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT);
    TextView timeTextView = (TextView) findViewById(R.id.time_text_view);
    timeTextView.setText(formatter.format(new Date(rawResult.getTimestamp())));


    TextView metaTextView = (TextView) findViewById(R.id.meta_text_view);
    View metaTextViewLabel = findViewById(R.id.meta_text_view_label);
    metaTextView.setVisibility(View.GONE);
    metaTextViewLabel.setVisibility(View.GONE);
    Map<ResultMetadataType,Object> metadata = rawResult.getResultMetadata();
    if (metadata != null) {
        StringBuilder metadataText = new StringBuilder(20);
        for (Map.Entry<ResultMetadataType,Object> entry : metadata.entrySet()) {
            if (DISPLAYABLE_METADATA_TYPES.contains(entry.getKey())) {
                metadataText.append(entry.getValue()).append('\n');
            }
        }
        if (metadataText.length() > 0) {
            metadataText.setLength(metadataText.length() - 1);
            metaTextView.setText(metadataText);
            metaTextView.setVisibility(View.VISIBLE);
            metaTextViewLabel.setVisibility(View.VISIBLE);
        }
    }

    TextView contentsTextView = (TextView) findViewById(R.id.contents_text_view);
    contentsTextView.setText(displayContents);
    int scaledSize = Math.max(22, 32 - displayContents.length() / 4);
    contentsTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP, scaledSize);

    TextView supplementTextView = (TextView) findViewById(R.id.contents_supplement_text_view);
    supplementTextView.setText("");
    supplementTextView.setOnClickListener(null);
    if (PreferenceManager.getDefaultSharedPreferences(this).getBoolean(
            PreferencesActivity.KEY_SUPPLEMENTAL, true)) {
        SupplementalInfoRetriever.maybeInvokeRetrieval(supplementTextView,
                resultHandler.getResult(),
                historyManager,
                this);
    }

    int buttonCount = resultHandler.getButtonCount();
    ViewGroup buttonView = (ViewGroup) findViewById(R.id.result_button_view);
    buttonView.requestFocus();
    for (int x = 0; x < ResultHandler.MAX_BUTTON_COUNT; x++) {
        TextView button = (TextView) buttonView.getChildAt(x);
        if (x < buttonCount) {
            button.setVisibility(View.VISIBLE);
            button.setText(resultHandler.getButtonText(x));
            button.setOnClickListener(new ResultButtonListener(resultHandler, x));
        } else {
            button.setVisibility(View.GONE);
        }
    }

}

// Briefly show the contents of the barcode, then handle the result outside Barcode Scanner.
private void handleDecodeExternally(Result rawResult, ResultHandler resultHandler, Bitmap barcode) {

    if (barcode != null) {
        viewfinderView.drawResultBitmap(barcode);
    }

    long resultDurationMS;
    if (getIntent() == null) {
        resultDurationMS = 0;
    } else {
       resultDurationMS = getIntent().getLongExtra(Intents.Scan.RESULT_DISPLAY_DURATION_MS,
                0);
    }

    if (resultDurationMS > 0) {
        String rawResultString = String.valueOf(rawResult);
       if (rawResultString.length() > 32) {
            rawResultString = rawResultString.substring(0, 32) + " ...";
        }
        statusView.setText(getString(resultHandler.getDisplayTitle()) + " : " + rawResultString);
   }

    if (copyToClipboard && !resultHandler.areContentsSecure()) {
        CharSequence text = resultHandler.getDisplayContents();
        ClipboardInterface.setText(text, this);
    }

    if (source == IntentSource.NATIVE_APP_INTENT) {

        // Hand back whatever action they requested - this can be changed to Intents.Scan.ACTION when
        // the deprecated intent is retired.
        Intent intent = new Intent(getIntent().getAction());
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
        intent.putExtra(Intents.Scan.RESULT, rawResult.toString());
        intent.putExtra(Intents.Scan.RESULT_FORMAT, rawResult.getBarcodeFormat().toString());
        setResult(Activity.RESULT_OK,intent);

        byte[] rawBytes = rawResult.getRawBytes();
        if (rawBytes != null && rawBytes.length > 0) {
            intent.putExtra(Intents.Scan.RESULT_BYTES, rawBytes);
        }
        Map<ResultMetadataType,?> metadata = rawResult.getResultMetadata();
        if (metadata != null) {
            if (metadata.containsKey(ResultMetadataType.UPC_EAN_EXTENSION)) {
                intent.putExtra(Intents.Scan.RESULT_UPC_EAN_EXTENSION,
                        metadata.get(ResultMetadataType.UPC_EAN_EXTENSION).toString());
            }
            Number orientation = (Number) metadata.get(ResultMetadataType.ORIENTATION);
            if (orientation != null) {
                intent.putExtra(Intents.Scan.RESULT_ORIENTATION, orientation.intValue());
            }
            String ecLevel = (String) metadata.get(ResultMetadataType.ERROR_CORRECTION_LEVEL);
            if (ecLevel != null) {
                intent.putExtra(Intents.Scan.RESULT_ERROR_CORRECTION_LEVEL, ecLevel);
            }
            @SuppressWarnings("unchecked")
            Iterable<byte[]> byteSegments = (Iterable<byte[]>) metadata.get(ResultMetadataType.BYTE_SEGMENTS);
            if (byteSegments != null) {
                int i = 0;
                for (byte[] byteSegment : byteSegments) {
                    intent.putExtra(Intents.Scan.RESULT_BYTE_SEGMENTS_PREFIX + i, byteSegment);
                    i++;
                }
            }
        }
        sendReplyMessage(R.id.return_scan_result, intent, 0);

    } else if (source == IntentSource.PRODUCT_SEARCH_LINK) {

        // Reformulate the URL which triggered us into a query, so that the request goes to the same
        // TLD as the scan URL.
        int end = sourceUrl.lastIndexOf("/scan");
        String replyURL = sourceUrl.substring(0, end) + "?q=" + resultHandler.getDisplayContents() + "&source=zxing";
        sendReplyMessage(R.id.launch_product_query, replyURL, 0);

    } else if (source == IntentSource.ZXING_LINK) {

        if (scanFromWebPageManager != null && scanFromWebPageManager.isScanFromWebPage()) {
            String replyURL = scanFromWebPageManager.buildReplyURL(rawResult, resultHandler);
            sendReplyMessage(R.id.launch_product_query, replyURL, 0);
        }

    }
}

private void sendReplyMessage(int id, Object arg, long delayMS) {
    if (handler != null) {
        Message message = Message.obtain(handler, id, arg);
        if (delayMS > 0L) {
            handler.sendMessageDelayed(message, delayMS);
        } else {
            handler.sendMessage(message);
        }
    }
}

private void initCamera(SurfaceHolder surfaceHolder) {
    if (surfaceHolder == null) {
        throw new IllegalStateException("No SurfaceHolder provided");
    }
    if (cameraManager.isOpen()) {
        Log.w(TAG, "initCamera() while already open -- late SurfaceView callback?");
        return;
    }
    try {
        cameraManager.openDriver(surfaceHolder);
        // Creating the handler starts the preview, which can also throw a RuntimeException.
        if (handler == null) {
            handler = new CaptureActivityHandler(this, decodeFormats, decodeHints, characterSet, cameraManager);
        }
        decodeOrStoreSavedBitmap(null, null);
    } catch (IOException ioe) {
        Log.w(TAG, ioe);
        displayFrameworkBugMessageAndExit();
    } catch (RuntimeException e) {
        // Barcode Scanner has seen crashes in the wild of this variety:
        // java.?lang.?RuntimeException: Fail to connect to camera service
        Log.w(TAG, "Unexpected error initializing camera", e);
        displayFrameworkBugMessageAndExit();
    }
}

private void displayFrameworkBugMessageAndExit() {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle(getString(R.string.app_name));
    builder.setMessage(getString(R.string.msg_camera_framework_bug));
    builder.setPositiveButton(R.string.button_ok, new FinishListener(this));
    builder.setOnCancelListener(new FinishListener(this));
    builder.show();
}

public void restartPreviewAfterDelay(long delayMS) {
    if (handler != null) {
        handler.sendEmptyMessageDelayed(R.id.restart_preview, delayMS);
    }
    resetStatusView();
}

private void resetStatusView() {
    resultView.setVisibility(View.GONE);
    statusView.setText(R.string.msg_default_status);
    statusView.setVisibility(View.VISIBLE);
    viewfinderView.setVisibility(View.VISIBLE);
    lastResult = null;
}

public void drawViewfinder() {
        viewfinderView.drawViewfinder();
    }
}

RESULT_OK进去了

            if (source == IntentSource.NATIVE_APP_INTENT) { 
            Intent intent = new Intent(getIntent().getAction());
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
            intent.putExtra(Intents.Scan.RESULT, rawResult.toString());
            intent.putExtra(Intents.Scan.RESULT_FORMAT, rawResult.getBarcodeFormat().toString());
            setResult(Activity.RESULT_OK,intent)
            ......

我在做什么错?

还有一个问题,当我调用扫描com.google.zxing.client.android.SCAN并捕获条形码时,活动没有立即关闭,它等待大约500-1000毫秒,如何禁用此功能?谢谢答案

用户名

开始时,在这里添加第三行,就是这样,这些家伙不需要在Zxing代码中进行任何更改

        Intent intent = new Intent(getApplicationContext(), CaptureActivity.class);
        intent.putExtra("SCAN_FORMATS", "QR_CODE,EAN_13,EAN_8,RSS_14,UPC_A,UPC_E,CODE_39,CODE_93,CODE_128,ITF,CODABAR,DATA_MATRIX");
        intent.setAction(Intents.Scan.ACTION);
        startActivityForResult(intent, 0);

顺便说一下,我正在使用Zxing版本3.2.0

就像添加我用来从Zxing接收输出的代码一样:

public void onActivityResult(int requestCode, int resultCode, Intent intent) {
    if (resultCode == Activity.RESULT_OK) {
        String contents = intent.getStringExtra(Intents.Scan.RESULT);
        String formatName = intent.getStringExtra(Intents.Scan.RESULT_FORMAT);
        tvStatus.setText(formatName);
        tvScanResults.setText(contents + "\n\n" + formatName);
    } else if (resultCode == Activity.RESULT_CANCELED) {
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用zxing扫描条形码并使用jsonp返回?

来自分类Dev

如何在不安装实际的zxing应用程序的情况下集成Zxing条形码扫描仪(无法解析符号:.android.CaptureActivity)?

来自分类Dev

Android:使用zxing进行条形码扫描并以片段形式返回结果

来自分类Dev

使用Zbar或Zxing在各个方向进行条形码扫描

来自分类Dev

在Java中使用Zxing扫描多个条形码

来自分类Dev

Zxing-动态更改扫描的条形码类型

来自分类Dev

使用Zbar或Zxing在各个方向进行条形码扫描

来自分类Dev

扫描的条形码很少,但很少使用Zxing

来自分类Dev

在Java中使用Zxing扫描多个条形码

来自分类Dev

Android-UI:使用硬件键盘/条形码扫描仪时没有焦点标记

来自分类Dev

使用ZXing库处理大数据时无法生成条形码

来自分类Dev

如何使条形码扫描仪从数据库中检查条形码编号?

来自分类Dev

条形码扫描损坏

来自分类Dev

ZXing:查找条形码的边界矩形

来自分类Dev

生成的条形码Zxing Android的大小

来自分类Dev

ZXing:查找条形码的边界矩形

来自分类Dev

随着Zxing for iOS的退出,要切换到哪个条形码扫描仪?

来自分类Dev

如何将ZXing Library集成到Android Studio进行条形码扫描?

来自分类Dev

在Android应用中使用zxing扫描条形码阅读器数据

来自分类Dev

如何从Zxing调用扫描的条形码历史记录

来自分类Dev

如何从Zxing调用扫描的条形码历史记录

来自分类Dev

用zxing源代码和核心java创建条形码扫描仪

来自分类Dev

将Zxing条形码扫描仪集成到我的android应用中

来自分类Dev

是否有一个Android条形码库,其功能可以简单地传递条形码的位图并返回值?

来自分类Dev

在WebView Android中扫描条形码

来自分类Dev

如何模拟条形码扫描事件

来自分类Dev

从移动网站扫描条形码?

来自分类Dev

条形码128的宽窄比没有任何影响

来自分类Dev

用于条形码扫描的VBA Excel代码,可返回扫描时间

Related 相关文章

  1. 1

    如何使用zxing扫描条形码并使用jsonp返回?

  2. 2

    如何在不安装实际的zxing应用程序的情况下集成Zxing条形码扫描仪(无法解析符号:.android.CaptureActivity)?

  3. 3

    Android:使用zxing进行条形码扫描并以片段形式返回结果

  4. 4

    使用Zbar或Zxing在各个方向进行条形码扫描

  5. 5

    在Java中使用Zxing扫描多个条形码

  6. 6

    Zxing-动态更改扫描的条形码类型

  7. 7

    使用Zbar或Zxing在各个方向进行条形码扫描

  8. 8

    扫描的条形码很少,但很少使用Zxing

  9. 9

    在Java中使用Zxing扫描多个条形码

  10. 10

    Android-UI:使用硬件键盘/条形码扫描仪时没有焦点标记

  11. 11

    使用ZXing库处理大数据时无法生成条形码

  12. 12

    如何使条形码扫描仪从数据库中检查条形码编号?

  13. 13

    条形码扫描损坏

  14. 14

    ZXing:查找条形码的边界矩形

  15. 15

    生成的条形码Zxing Android的大小

  16. 16

    ZXing:查找条形码的边界矩形

  17. 17

    随着Zxing for iOS的退出,要切换到哪个条形码扫描仪?

  18. 18

    如何将ZXing Library集成到Android Studio进行条形码扫描?

  19. 19

    在Android应用中使用zxing扫描条形码阅读器数据

  20. 20

    如何从Zxing调用扫描的条形码历史记录

  21. 21

    如何从Zxing调用扫描的条形码历史记录

  22. 22

    用zxing源代码和核心java创建条形码扫描仪

  23. 23

    将Zxing条形码扫描仪集成到我的android应用中

  24. 24

    是否有一个Android条形码库,其功能可以简单地传递条形码的位图并返回值?

  25. 25

    在WebView Android中扫描条形码

  26. 26

    如何模拟条形码扫描事件

  27. 27

    从移动网站扫描条形码?

  28. 28

    条形码128的宽窄比没有任何影响

  29. 29

    用于条形码扫描的VBA Excel代码,可返回扫描时间

热门标签

归档