9

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

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

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

android:screenOrientation="portrait".

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

4

3 回答 3

8

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

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

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

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

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

然后,您Camera.setDisplayOrientation()可以告诉它旋转图像的程度,以使其在纵向模式屏幕上正确旋转。这通常是“90”。

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

于 2013-03-23T23:14:59.410 回答
6

我遇到了同样的问题,并且被卡住了大约 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;
    }
  }

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

谢谢..

于 2013-03-28T13:48:06.177 回答
2

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

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

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

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

于 2013-03-23T20:00:41.797 回答