3

我想以纵向布局启动 BarcodeScanner(因为我的整个应用程序都是纵向布局)。我还想知道,是否可以从 Google Play 一次安装两个应用程序(您在清单文件中添加某种依赖项到 Barcode Scanner - 我在我的应用程序中使用它 - 并且 Google Play 会自动在我的应用程序旁边安装 Barcode Scanner) .

谢谢。

4

3 回答 3

2

如果您需要在纵向模式下扫描条码,我建议您将 ZXing 库合并到您的应用程序中并进行适当的更改,以使其在纵向模式下工作。

在此处获取源代码:zxing

您正在库中查找 Android 示例代码以及 core.jar 文件以进行条码扫描。

有关如何让它在肖像中工作的说明,请按照以下步骤操作:Issue 178 - zxing - Running ZXing in Portrait

我强烈建议阅读该线程以获取有关更改的背景信息,但这里是它的基础知识:

  1. 为了使屏幕纵向工作,为活动设置纵向方向(例如在清单中),然后配置相机:使用 CameraConfigurationManager.setDesiredCameraParameters(Camera camera) 中的 camera.setDisplayOrientation(90)。但请注意:

    • setDisplayOrientation(int) 需要 Android 2.2
    • setDisplayOrientation(int) 不影响 PreviewCallback.onPreviewFrame 中传递的字节数组的顺序。(有关更多信息,请参阅 JavaDoc)
  2. 因为预览帧总是在“横向”,我们需要旋转它们。我使用注释#c11 提供的顺时针旋转。不要忘记在旋转后交换宽度和高度参数。DecodeHandler.java,在 decode(byte[] data, 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;
    
  3. 我还按照#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;
    

zxing 库很容易适应您的应用程序,使其成为更流畅和集成的用户体验。强烈推荐。

于 2012-05-01T01:20:41.307 回答
0

嗨,请按照以下步骤解决我尝试过的 Zxing 条码扫描仪中的肖像问题,它工作正常......

有4个相关文件:

1, manifest.xml, you need to make CaptureActivity portrait.

2、DecodeHandler.java,在buildLuminanceSource之前旋转数据,因为在YCbCr_420_SP和YCbCr_422_SP中,Y通道是平面的,首先出现

byte[] 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];
 }

3、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;

4、CameraConfigurationManager.java,在setDesiredCameraParameters()使用中设置相机方向为纵向

parameters.set("orientation", "portrait");

在 getCameraResolution() 中,您需要交换 x 和 y,因为相机预览尺寸类似于 480*320,而不是 320*480。

int tmp = cameraResolution.x;
cameraResolution.x = cameraResolution.y;
cameraResolution.y = tmp;
return cameraResolution;
于 2013-02-27T07:25:52.463 回答
0

条码扫描仪不支持纵向布局,因此您将无法执行此操作。(Barcode Scanner+可以,但你不能依赖它的安装。)没有办法强制从 Market 安装另一个应用程序,不。

于 2012-04-04T22:14:11.730 回答