ZXing适用于Xoom?

时间:2011-04-13 04:07:33

标签: android barcode barcode-scanner motorola zxing

有没有人知道ZXing条码扫描器库是否可以在Xoom上运行?我在ZXing Google Group上发现了一个帖子:http://groups.google.com/group/zxing/browse_thread/thread/e16e74697d721e20

但仍然没有答案。非常感谢任何帮助!

2 个答案:

答案 0 :(得分:3)

是的,确实有效。代码在java中,因此几乎适用于任何设备。永远,如果你尝试这个例子,它使用旧的Android 2.x,它看起来不适用于蜂窝。所以你必须创建自己的相机包装。什么有用的是图书馆,ZXing-1.7.zip。

以下是使其工作所需的代码。请注意,它将在标题中显示条形码的内容。因此,使其运作所需的步骤:

  1. 使用名称在eclipse中创建一个新的android项目 “CameraPreview”并将包名称设置为“com.example.android.apis.graphics”。
  2. http://code.google.com/p/zxing/获取ZXing-1.7.zip
    1. 从目录中提取名为“com”的文件夹 “ZXing-1.7.zip \斑马线\核心\ SRC”。
    2. 将解压缩的文件夹拖放到文件夹中的Eclipse中 src:“CameraPreview \ src”。它会询问您是否要替换“com”文件夹,说“是”。
    3. 获取“ZXing-1.7.zip \ zxing \ android \ src \ com \ google \ zxing \ client \ android \ PlanarYUVLuminanceSource.java”的副本,并将其放入名为“com.google.zxing”的新软件包中。 client.android“(你必须创建一个新的包)。
  3. 将代码“CameraPreviewActivity.java”替换为以下代码:
  4. <强> CameraPreviewActivity.java:

    /* Copyright (C) 2007 The Android Open Source Project */
    
    package com.example.android.apis.graphics;
    
    import com.google.zxing.BinaryBitmap;
    import com.google.zxing.MultiFormatReader;
    import com.google.zxing.ReaderException;
    import com.google.zxing.Result;
    import com.google.zxing.client.android.PlanarYUVLuminanceSource;
    import com.google.zxing.common.HybridBinarizer;
    
    import android.app.Activity;
    import android.hardware.Camera;
    import android.os.Bundle;
    
    // ----------------------------------------------------------------------
    
    public class CameraPreviewActivity extends Activity {
        Preview mPreview;
        Camera mCamera;
        MultiFormatReader multiFormatReader;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            // Create a RelativeLayout container that will hold a SurfaceView,
            // and set it as the content of our activity.
            mPreview = new Preview(this);
            setContentView(mPreview);
    
            // Setup ZXing.
            multiFormatReader = new MultiFormatReader();
            CameraPreviewActivity.this.getActionBar().setTitle("");
        }
    
        @Override
        protected void onResume() {
            super.onResume();
    
            mCamera = Camera.open();
            mCamera.setPreviewCallback(new Camera.PreviewCallback() {
                public void onPreviewFrame(byte[] data, Camera camera) {
    
                    Camera.Size size = camera.getParameters().getPreviewSize();
                    PlanarYUVLuminanceSource source = new PlanarYUVLuminanceSource(data, size.width, size.height, 0, 0,
                            size.width, size.height, false);
                    BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
                    try {
                        Result r = multiFormatReader.decode(bitmap);
                        CameraPreviewActivity.this.getActionBar().setTitle(r.getText());
                    } catch (ReaderException re) {
                      // continue
                    }
                }
            });
            mPreview.setCamera(mCamera);
        }
    
        @Override
        protected void onPause() {
            super.onPause();
    
            // Because the Camera object is a shared resource, it's very
            // important to release it when the activity is paused.
            if (mCamera != null) {
                mPreview.setCamera(null);
                mCamera.setPreviewCallback(null);
                mCamera.release();
                mCamera = null;
            }
        }
    }
    

    创建一个名为 Preview.java的新类:

    /* Copyright (C) 2007 The Android Open Source Project */
    
    package com.example.android.apis.graphics;
    
    import android.content.Context;
    import android.hardware.Camera;
    import android.hardware.Camera.Size;
    import android.util.Log;
    import android.view.SurfaceHolder;
    import android.view.SurfaceView;
    import android.view.View;
    import android.view.ViewGroup;
    
    import java.io.IOException;
    import java.util.List;
    
    // ----------------------------------------------------------------------
    
    /**
     * A simple wrapper around a Camera and a SurfaceView that renders a centered preview of the Camera
     * to the surface. We need to center the SurfaceView because not all devices have cameras that
     * support preview sizes at the same aspect ratio as the device's display.
     */
    class Preview extends ViewGroup implements SurfaceHolder.Callback {
        private final String TAG = "Preview";
    
        SurfaceView mSurfaceView;
        SurfaceHolder mHolder;
        Size mPreviewSize;
        List<Size> mSupportedPreviewSizes;
        Camera mCamera;
    
        Preview(Context context) {
            super(context);
    
            mSurfaceView = new SurfaceView(context);
            addView(mSurfaceView);
    
            // Install a SurfaceHolder.Callback so we get notified when the
            // underlying surface is created and destroyed.
            mHolder = mSurfaceView.getHolder();
            mHolder.addCallback(this);
            mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        }
    
        public void setCamera(Camera camera) {
            mCamera = camera;
            if (mCamera != null) {
                mSupportedPreviewSizes = mCamera.getParameters().getSupportedPreviewSizes();
                requestLayout();
            }
        }
    
        public void switchCamera(Camera camera) {
           setCamera(camera);
           try {
               camera.setPreviewDisplay(mHolder);
           } catch (IOException exception) {
               Log.e(TAG, "IOException caused by setPreviewDisplay()", exception);
           }
           Camera.Parameters parameters = camera.getParameters();
           parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height);
           requestLayout();
    
           camera.setParameters(parameters);
        }
    
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            // We purposely disregard child measurements because act as a
            // wrapper to a SurfaceView that centers the camera preview instead
            // of stretching it.
            final int width = resolveSize(getSuggestedMinimumWidth(), widthMeasureSpec);
            final int height = resolveSize(getSuggestedMinimumHeight(), heightMeasureSpec);
            setMeasuredDimension(width, height);
    
            if (mSupportedPreviewSizes != null) {
                mPreviewSize = getOptimalPreviewSize(mSupportedPreviewSizes, width, height);
            }
        }
    
        @Override
        protected void onLayout(boolean changed, int l, int t, int r, int b) {
            if (changed && getChildCount() > 0) {
                final View child = getChildAt(0);
    
                final int width = r - l;
                final int height = b - t;
    
                int previewWidth = width;
                int previewHeight = height;
                if (mPreviewSize != null) {
                    previewWidth = mPreviewSize.width;
                    previewHeight = mPreviewSize.height;
                }
    
                // Center the child SurfaceView within the parent.
                if (width * previewHeight > height * previewWidth) {
                    final int scaledChildWidth = previewWidth * height / previewHeight;
                    child.layout((width - scaledChildWidth) / 2, 0,
                            (width + scaledChildWidth) / 2, height);
                } else {
                    final int scaledChildHeight = previewHeight * width / previewWidth;
                    child.layout(0, (height - scaledChildHeight) / 2,
                            width, (height + scaledChildHeight) / 2);
                }
            }
        }
    
        public void surfaceCreated(SurfaceHolder holder) {
            // The Surface has been created, acquire the camera and tell it where
            // to draw.
            try {
                if (mCamera != null) {
                    mCamera.setPreviewDisplay(holder);
                }
            } catch (IOException exception) {
                Log.e(TAG, "IOException caused by setPreviewDisplay()", exception);
            }
        }
    
        public void surfaceDestroyed(SurfaceHolder holder) {
            // Surface will be destroyed when we return, so stop the preview.
            if (mCamera != null) {
                mCamera.stopPreview();
            }
        }
    
    
        private Size getOptimalPreviewSize(List<Size> sizes, int w, int h) {
            final double ASPECT_TOLERANCE = 0.1;
            double targetRatio = (double) w / h;
            if (sizes == null) return null;
    
            Size optimalSize = null;
            double minDiff = Double.MAX_VALUE;
    
            int targetHeight = h;
    
            // Try to find an size match aspect ratio and size
            for (Size size : sizes) {
                double ratio = (double) size.width / size.height;
                if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue;
                if (Math.abs(size.height - targetHeight) < minDiff) {
                    optimalSize = size;
                    minDiff = Math.abs(size.height - targetHeight);
                }
            }
    
            // Cannot find the one match the aspect ratio, ignore the requirement
            if (optimalSize == null) {
                minDiff = Double.MAX_VALUE;
                for (Size size : sizes) {
                    if (Math.abs(size.height - targetHeight) < minDiff) {
                        optimalSize = size;
                        minDiff = Math.abs(size.height - targetHeight);
                    }
                }
            }
            return optimalSize;
        }
    
        public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
            // Now that the size is known, set up the camera parameters and begin
            // the preview.
            Camera.Parameters parameters = mCamera.getParameters();
            parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height);
            requestLayout();
    
            mCamera.setParameters(parameters);
            mCamera.startPreview();
        }
    }
    

    此外,替换 AndroidManifest.xml 的内容(这仅适用于Android Honeycomb 3.2,如果您想使其工作在其他版本,则必须对此文件进行更改) :

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.example.android.apis.graphics"
          android:versionCode="1"
          android:versionName="1.0">
        <uses-sdk android:minSdkVersion="13" />
        <uses-permission android:name="android.permission.CAMERA" />
        <uses-feature android:name="android.hardware.camera" />
        <uses-feature android:name="android.hardware.camera.autofocus" />
    
        <application android:icon="@drawable/icon" android:label="@string/app_name">
            <activity android:name=".CameraPreviewActivity"
                      android:label="@string/app_name">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
    
        </application>
    </manifest>
    

    很抱歉版权标题,但是这两个类的大部分代码: CameraPreview.java Preview.java 来自http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/CameraPreview.html,其中包含版权。该死的。

答案 1 :(得分:0)

核心库独立于任何特定设备或平台,因此“是”。 条形码扫描仪应用程序版本3.6已确认可在Xoom上使用。