Android ZXing在Xoom上工作?

Android ZXing在Xoom上工作?,android,barcode,barcode-scanner,motorola,zxing,Android,Barcode,Barcode Scanner,Motorola,Zxing,有人知道ZXing条形码扫描仪库是否在Xoom上工作吗?我在ZXing Google Group上发现了一个帖子: 但仍然没有答案。任何帮助都将不胜感激 核心库独立于任何特定设备或平台,因此“是”。 条形码扫描仪应用程序版本3.6已确认可在Xoom上运行。核心库独立于任何特定设备或平台,因此“是”。 条形码扫描器应用程序版本3.6已确认可在Xoom上工作。是的,它可以工作。代码是用java编写的,因此几乎可以与任何设备一起使用。永远,如果你尝试这个例子,它使用旧的安卓2.x,它不被视为与蜂窝工作

有人知道ZXing条形码扫描仪库是否在Xoom上工作吗?我在ZXing Google Group上发现了一个帖子:


但仍然没有答案。任何帮助都将不胜感激

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

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

是的,它可以工作。代码是用java编写的,因此几乎可以与任何设备一起使用。永远,如果你尝试这个例子,它使用旧的安卓2.x,它不被视为与蜂窝工作。因此,您必须创建自己的相机包装。起作用的是图书馆,ZXing-1.7.zip

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

  • 在eclipse中创建一个名为 “CameraPreview”并将包名设置为“com.example.android.api.graphics”
  • 从中获取ZXing-1.7.zip
  • 从目录中提取名为“com”的文件夹 “ZXing-1.7.zip\ZXing\core\src”
  • 将Eclipse中提取的文件夹拖放到文件夹中 src:“CameraPreview\src”。它会问你是否要替换“com”文件夹,说“是”
  • 还可以获得一份“ZXing-1.7.zip\ZXing\android\src\com\google\ZXing\client\android\PlanarYUVLuminanceSource.java”的副本,并将其放入名为“com.google.ZXing.client.android”的新包中(您必须创建一个新包)
  • 将代码“CameraPreviewActivity.java”替换为以下代码:
  • 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;
            }
        }
    }
    
    /* 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();
        }
    }
    
    创建一个名为Preview.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;
            }
        }
    }
    
    /* 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();
        }
    }
    
    /*版权所有(C)2007安卓开源项目*/
    包com.example.android.api.graphics;
    导入android.content.Context;
    导入android.hardware.Camera;
    导入android.hardware.Camera.Size;
    导入android.util.Log;
    导入android.view.SurfaceHolder;
    导入android.view.SurfaceView;
    导入android.view.view;
    导入android.view.ViewGroup;
    导入java.io.IOException;
    导入java.util.List;
    // ----------------------------------------------------------------------
    /**
    *围绕摄影机的简单包装和渲染摄影机居中预览的SurfaceView
    *浮出水面。我们需要将SurfaceView置于中心位置,因为并非所有设备都有摄像头
    *支持与设备显示器具有相同纵横比的预览大小。
    */
    类预览扩展视图组实现SurfaceHolder.Callback{
    私有最终字符串标记=“预览”;
    SurfaceView mSurfaceView;
    表面粗糙度;
    大小mPreviewSize;
    列出MSSupportedPreviewsizes;
    麦克默拉照相机;
    预览(上下文){
    超级(上下文);
    mSurfaceView=新的SurfaceView(上下文);
    addView(mSurfaceView);
    //安装SurfaceHolder.Callback,以便在
    //创建和破坏下垫面。
    mHolder=mSurfaceView.getHolder();
    mHolder.addCallback(this);
    mHolder.setType(SurfaceHolder.SURFACE\u TYPE\u PUSH\u缓冲区);
    }
    公共摄像机(摄像机){
    mCamera=摄像机;
    if(mCamera!=null){
    mSupportedPreviewSizes=mCamera.getParameters().getSupportedPreviewSizes();
    requestLayout();
    }
    }
    公共摄像机(摄像机){
    设置摄像机(摄像机);
    试一试{
    摄像头。设置预览显示(mHolder);
    }捕获(IOException异常){
    Log.e(标记“setPreviewDisplay()引起的IOException”,exception);
    }
    Camera.Parameters=Camera.getParameters();
    parameters.setPreviewSize(mPreviewSize.width、mPreviewSize.height);
    requestLayout();
    设置参数(参数);
    }
    @凌驾
    测量时的保护空隙(内部宽度测量等级、内部高度测量等级){
    //我们故意忽略儿童的测量,因为这是一种
    //包装到将摄影机预览居中的SurfaceView
    //我想把它拉长。
    最终整数宽度=resolveSize(getSuggestedMinimumWidth(),widthMeasureSpec);
    最终整数高度=resolveSize(getSuggestedMinimumHeight(),heightMeasureSpec);
    设置测量尺寸(宽度、高度);
    if(mSupportedPreviewSizes!=null){
    mPreviewSize=getOptimalPreviewSize(MSSupportedPreviewSize、宽度、高度);
    }
    }
    @凌驾
    仅受保护的void布局(布尔值已更改、int l、int t、int r、int b){
    如果(已更改&&getChildCount()>0){
    最终视图子对象=getChildAt(0);
    最终整数宽度=r-l;
    最终内部高度=b-t;
    int previewWidth=宽度;
    亮度=高度;
    if(mPreviewSize!=null){
    previewWidth=mPreviewSize.width;
    PreviewView=mPreviewSize.height;
    }
    //将子曲面视图居中放置在父曲面视图中。
    如果(宽度*预览宽度>高度*预览宽度){
    最终整数缩放儿童宽度=预览宽度*高度/预览宽度;
    布局((宽度-scaledChildWidth)/2,0,
    (宽度+缩放儿童宽度)/2,高度);
    }否则{
    最终int scaledChildHeight=预览视图*宽度/预览宽度;
    布局(0,(高度-缩放儿童高度)/2,
    宽度(高度+缩放儿童高度)/2);
    }
    }
    }
    已创建的公共空白表面(表面持有人){
    //曲面已创建,获取摄影机并告知其位置
    //画。
    试一试{
    if(mCamera!=null){
    mCamera.setPreviewDisplay(支架);
    }
    }捕获(IOException异常){