Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/197.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android zxing lib无法在纵向模式下顺利检测qrcode_Android_Zxing - Fatal编程技术网

Android zxing lib无法在纵向模式下顺利检测qrcode

Android zxing lib无法在纵向模式下顺利检测qrcode,android,zxing,Android,Zxing,我已经成功地将ZXing库修改为纵向模式,还将预览矩形修改为类似下面img的正方形。但我发现实际扫描的矩形只有预览矩形的一半大小,只有当我将qrcode对齐到预览矩形的上半部分时,我才能像ZXing演示应用程序一样快速平滑地得到结果 我在CameraManager中同时选中getFramingRect()和getFramingRectInPreview()方法来修改预览矩形,并从ViewFinderView.onDraw()打印出这两个矩形。但我仍然不知道哪个rect实际上用于检测。是框架还是预

我已经成功地将ZXing库修改为纵向模式,还将预览矩形修改为类似下面img的正方形。但我发现实际扫描的矩形只有预览矩形的一半大小,只有当我将qrcode对齐到预览矩形的上半部分时,我才能像ZXing演示应用程序一样快速平滑地得到结果

我在CameraManager中同时选中getFramingRect()getFramingRectInPreview()方法来修改预览矩形,并从ViewFinderView.onDraw()打印出这两个矩形。但我仍然不知道哪个rect实际上用于检测。是框架还是预览框架?还是别的什么?如何将预览矩形与检测矩形对齐

@Override
public void onDraw(Canvas canvas) {
    if (cameraManager == null) {
        return; // not ready yet, early draw before done configuring
    }
    Rect frame = cameraManager.getFramingRect();
    Rect previewFrame = cameraManager.getFramingRectInPreview();
    if (frame == null || previewFrame == null) {
        return;
    }
    int width = canvas.getWidth();
    int height = canvas.getHeight();

    Log.d(TAG, "@ FramingRect : " + frame.left + "/" + frame.top + "/" + frame.right + "/" + frame.bottom);
    Log.d(TAG, "@ Preview FramingRect : " +
            previewFrame.left + "/" + previewFrame.top + "/" + previewFrame.right + "/" + previewFrame.bottom);

每当我在
getFramingRectInPreview()
中调整previewRect时,都会发生此异常:

java.lang.IllegalArgumentException: Crop rectangle does not fit within image data.
    at com.google.zxing.PlanarYUVLuminanceSource.<init>(PlanarYUVLuminanceSource.java:50)
    at com.google.zxing.client.android.camera.CameraManager.buildLuminanceSource(CameraManager.java:339)
    at com.google.zxing.client.android.DecodeHandler.decode(DecodeHandler.java:87)
    at com.google.zxing.client.android.DecodeHandler.handleMessage(DecodeHandler.java:55)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:137)
    at com.google.zxing.client.android.DecodeThread.run(DecodeThread.java:104)
java.lang.IllegalArgumentException:裁剪矩形不适合图像数据。
请访问com.google.zxing.PlanarYUVLuminanceSource。(PlanarYUVLuminanceSource.java:50)
位于com.google.zxing.client.android.camera.CameraManager.buildLuminanceSource(CameraManager.java:339)
位于com.google.zxing.client.android.DecodeHandler.decode(DecodeHandler.java:87)
位于com.google.zxing.client.android.DecodeHandler.handleMessage(DecodeHandler.java:55)
位于android.os.Handler.dispatchMessage(Handler.java:99)
位于android.os.Looper.loop(Looper.java:137)
位于com.google.zxing.client.android.DecodeThread.run(DecodeThread.java:104)

尝试并出错后,我只能将预览向下移动100,向右移动60。这似乎使检测过程更加顺畅。

getFramingRect()
与屏幕相关,而
getFramingRectInPreview()
与来自相机的预览图像数据相关。它们的计算结果与宽度和高度的比例相同,但如果您修改了代码,则可能此部分没有正确修改。

getFramingRect()
与屏幕相关,而
getFramingRectInPreview()
与来自相机的预览图像数据相关。它们的计算结果与宽度和高度成比例相同,但如果您修改了代码,则可能这部分没有正确修改。

是的,我发现
getFramingRect()
&
getFramingRectInPreview()
返回的是成比例的相似。在这里,我甚至把它们都画在屏幕上。我发现它们没有对齐。出于好奇,我也在最初的ZXing Android项目中绘制了这两个矩形,它们也没有对齐!那么我需要将它们对齐吗?这是我的两个rect,以及zxing android中的这两个rect。(绿色rect是previewFramingRect)@Sean Owen我应该重写哪个方法来更改扫描区域。我在getFramingRectInPreview()中重写扫描区域,但它只在Nexus 5x(7.1.1)中更新视图而不是扫描内部矩形。是的,我发现
getFramingRect()。在这里,我甚至把它们都画在屏幕上。我发现它们没有对齐。出于好奇,我也在最初的ZXing Android项目中绘制了这两个矩形,它们也没有对齐!那么我需要将它们对齐吗?这是我的两个rect,以及zxing android中的这两个rect。(绿色rect是previewFramingRect)@Sean Owen我应该重写哪个方法来更改扫描区域。我在getFramingRectInPreview()中重写扫描区域,但它只在Nexus 5x(7.1.1)中更新视图而不是扫描内部矩形。使用ZBar库。它非常强大。它将很快给出结果…尝试它…使用ZBar库。它非常强大。它将很快给出结果…尝试它。。。