我正在使用这样一个很棒的库 zxing 来读取 QR 码。我已经成功获取了二维码。
现在,我的应用程序以横向模式运行,相机占据整个屏幕,红色 QR 检测矩形框位于中间。我想将其更改为纵向模式并仅用红色 QR 检测矩形框替换相机视图。
我更改了 zxing 库清单文件中的 CaptureActivity 标记。
android:screenOrientation="portrait"
.
但没有找到我真正想要的东西。我不知道我必须在哪里更改/编写代码才能得到这个。
首先,请不要完全复制我们的应用程序。在这种情况下,无论如何您都需要编写自己的应用程序;这绝对不是改变布局方向那么简单。不仅 UI 不是为肖像而编写的,应用程序代码也不是。
如果您只想使用固定人像模式,那么这并不难。完全支持所有 4 个旋转,带有前置/后置摄像头,很难做到正确。但不仅仅是1个案例。
首先,您需要设计一个纵向模式的 UI。(请不要复制红线设计。)
实际的应用程序代码不关心 QR 码的方向。你根本不需要在那里做任何事情。但是您确实需要进行更改才能正确显示屏幕。
您将需要查询Camera.getOrientation()
以检测相机的安装方式。通常情况下,“向上”在您的右侧,我认为几乎每个设备都以这种方式工作以实现兼容性。但从技术上讲,您需要知道如何旋转预览图像。
然后,您Camera.setDisplayOrientation()
可以告诉它旋转图像的程度,以使其在纵向模式屏幕上正确旋转。这通常是“90”。
最后,您需要选择预览尺寸,Camera.Parameters.setPreviewSize()
但可能需要翻转您选择的值(480x800 vs 800x480),因为您是纵向的。
我遇到了同样的问题,并且被卡住了大约 2 天。实际上,您必须完成一些任务才能实现目标。
您的 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>
您的主要活动应如下所示:
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();
}
}
在清单文件中添加以下权限:
<uses-permission android:name="android.permission.CAMERA"/>
最后是非常重要的任务,您需要为相机旋转问题做,将以下方法替换为
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;
}
}
就这样 。跑步和享受:-)
谢谢..
出于同样的原因,我从这个图书馆获得了非常糟糕的经历。似乎即使您成功以纵向模式显示相机,它也会被拉伸(或者输出图像会被拉伸,或者无法感应到条形码,或者某些设备可以正常工作而其他设备没有)。
我怀疑Android只是“喜欢”相机预览处于横向模式,因为这是用户拍照时的自然方向。
最后,我所做的是使用横向模式并旋转其他所有内容,因此用户认为这是纵向模式,但事实并非如此。我认为许多应用程序都使用这种技术。
我建议,如果您设法解决了这个问题,请在尽可能多的设备上进行测试。