Android 调用UVCCamera 采集UVC摄像头数据,并调用zxing 扫码库扫码

zxing 提供的sample都是原生camera采集摄像头数据,而android上使用UVCCamera采集摄像头的情况比较多,那么怎么在uvccamera采集到摄像头数据,并调用zxing扫码呢。直接上代码。

DecodeHandle.java

package com.baidu.idl.face.main.decode;

import android.content.Context;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.text.TextUtils;
import android.util.Log;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.DecodeHintType;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.PlanarYUVLuminanceSource;
import com.google.zxing.ReaderException;
import com.google.zxing.Result;
import com.google.zxing.common.HybridBinarizer;

import java.util.Arrays;
import java.util.Collection;
import java.util.Map;
import java.util.EnumMap;
import java.util.EnumSet;

public class DecodeHandler {

    private final DecodeListener mListener;
    private boolean isAvailable = true;
    private static final int DECODE_BITMAP = 0;
    private static final int DECODE_YUV = 1;
    //private QrDecoder mDecoder;
    private DecodeThread mDecodThread;
    private int mTimeout;
    Context mContext;
    private int mWidth;
    private int mHeight;

    private final Map<DecodeHintType, Object> hints;
    private Collection<BarcodeFormat> decodeFormats;
    private final MultiFormatReader multiFormatReader;

    public DecodeHandler(Context context, DecodeListener listener,final int width, final int height) {
        mWidth = width;
        mHeight = height;
        mListener = listener;
        mContext = context;
        //mDecoder = new QrDecoder(context);
        HandlerThread thread = new HandlerThread("qr_decode_thread");
        thread.start();
        mDecodThread = new DecodeThread(thread.getLooper());

        //扫码初始化
        multiFormatReader = new MultiFormatReader();

        decodeFormats = EnumSet.of(BarcodeFormat.QR_CODE, BarcodeFormat.CODE_128);
        hints = new EnumMap<>(DecodeHintType.class);
        hints.put(DecodeHintType.POSSIBLE_FORMATS, decodeFormats);
        String characterSet = "utf-8";
        if (characterSet != null) {
            hints.put(DecodeHintType.CHARACTER_SET, characterSet);
        }
        hints.put(DecodeHintType.TRY_HARDER, true);

        multiFormatReader.setHints(hints);
    }

    public void release() {
        setAvailable(false);
        mDecodThread.getLooper().quit();
    }

    public void pushYuv(byte[] yuv) {
        Log.d("MainActivity","pushYuv()");
        if (isAvailable()) {
            setAvailable(false);
            mDecodThread.obtainMessage(DECODE_YUV, yuv).sendToTarget();
        }
    }

    private boolean isAvailable() {
        return isAvailable;
    }

    private void setAvailable(boolean b) {
        isAvailable = b;
    }

    private class DecodeThread extends Handler {
        DecodeThread(Looper looper) {
            super(looper);
        }

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case DECODE_YUV:
                {
                    decode((byte[])msg.obj,mWidth,mHeight);
                    setAvailable(true);

                }
                break;
            }
        }
    }

    /**
     * @param data   A preview frame.
     * @param width  The width of the image.
     * @param height The height of the image.
     * @return A PlanarYUVLuminanceSource instance.
     */
    public PlanarYUVLuminanceSource buildLuminanceSource(byte[] data, int width, int height) {
        return new PlanarYUVLuminanceSource(data, width, height, 0, 0,
                width, height, false);
    }

    /**
     * @param data   The YUV preview frame.
     * @param width  The width of the preview frame.
     * @param height The height of the preview frame.
     */
    private void decode(byte[] data, int width, int height) {

        long start = System.currentTimeMillis();
        Result rawResult = null;
        PlanarYUVLuminanceSource source = buildLuminanceSource(data, width, height);
        if (source != null) {
            BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
            try {
                rawResult = multiFormatReader.decodeWithState(bitmap);

  
                BarcodeFormat format = rawResult.getBarcodeFormat();
                //类型
                String type = format.toString();
                String strScan = rawResult.getText();

                String content = new String(strScan.trim());

                if (!TextUtils.isEmpty(content)) {
                    mListener.onDecodeSuccess(content);
                }
            } catch (ReaderException re) {
                // continue
                mListener.onDecodeFailed(-1);
            } finally {
                multiFormatReader.reset();
            }
        }

    }

}

 

DecodeListener.java

package com.baidu.idl.face.main.decode;


public interface DecodeListener {

    public void onDecodeSuccess(final String content);

    public void onDecodeFailed(final int error);
}

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Android Studio是谷歌最新推出的Android开发工具,可以实现基于Android平台的应用程序开发。而UVC摄像头指的是“USB视频类设备”,主要用于连接电脑、平板电脑等设备,可以实现高清视频的采集和传输。那么如何在Android Studio中调用UVC摄像头呢? 首先,我们需要在AndroidManifest.xml文件中添加相机权限,以便应用程序可以访问设备的相机。其次,需要使用AndroidCamera2 API来连接UVC摄像头Camera2 API是Android 5.0及以上版本才支持的相机API,如果您需要访问前面版本的相机,则需要使用Android的原始相机API。 在使用Camera2 API连接UVC摄像头时,可以使用CameraCharacteristics类来查询摄像头的属性,并使用CameraCaptureSession类来实现摄像头会话。此外,还可以使用MediaRecorder类来记录视频数据,并使用Surface类将视频数据渲染到屏幕上。 当然,为了更好地调用UVC摄像头,还需要了解UVC摄像头的特性和参数设置。例如,UVC摄像头通常支持多种分辨率和帧率设置,不同的设置可能会影响到视频质量和性能。因此,在使用UVC摄像头时,需要对其进行合适的配置和优化。 总之,Android Studio调用UVC摄像头需要使用Camera2 API,并需要对UVC摄像头进行适当的配置和优化。了解这些技术原理能够极大地帮助我们更好地实现Android应用程序中的相机功能。 ### 回答2: 在Android Studio中调用UVC摄像头,需要遵循以下步骤: 1.连接UVC摄像头 要使用UVC摄像头,您需要将其连接到您的计算机或Android设备。确保UVC摄像头被正确识别,并且在Android设备上设置了必要的权限。 2.创建Android Studio项目 打开Android Studio并创建一个新项目。确保您的项目中含有必要的依赖,并设置合适的权限。 3.编写Java代码 编写Java代码以调用UVC摄像头。您可以使用android.hardware.usb包中的UsbManager类来获取该设备的USB接口。使用UsbDevice类可以将UVC摄像头与该接口连接起来。 4.设置UVC摄像头参数 为了确保UVC摄像头可以正常工作,必须设置合适的参数。您可以通过使用android.hardware.camera2包中的相关类来获取UVC摄像头所支持的参数列表。 5.初始化UVC摄像头 调用UVC摄像头的初始化方法。在此过程中,您还可以设置摄像头的预览大小、帧率和格式。 6.启动UVC摄像头 启动UVC摄像头并开始捕获图像。您可以使用android.media包中的相关类来显示UVC摄像头捕获的图像。 7.停止和释放UVC摄像头摄像头不再需要时,需要停止并释放它。调用摄像头的停止和释放方法来完成这些操作。 总的来说,调用UVC摄像头需要掌握一定的Java编程技巧和Android开发经验。但是,如果您按照上述步骤进行操作,就可以成功调用UVC摄像头并捕获图像。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值