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