2012-06-13 33 views
11

Tôi đang sử dụng thành công zxing để quét mã, bằng cách gọi ý định của người đọc mã vạch đã cài đặt, nhưng khi nó phát ra tiếng bíp và cho biết hoạt động quét tốt, tôi mong đợi hoạt động zxing sẽ trả về quyền kiểm soát có thể xử lý kết quả, nhưng nó nằm ở đó và cố gắng quét lại. Tôi phải bấm nút quay lại và rồi nó sẽ trở lại và tôi có thể thực hiện bước tiếp theo. Có một số lá cờ rõ ràng tôi đang thiếu khi tôi gọi máy quét?android: quét mã vạch zxing thành công nhưng không quay trở lại hoạt động

Bất kỳ lời khuyên nào được biết ơn. Cảm ơn nhiều.

Dưới đây là mã của tôi:

public boolean onTouchEvent(final MotionEvent event) { 

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

    return true; 
    } 

public void onActivityResult(int requestCode, int resultCode, Intent intent) { 

    super.onActivityResult(requestCode, resultCode, intent); 

    if (requestCode == 0) { 
     if (resultCode == RESULT_OK) { 
      String contents = intent.getStringExtra("SCAN_RESULT"); 
      String format = intent.getStringExtra("SCAN_RESULT_FORMAT"); 

      // Handle successful scan 

      String s = "http://www.google.com/search?q="; 
      s += contents; 
      Intent myIntent1 = new Intent(Intent.ACTION_VIEW, Uri.parse(s)); 
      startActivity(myIntent1); 
      } 
     else 
      if (resultCode == RESULT_CANCELED) { 
       // Handle cancel 
       } 
      } 
     } 
    } 

Trả lời

4

Tại sao không sử dụng lớp học IntentIntegrator được cung cấp? Đây là cách tiếp cận duy nhất được đề cập trong tài liệu dự án, bạn có xem xét các tài liệu đó không? https://github.com/zxing/zxing/wiki/Scanning-Via-Intent

Tôi đã tạo nó để bao bọc các chi tiết gửi và phân tích ý định này, vì vậy bạn không mắc lỗi chính tả. Ví dụ: không có điều gì như "com.google.zxing.client.android.SCAN.SCAN_MODE" bổ sung.

+0

Xin lỗi Sean, tôi là noob: import com.google.zxing.integration.android.IntentIntegrator; không thành công vì com.google không thể giải quyết được. Tôi có thiếu liên kết ở đâu đó không? Cảm ơn nhiều. – Barry

+0

