目前zxing库仅支持横向模式。对于我的应用程序,我需要在纵向模式下使用
答案 0 :(得分:21)
以下是纵向模式扫描的解决方案
首先在你的app level gradle文件中声明这两行
implementation 'com.journeyapps:zxing-android-embedded:3.0.1@aar'
implementation 'com.google.zxing:core:3.2.0'
在xml文件和Onclick Listener中定义一个按钮,在MainActivity java文件中的代码下面写下
IntentIntegrator integrator = new IntentIntegrator(this);
integrator.setPrompt("Scan a barcode");
integrator.setCameraId(0); // Use a specific camera of the device
integrator.setOrientationLocked(true);
integrator.setBeepEnabled(true);
integrator.setCaptureActivity(CaptureActivityPortrait.class);
integrator.initiateScan();
在onCreate()方法之后在MainActivity java文件中编写以下代码
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
if(result != null) {
if(result.getContents() == null) {
Log.d("MainActivity", "Cancelled scan");
Toast.makeText(this, "Cancelled", Toast.LENGTH_LONG).show();
} else {
Log.d("MainActivity", "Scanned");
st_scanned_result = result.getContents();
Toast.makeText(this, "Scanned: " + result.getContents(), Toast.LENGTH_LONG).show();
}
}
}
然后创建一个名为CaptureActivityPortrait的类,它扩展了CaptureActivity。该课程如下所示
package soAndSo(Your PackageName);
import com.journeyapps.barcodescanner.CaptureActivity;
public class CaptureActivityPortrait extends CaptureActivity {
}
最重要的是在清单文件中声明您的CaptureActivityPortrait,如下所示
<activity android:name=".CaptureActivityPortrait"
android:screenOrientation="portrait"
android:stateNotNeeded="true"
android:theme="@style/zxing_CaptureTheme"
android:windowSoftInputMode="stateAlwaysHidden"></activity>
答案 1 :(得分:16)
只需查看纵向模式下使用Zxing的问题。
答案 2 :(得分:5)
setDisplayOrientation(int)
不会影响PreviewCallback.onPreviewFrame
中传递的字节数组的顺序。 (有关其他信息,请参阅JavaDoc)
这意味着您需要从previewCallback旋转数据返回,但这是yuv数据,您需要转换为rgb数据然后旋转它们。可以在纵向模式下扫描条形码,但这需要更长的时间,因为它需要更多的时间来处理从yuv到rgb的数据并旋转rgb数据。 所以这里的问题是如何从portraitcallback获取yuv数据用于纵向模式?当我们为摄像机参数设置setPreviewSize时,如果不支持previewsize,它将获得异常。这是这个问题的问题。如果相机驱动程序不支持纵向模式的previewSize(高度>宽度),则无法以纵向模式获取yuv数据。其余的取决于您,您可以在纵向模式下扫描条形码,但需要更长的时间,或者您必须将屏幕的方向更改为横向以更快地获得结果。
答案 3 :(得分:5)
请检查以下各项(Official Documentation)
将此活动添加到清单文件
<activity
android:name="com.journeyapps.barcodescanner.CaptureActivity"
android:screenOrientation="fullSensor"
tools:replace="screenOrientation" />
将积分器OrientationLocked设置为false
IntentIntegrator integrator = new IntentIntegrator(this);
integrator.setOrientationLocked(false);
integrator.initiateScan();
希望这会有所帮助
答案 4 :(得分:3)
只需在项目的AndroidManifest.xml中添加这些代码
即可<activity android:name="com.journeyapps.barcodescanner.CaptureActivity"
android:screenOrientation="sensorPortrait"
android:stateNotNeeded="true"
android:theme="@style/zxing_CaptureTheme"
android:windowSoftInputMode="stateAlwaysHidden"
tools:replace="android:screenOrientation" />
答案 5 :(得分:3)
我想在纵向模式下使用条形码阅读器。我发现了solution here 如本主题前面的评论中所述。我以为这是一个答案,因此更容易为遇到相同问题的人找到解决方案。
要以纵向模式使用扫描仪,您需要在AndroidManifest.xml
中添加以下活动。
<activity
android:name="com.journeyapps.barcodescanner.CaptureActivity"
android:screenOrientation="portrait"
tools:replace="screenOrientation" />
就是这样。
有关更多详细信息,请参见链接。
答案 6 :(得分:2)
为了使画面以纵向方式工作,请为活动设置纵向(例如在清单中),然后配置相机:在CameraConfigurationManager.setDesiredCameraParameters(相机相机)中使用camera.setDisplayOrientation(90)。但请注意:
由于预览帧始终处于“横向”状态,因此我们需要旋转它们。我使用comment #11提供的顺时针旋转。旋转后不要忘记交换宽度和高度参数。 DecodeHandler.java,在decode(build []数据,int width,int height)中的buildLuminanceSource之前旋转数据
rotatedData = new byte[data.length];
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++)
rotatedData[x * height + height - y - 1] = data[x + y * width];
}
int tmp = width; // Here we are swapping, that's the difference to #11
width = height;
height = tmp;
我还按照#c11的建议修改了CameraManager.java,getFramingRectInPreview():
rect.left = rect.left * cameraResolution.y / screenResolution.x;
rect.right = rect.right * cameraResolution.y / screenResolution.x;
rect.top = rect.top * cameraResolution.x / screenResolution.y;
rect.bottom = rect.bottom * cameraResolution.x / screenResolution.y;
我没有修改getCameraResolution()。这是#c11的第二个区别。
结果,我有UPC和其他一维代码扫描工作的肖像。
P.S。您也可以调整FramingRect的大小(这是扫描期间屏幕上可见的矩形),FramingRectInPreview将自动调整。
答案 7 :(得分:2)
使用此安卓库https://github.com/SudarAbisheck/ZXing-Orient
它支持纵向和横向。
答案 8 :(得分:0)
将此android:screenOrientation =“ sensorPortrait”添加到清单中
<activity android:name=".CaptureActivity"
android:screenOrientation="sensorPortrait"
android:clearTaskOnLaunch="true"
android:stateNotNeeded="true"
android:theme="@style/CaptureTheme"
android:windowSoftInputMode="stateAlwaysHidden"
tools:replace="android:theme"/>