2011-11-04 28 views
10

Hiện tại thư viện zxing chỉ hỗ trợ chế độ nằm ngang.Đối với ứng dụng của tôi, tôi cần sử dụng ở chế độ dọcLàm thế nào để sử dụng Zxing ở chế độ dọc?

+1

Đây là những gì bạn có thể làm với ZXing 2.1. http://stackoverflow.com/questions/16252791/how-to-show-zxing-camera-in-portrait-mode-on-android/16252917#16252917 – Roylee

+0

Kể từ Zing 2.2.0, bạn có thể đặt định hướng cho thuộc tính , hãy tham khảo [answer] này (https://stackoverflow.com/a/44284764/2584794) – Anup

Trả lời

17

Chỉ cần xem vấn đề Sử dụng Zxing ở chế độ dọc.

+2

Liên kết này đã lỗi thời. –

+2

Liên kết dẫn đến vấn đề "Mã QR không hỗ trợ unicode" ... Kiểm tra https://github.com/journeyapps/zxing-android-embedded/issues/16 này thay vì – kristyna

+0

Nếu bạn đang sử dụng phiên bản 3.xx , khai báo định hướng trong AndroidManifest.xml. Để đọc thêm https://github.com/journeyapps/zxing-android-embedded/blob/master/README.md#changing-the-orientation – kristyna

5

setDisplayOrientation(int) không ảnh hưởng đến thứ tự của mảng byte được chuyển vào PreviewCallback.onPreviewFrame. (Tham khảo JavaDoc để biết thêm thông tin)

Điều này có nghĩa là bạn cần xoay dữ liệu từ chế độ xem trướcCallback, nhưng đây là dữ liệu yuv, bạn cần chuyển đổi sang dữ liệu rgb rồi xoay chúng. có thể quét mã vạch ở chế độ dọc nhưng sẽ mất nhiều thời gian hơn vì nó cần thêm thời gian để xử lý dữ liệu từ yuv sang rgb và xoay dữ liệu rgb. vì vậy vấn đề ở đây là làm thế nào chúng ta có thể nhận dữ liệu yuv từ previewcallback cho chế độ dọc? khi chúng tôi đặt setPreviewSize cho các thông số máy ảnh, nó sẽ bị loại trừ nếu việc xem trước không được hỗ trợ. Đây là vấn đề của vấn đề này. Nếu trình điều khiển máy ảnh không hỗ trợ previewSize cho chế độ dọc (chiều cao> chiều rộng), bạn không thể nhận dữ liệu yuv ở chế độ dọc. Và phần còn lại phụ thuộc vào bạn, bạn có thể quét mã vạch ở chế độ dọc nhưng phải mất nhiều thời gian hơn hoặc bạn phải thay đổi hướng của màn hình sang phong cảnh để có kết quả nhanh hơn.

2
  1. Để thực hiện công việc màn hình trong bức chân dung, thiết lập theo chiều dọc cho hoạt động này (ví dụ trong manifest) và sau đó cấu hình máy ảnh: Sử dụng camera.setDisplayOrientation (90) trong CameraConfigurationManager.setDesiredCameraParameters (camera Camera). Nhưng lưu ý rằng:

    • setDisplayOrientation (int) yêu cầu Android 2.2
    • setDisplayOrientation (int) không ảnh hưởng đến trật tự của mảng byte thông qua vào PreviewCallback.onPreviewFrame. (Tham khảo JavaDoc để biết thêm thông tin)
  2. Vì khung xem trước luôn ở chế độ "ngang", chúng ta cần phải xoay chúng. Tôi đã sử dụng xoay theo chiều kim đồng hồ được cung cấp bởi comment #11. Đừng quên trao đổi thông số chiều rộng và chiều cao sau khi xoay. DecodeHandler.java, xoay dữ liệu trước khi buildLuminanceSource trong decode (byte [] data, int width, int height)

    rotatedData = new byte[data.length]; 
    for (int y = 0; y < height; y++) { 
        for (int x = 0; x < width; x++) 
         rotatedData[x * height + height - y - 1] = data[x + y * width]; 
    } 
    int tmp = width; // Here we are swapping, that's the difference to #11 
    width = height; 
    height = tmp; 
    
  3. Tôi cũng sửa đổi CameraManager.java, getFramingRectInPreview(), theo khuyến cáo của # C11:

    rect.left = rect.left * cameraResolution.y/screenResolution.x; 
    rect.right = rect.right * cameraResolution.y/screenResolution.x; 
    rect.top = rect.top * cameraResolution.x/screenResolution.y; 
    rect.bottom = rect.bottom * cameraResolution.x/screenResolution.y; 
    
  4. Tôi không sửa đổi getCameraResolution(). Đó là sự khác biệt thứ hai đối với # c11.

Kết quả là tôi đã quét UPC và quét mã 1D khác theo chiều dọc.

P.S. Ngoài ra, bạn có thể điều chỉnh kích thước của FramingRect (đó là hình chữ nhật có thể nhìn thấy trên màn hình trong khi quét), và FramingRectInPreview sẽ được điều chỉnh tự động.

+1

vui lòng chỉnh sửa và dọn dẹp mess định dạng. .. – kleopatra

+1

Một bản vá đẹp cho zxing: https://gist.github.com/border/7577978 – WarrenFaith

1

Sử dụng thư viện android này https://github.com/SudarAbisheck/ZXing-Orient

Nó hỗ trợ cả hai hướng ngang và dọc.

+1

Vui lòng xem [Tham quan] (http://stackoverflow.com/tour) và [Câu trả lời của bạn nằm trong một lâu đài khác : Khi là một câu trả lời không phải là một câu trả lời] (http://meta.stackexchange.com/questions/225370) – Drew

+0

@Drew trong quan điểm của tôi nó là câu trả lời khá ... OP muốn một phiên bản của ZXing hỗ trợ chân dung nhiều hơn, và câu trả lời này mang lại chính xác điều đó. Nó đã giúp tôi với cùng một yêu cầu. –

+0

Tôi chắc chắn nó đã làm. Nhiều năm trước, các yêu cầu tài nguyên đã được sử dụng tốt trên trang web này. Các nguyên tắc đã thay đổi. Và khi câu trả lời mới đến với câu trả lời chỉ có liên kết, bạn thường nhận được các nhận xét mà tôi đã đưa cho bạn. – Drew

6

Đây là giải pháp cho chế độ Portrait quét

đầu tiên tuyên bố hai dòng sau ở mức độ ứng dụng của bạn tập tin gradle

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

Xác định một nút trong file xml của bạn và trong onclick Listener nút viết dưới đây mã trong tệp tin MainActivity java

IntentIntegrator integrator = new IntentIntegrator(this); 
    integrator.setPrompt("Scan a barcode"); 
    integrator.setCameraId(0); // Use a specific camera of the device 
    integrator.setOrientationLocked(true); 
    integrator.setBeepEnabled(true); 
    integrator.setCaptureActivity(CaptureActivityPortrait.class); 
    integrator.initiateScan(); 

Viết mã bên dưới vào y tập tin MainActivity java của chúng tôi sau khi phương pháp onCreate()

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data); 
if(result != null) { 
    if(result.getContents() == null) { 
     Log.d("MainActivity", "Cancelled scan"); 
     Toast.makeText(this, "Cancelled", Toast.LENGTH_LONG).show(); 
    } else { 
     Log.d("MainActivity", "Scanned"); 
     st_scanned_result = result.getContents(); 
     Toast.makeText(this, "Scanned: " + result.getContents(), Toast.LENGTH_LONG).show(); 

    } 
    } 

} 

sau đó tạo ra một lớp học với tên CaptureActivityPortrait kéo dài CaptureActivity. Lớp trông giống như dưới đây

package soAndSo(Your PackageName); 

    import com.journeyapps.barcodescanner.CaptureActivity; 

    public class CaptureActivityPortrait extends CaptureActivity { 
    } 

Và quan trọng nhất tuyên bố CaptureActivityPortrait của bạn trong file manifest như dưới đây

<activity android:name=".CaptureActivityPortrait" 
     android:screenOrientation="portrait" 
     android:stateNotNeeded="true" 
     android:theme="@style/zxing_CaptureTheme" 
     android:windowSoftInputMode="stateAlwaysHidden"></activity> 
Các vấn đề liên quan