OK, tất cả đều hoạt động! Xin lỗi, tôi đã không nhận ra bạn có nghĩa là thêm hai lớp học toàn bộ vào ứng dụng của tôi (IntentIntegrator và IntentResult). Kế hoạch ban đầu, sử dụng khoảng 10 dòng mã để gọi máy quét được cài đặt là lý tưởng nếu tôi có thể tìm ra cách để nó hoạt động. Bằng cách đó cập nhật cho các máy quét = cập nhật cho ứng dụng của tôi quá, theo cách này tôi phải giữ một mắt trên những thay đổi của bạn bằng tay: (Điều bạn nói không tồn tại đến từ [link] (http://stackoverflow.com/questions/2050263/sử dụng-zxing-to-create-an-android-mã vạch-quét-ứng dụng) - một cuộc trò chuyện bạn đã tham gia vào năm ngoái. Cảm ơn bạn đã giúp đỡ – Barry

1

Thêm finishActivity (requestCode); ở cuối phương thức onActivityResult().

Hãy thử cách này: Thay thế 2 dòng đầu tiên của bạn trong onTouch bằng mã bên dưới. Có vẻ như vấn đề là khi quét mã ngoài QR. Vui lòng xóa bộ lọc quét và kiểm tra một lần.

Intent intent = new Intent ("com.google.zxing.client.android.SCAN"); intent.addFlags (Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);

+0

Xin lỗi Alfi, đó là * sau * sự cố. Thực hiện không bao giờ đạt đến '// xử lý quét thành công' cho đến khi tôi nhấn phím trở lại. Dường như nó được lặp trên chính bản thân quét và không bao giờ chuyển điều khiển trở lại mã của tôi chút nào. – Barry

+0

Bạn chỉ quét mã QR, như mã của bạn cho thấy? Nếu bạn thử và quét 1D và ma trận nó vẫn hiển thị các chấm màu xanh lá cây mà không thực sự quét bất cứ điều gì. – Alfred

+0

Với mã ở trên nó quét thành công QR và EAN13 vv, nhưng đây là lần đầu tiên tôi nhúng vào zxing để bất kỳ con trỏ khác được chào đón, nhưng vấn đề chính của tôi là nhận được zxing để cho đi khi nó được một kết quả tốt. – Barry

10

Dưới đây là câu trả lời đầy đủ cho câu hỏi của riêng tôi, hy vọng điều này sẽ giúp người:

Go here và sao chép các lớp toàn IntentIntegrator, thêm nó vào ứng dụng của bạn; cũng đi here và sao chép lớp IntentResult vào ứng dụng của bạn. Bây giờ thêm video này vào hoạt động của bạn (hoặc kích hoạt quá trình quét bởi một nút/bất cứ điều gì):

public boolean onTouchEvent(final MotionEvent event) { 

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

    return true; 
    } 

public void onActivityResult(int requestCode, int resultCode, Intent intent) { 
     IntentResult scanResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, intent); 
     if (scanResult != null) { 
     // handle scan result 
      String s = "http://www.google.com/search?q="; 
      s += scanResult.getContents(); 

      Intent myIntent1 = new Intent(Intent.ACTION_VIEW, Uri.parse(s)); 
      startActivity(myIntent1); 
     } 
     // else continue with any other code you need in the method 
     //... 
    } 

Nó đã có tuyệt vời để chỉ cần gọi các dịch vụ được cung cấp bởi các ứng dụng máy quét mã vạch và không sao chép và dán khối mã vào ứng dụng của riêng bạn nhưng điều này có vẻ là cách được đề xuất: (

+0

Tôi không chắc chắn tôi hiểu nhận xét cuối cùng của bạn. là số tiền tối thiểu của mã bạn có thể sao chép và dán vì bạn đang sử dụng thư viện tích hợp được cung cấp. Xin lỗi, nó không thể là 0 dòng của khóa học.Bạn không thể sử dụng thư viện tích hợp.Nhưng sau đó bạn sẽ viết lại mã của nó, Chắc chắn, hãy làm điều đó nếu bạn thích - sự khác nhau giữa việc tái phát minh mã cần thiết là gì, và sao chép mã được cung cấp cần thiết? –

+0

Xin lỗi Sean, tôi không có ý định rên rỉ (tho tôi có thể đã làm - đó là một ngày dài, tôi xin lỗi) .Bản gốc của tôi, được sao chép từ một câu trả lời trước đây ở đây, là một vài các dòng sử dụng ý định được cung cấp bởi ứng dụng của bạn, điều này sẽ hoàn hảo. Bạn đề nghị tôi sử dụng IntentIntegrator đó là một con đường khác nhau, và tất nhiên nó hoạt động hoàn hảo. Hack đầu tiên của tôi là * rất gần * - nếu tôi có thể có ý định của bạn để phát hành sau khi quét thành công, tôi sẽ có chức năng trong 10 dòng, thay vì thêm 500 dòng và hai lớp. Chúc mừng, B. – Barry

1

Tôi đã gặp vấn đề tương tự vì vậy tôi đã thử sử dụng lớp IntentIntegrator theo đề xuất của Sean Owen. Tôi vẫn gặp sự cố cho đến khi tôi nhận ra điều này chỉ xảy ra khi thử để quét mã vạch theo chiều dọc (thường xuyên nhất trên điện thoại), nó chỉ ra rằng sự thay đổi định hướng từ chân dung thành cảnh quan làm cho quét hai lần. Tôi đã giải quyết điều này bằng cách thêm android:configChanges="orientation|keyboardHidden|screenSize" vào hoạt động trong biểu hiện. Bạn có thể chỉ cần định hướng một, nhưng đó là chưa được kiểm chứng.

Đối với bất kỳ người dùng gặp sự cố này khi tạo Adobe AIR Native Extension, hãy đảm bảo thêm dòng đó không chỉ vào tệp kê khai dự án Android của bạn mà còn vào thẻ hoạt động của bạn trong phần bổ sung tệp kê khai android trong tệp app.xml của bạn.

+0

Nó giúp nếu hoạt động mà từ đó bạn bắt đầu CaptureActivity, đang ở chế độ ngang. Tôi đã thêm 'android: screenOrientation =" landscape "' vào hoạt động đó trong Tệp kê khai. Mà làm việc cho tôi. – Christine

0

Đây là giải pháp mà tôi đang sử dụng. Nó làm việc tốt cho tôi.

Intent intent = new Intent(SelectOptionActivity.this, CaptureActivity.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"); 
       intent.setAction(Intents.Scan.ACTION); 
       startActivityForResult(intent, 1); 


public void onActivityResult(int requestCode, int resultCode, Intent intent) { 
     if (requestCode == 1 && resultCode == RESULT_OK) { 
      final String contents = intent.getStringExtra(Intents.Scan.RESULT); 
      final String formatName = intent.getStringExtra(Intents.Scan.RESULT_FORMAT); 

     } 
    } 
Các vấn đề liên quan