定制的相机视图&在Zxing旋转二维码?

时间:2013-03-23 16:48:51

标签: android qr-code zxing

我正在与这样一个很棒的图书馆zxing一起阅读二维码。我已经成功获得了二维码。

现在,我的应用程序以横向模式运行,相机占据整个屏幕,红色QR检测矩形框位于中间。我想把它改成肖像模式&仅使用红色QR检测矩形框替换摄像机视图。

我更改了zxing库清单文件中的CaptureActivity标记。

android:screenOrientation="portrait"

但没有发现我真正想要的东西。我不知道在哪里需要更改/编写代码才能得到这个。

3 个答案:

答案 0 :(得分:5)

首先,请不要完全复制我们的应用程序。在这种情况下,您无论如何都需要编写自己的应用程序;它绝对不像改变布局方向那么简单。 UI不仅不是为肖像而写,也不是应用代码。

如果您只想使用 固定肖像模式,那么这并不是那么难。完全支持所有4个旋转,使用前/后摄像头,很难做到正确。但不仅仅是1例。

首先,您需要设计纵向模式UI。 (请不要复制红线设计。)

实际的应用代码并不关心QR码的方向。你根本不需要做任何事情。但您确实需要进行更改才能正确显示屏幕。

您需要查询Camera.getOrientation()以检测相机的安装方式。通常情况下,“向上”是你的权利,我认为几乎所有设备都以这种方式兼容。但从技术上讲,你需要知道,所以你知道旋转预览图像的程度。

然后使用Camera.setDisplayOrientation()告诉它旋转图像多少以使其在纵向模式屏幕上正确旋转。这通常是“90”。

最后,您需要使用Camera.Parameters.setPreviewSize()选择预览尺寸,但可能需要翻转您选择的值(480x800 vs 800x480),因为您是肖像。

答案 1 :(得分:5)

我遇到了同样的问题并且被困了大约2天。 实际上你必须完成一些任务来实现你的目标。

  1. 下载Zxing图书馆阅读二维码..(希望你已经有)
  2. 创建项目并添加Zxing库。
  3. 您的main.xml文件应如下所示:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
    
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello" />
    
    <FrameLayout
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:layout_gravity="center_horizontal">
        <include layout="@layout/capture"/>
    </FrameLayout>
    
    </LinearLayout>
    
  4. 您的主要活动应如下所示:

     public class ScannerActivity extends CaptureActivity {
    
            @Override
            public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.main);
    
            }
    
            @Override 
            public void handleDecode(Result rawResult, Bitmap barcode) 
            {
       Toast.makeText(this.getApplicationContext(), "Scanned code " + rawResult.getText(), Toast.LENGTH_LONG).show();
            }
        }
    
  5. 在清单文件中添加以下权限:

     <uses-permission android:name="android.permission.CAMERA"/>
    
  6. 最后非常重要的任务,你需要做的相机旋转问题,将以下方法替换为

  7. CameraManager.java(在com.google.zxing.client.android.camera包中)

    @SuppressLint("NewApi") public void startPreview() {
        Camera theCamera = camera;
        if (theCamera != null && !previewing) {
            theCamera.setDisplayOrientation(90);
          theCamera.startPreview();
          previewing = true;
        }
      }
    

    就是这样。跑步和享受: - )

    感谢..

答案 2 :(得分:1)

出于同样的原因,我从这个图书馆获得了非常糟糕的经历。似乎即使您成功地以纵向模式显示相机,它也会被拉伸(或者输出图像会被拉伸,或者条形码将无法被感知,或者某些设备使其工作正常,而其他设备则没有)。

我怀疑Android只是“喜欢”相机预览处于横向模式,因为这是用户拍照时的自然方向。

最后,我所做的是使用横向模式并旋转其他所有内容,因此用户认为它是纵向模式,但事实并非如此。我认为很多应用都使用这种技术。

我建议如果你以某种方式设法解决这个问题,请尽可能多地测试它。