【问题标题】:Customized camera view & rotation in Zxing for QR code?在 Zxing 中为 QR 码定制相机视图和旋转?
【发布时间】:2017-06-02 22:37:32
【问题描述】:

我正在使用这样一个很棒的库 zxing 来读取二维码。我已经成功获取二维码了。

现在,我的应用程序以横向模式运行,相机占据整个屏幕,红色 QR 检测矩形框位于中间。我想将其更改为纵向模式并仅将相机视图替换为红色 QR 检测矩形框。

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

android:screenOrientation="portrait".

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

【问题讨论】:

  • 调整很简单,但需要跨多个文件进行一些更改。在这里我为这个问题提供了一个完整的解决方案:stackoverflow.com/questions/16252791/…
  • @Roylee:谢谢,您的代码也运行良好..

标签: android qr-code zxing


【解决方案1】:

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

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

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

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

您需要查询Camera.getOrientation() 以检测相机的安装方式。通常情况下,“向上”在您的右侧,我认为几乎每个设备都以这种方式工作以实现兼容性。但从技术上讲,您需要知道要旋转多少预览图像。

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

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

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,并且卡住了大约 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. 最后非常重要的任务是你需要为相机旋转问题做的,把下面的方法替换成

    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;
        }
      }
    

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

    谢谢..

    【讨论】:

    • 在扩展它之前必须将类 CaptureActivity 更改为非 final。
    • 有人在 Delphi XE5 中使用过它吗?
    【解决方案3】:

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

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

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

    我建议,如果您设法解决了这个问题,请在尽可能多的设备上进行测试。

    【讨论】:

    • 库本身根本不关心方向。该应用程序仅适用于横向,因此您不能将其用于纵向 - 但无论如何您都应该编写一个新应用程序。 Android 相机“通常”是安装的,因此横向是自然方向,但您必须查询 API 才能确定真正知道!是的,您实际上不必旋转图像,但您必须正确匹配预览分辨率和旋转。
    • 对于简单的相机应用程序(预览和捕捉)和这个库的一个示例,您是否有任何示例来展示如何做到这一点?
    • 问题是没有足够的示例/教程。只有这个程序大声笑
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多