Zbar扫码(摄像头+本地图片+6.0权限)

本文详细介绍了如何在Android应用中结合Zbar库,利用摄像头和本地图片进行二维码扫描。首先通过Intent查找图片,然后在onActivityResult中处理返回的数据,接着将Bitmap转换为YUV格式以供Zbar识别。提供了完整的Demo源码链接。
摘要由CSDN通过智能技术生成
Zbar调用摄像头扫码,没什么好说的,其他前辈写过无数文章,大概就是写布局--->调用摄像头(android 6.0以后需要判断权限)---->用Zbar的Decoder将摄像头拿到的数据进行解码。
最近项目需要扫码功能支持相机扫码,也支持本地图片扫码,按照惯例,到网上各路搜索相关例子,看着代码都不多,但是就是移植到自己项目里就不行,本地图片扫码总是得到null,觉得很是奇怪,找了很多文章,有几篇大概提到Bitmap转YUV格式之后再去解码,于是参照说明,尝试发现部分可以解码,部分不能解码,很是不解,用微信的扫码测试却都可以得到正确的结果。于是又尝试各种方法,仍然不行,过程中发现我的程序界面得到结果(null)所用的时间较长,心想是不是图片太大,处理耗时太多,于是尝试压缩下,哇哈哈~~~突然间柳暗花明又一村,之前不能解码的图片现在也能解码了,啊哈哈哈,好开森~~
于是继续压缩,结果发现玩大了额,之前能解码的现在又解码了了~~~压缩过头了,最终用了个自我感觉效果不错的压缩后大小。
相关代码如下:

第一部分:发起查找图片的Intent

/** 这个地方需要注意,同样的Intent,Android 6.0之前返回的数据与6.0及之后返回的数据不一样,具体见onActivityResult部分 */
Intent innerIntent = new Intent();
        innerIntent.setAction(Intent.ACTION_GET_CONTENT);

        innerIntent.setType("image/*");

        Intent wrapperIntent = Intent.createChooser(innerIntent, "选择二维码图片");

        startActivityForResult(wrapperIntent, 0x0202);

第二部分:onActivityResult数据处理

    private String photo_path;

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == 0x0202) {
            if (resultCode == Activity.RESULT_OK) {

                DebugLog.d(data.getData().toString());
                Uri intentData = data.getData();
                /** 之前说的数据不同之处即在这里,6.0之前,得到的Uri字符以“content”开头,需要使用cursor获取路径,而6.0及之后,直接返回了以file开头的文件路径,可以直接使用 */
                if (intentData.toString().startsWith("content")) {
                    String[] proj = { MediaStore.Images.Media.DATA };
                    // 获取选中图片的路径
                    Cursor cursor = getContentResolver().query(data.getData(), proj, null, null, null);

                    if (cur
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值