精华内容
下载资源
问答
  • Playground是weex调试工具,可以从相册选取二维码。Playground是weex调试工具,可以从相册选取二维码
  • js如何禁止微信从相册选取二维码 急!!!!! 调用微信扫一扫功能写完以后发现严重BUG,就是用户可以通过微信扫一扫右上角 从相册选取二维码识别二维码。怎么才能禁止,大神跪求了 肥宅快乐水
  • Zxing图片识别 从相册选取二维码图片进行解析总结
                   

    Zxing图片识别 从相册选取二维码图片进行解析总结 

    在Zxing扫描识别和图片识别的解析对象是相同的

    本文分三个步骤:

    1 获取相册的照片

    2 解析二维码图片

    3 返回结果

     

    1) 获取相册照片

    google对4.4的uri做了点改动  为了适配多种手机 需要做一个判断版本

    在Activity中开启相册:

    [java] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. Intent innerIntent = new Intent(); // "android.intent.action.GET_CONTENT"  
    2.     if (Build.VERSION.SDK_INT < 19) {  
    3.         innerIntent.setAction(Intent.ACTION_GET_CONTENT);  
    4.     } else {  
    5.        // innerIntent.setAction(Intent.ACTION_OPEN_DOCUMENT);  这个方法报 图片地址 空指针;使用下面的方法
    6. innerIntent.setAction(Intent.ACTION_PICK);  
    7.     }  
    8.   
    9.     innerIntent.setType("image/*");  
    10.   
    11.     Intent wrapperIntent = Intent.createChooser(innerIntent, "选择二维码图片");  
    12.   
    13.     CaptureActivity.this  
    14.             .startActivityForResult(wrapperIntent, REQUEST_CODE);  


    选中了照片后返回的数据在onActivityResult方法中获取

     

    [java] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. @Override  
    2.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
    3.   
    4.         super.onActivityResult(requestCode, resultCode, data);  
    5.   
    6.         if (resultCode == RESULT_OK) {  
    7.   
    8.             switch (requestCode) {  
    9.   
    10.             case REQUEST_CODE:  
    11.   
    12.                 String[] proj = { MediaStore.Images.Media.DATA };  
    13.                 // 获取选中图片的路径  
    14.                 Cursor cursor = getContentResolver().query(data.getData(),  
    15.                         proj, nullnullnull);  
    16.   
    17.                 if (cursor.moveToFirst()) {  
    18.   
    19.                     int column_index = cursor  
    20.                             .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);  
    21.                     photo_path = cursor.getString(column_index);  
    22.                     if (photo_path == null) {  
    23.                         photo_path = Utils.getPath(getApplicationContext(),  
    24.                                 data.getData());  
    25.                         Log.i("123path  Utils", photo_path);  
    26.                     }  
    27.                     Log.i("123path", photo_path);  
    28.   
    29.                 }  
    30.   
    31.                 cursor.close();  
    32.   
    33.                 new Thread(new Runnable() {  
    34.   
    35.                     @Override  
    36.                     public void run() {  
    37.   
    38.                         Result result = scanningImage(photo_path);  
    39.                         // String result = decode(photo_path);  
    40.                         if (result == null) {  
    41.                             Looper.prepare();  
    42.                             Toast.makeText(getApplicationContext(), "图片格式有误"0)  
    43.                                     .show();  
    44.                             Looper.loop();  
    45.                         } else {  
    46.                             Log.i("123result", result.toString());  
    47.                             // Log.i("123result", result.getText());  
    48.                             // 数据返回  
    49.                             String recode = recode(result.toString());  
    50.                             Intent data = new Intent();  
    51.                             data.putExtra("result", recode);  
    52.                             setResult(300, data);  
    53.                             finish();  
    54.                         }  
    55.                     }  
    56.                 }).start();  
    57.                 break;  
    58.   
    59.             }  
    60.   
    61.         }  
    62.   
    63.     }  

     

    上面这段代码

     <1> 根据返回的照片信息  获取图片的路径photo_path

     <2> 开启一个解析线程调用解析方法Result result = scanningImage(photo_path);      将photo_path传进去

     <3> 对返回的解析的Result对象进行判断,获取字符串   

     <4> 调用recode对result数据进行中文乱码处理          (  具体在步骤3中说明   )

    [java] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. String recode = recode(result.toString());  

     <5>这里我将result 通过setResult(); 返回给了 父Activity   

    [java] view plain copy
     在CODE上查看代码片派生到我的代码片
    1.    

    <6> Utils.getPath(getApplicationContext(),  data.getData());    //将图片Uri 转换成绝对路径

    [java] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. public class Utils {  
    2.   
    3.     public static final boolean isChineseCharacter(String chineseStr) {  
    4.         char[] charArray = chineseStr.toCharArray();  
    5.         for (int i = 0; i < charArray.length; i++) {  
    6.             // 是否是Unicode编码,除了"�"这个字符.这个字符要另外处理  
    7.             if ((charArray[i] >= '\u0000' && charArray[i] < '\uFFFD')  
    8.                     || ((charArray[i] > '\uFFFD' && charArray[i] < '\uFFFF'))) {  
    9.                 continue;  
    10.             } else {  
    11.                 return false;  
    12.             }  
    13.         }  
    14.         return true;  
    15.     }  
    16.   
    17.     /** 
    18.      * Get a file path from a Uri. This will get the the path for Storage Access 
    19.      * Framework Documents, as well as the _data field for the MediaStore and 
    20.      * other file-based ContentProviders. 
    21.      *  
    22.      * @param context 
    23.      *            The context. 
    24.      * @param uri 
    25.      *            The Uri to query. 
    26.      * @author paulburke 
    27.      */  
    28.     public static String getPath(final Context context, final Uri uri) {  
    29.   
    30.         final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;  
    31.   
    32.         // DocumentProvider  
    33.         if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {  
    34.             
    展开全文
  • 前言本篇博文主要讲解如何从相册选取二维码,进行扫码解析。如果对zxing扫码不熟悉的建议阅读本文之前看看之前的博文: Android基于Zxing扫码实现(一) Android基于Zxing扫码实现(二) 本文的代码基于YZxing库,...

    前言

    本篇博文主要讲解如何从相册选取二维码,进行扫码解析。如果对zxing扫码不熟悉的建议阅读本文之前看看之前的博文:
    Android基于Zxing扫码实现(一)
    Android基于Zxing扫码实现(二)

    本文的代码基于YZxing库,如需查阅代码可前往GitHub上面查看。项目地址如下:
    YZxing

    内容

    从相册获取二维码,主要涉及到几大步骤。
    第一,进入相册获取照片。
    第二,对照片进行压缩。
    第三,对照片上的二维码进行decode。
    第四,对扫码结果进行处理。
    我们一步一步的来看,首先我们实现第一个环节的逻辑,代码如下:

    @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            int itemId = item.getItemId();
            if (itemId == R.id.scan_from_picture) {
                //先申请权限
                int checked = ContextCompat.checkSelfPermission(ScannerActivity.this
                        , Manifest.permission.WRITE_EXTERNAL_STORAGE);
                if (checked == PackageManager.PERMISSION_GRANTED) {
                    goPicture();
                } else {
                    ActivityCompat.requestPermissions(ScannerActivity.this
                            , new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, PERMISSION_REQUEST_CODE_WRITE_EXTERNAL_STORAGE);
                }
            }
            return true;
        }
    
        private void goPicture() {
            Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
            intent.setType("image/*");
            startActivityForResult(intent, REQUEST_CODE_GET_PIC_URI);
        }
    

    上面展示的部分代码。代码逻辑是首先去check权限,然后通过goPicture这个方法去获取相册图片。 照片信息通过onActivityResult方法返回。对此进行处理,代码如下:

    @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            if (resultCode == RESULT_OK) {
                switch (requestCode) {
                    case REQUEST_CODE_GET_PIC_URI:
                        Uri uri = data.getData();
                        String imagePath = UriUtils.getPicturePathFromUri(ScannerActivity.this, uri);
                        //对获取到的二维码照片进行压缩
                        Bitmap bitmap = CommonUtils.compressPicture(imagePath);
                        Message message = mHandler.obtainMessage(MESSAGE_DECODE_FROM_BITMAP, bitmap);
                        mHandler.sendMessage(message);
                        Log.e(TAG, "onActivityResult: uri:" + uri.toString());
                        break;
                }
            }
        }
    

    这里涉及两大逻辑,一是获取照片的路径,一是对照片进行压缩处理。获取照片路径的代码如下:

    public static String getPicturePathFromUri(Context context, Uri uri) {
            int sdkVersion = Build.VERSION.SDK_INT;
            if (sdkVersion >= 19) { 
                return getPicturePathFromUriAboveApi19(context, uri);
            } else { 
                return getPicturePathFromUriBelowAPI19(context, uri);
            }
        }
    
        private static String getPicturePathFromUriBelowAPI19(Context context, Uri uri) {
            return getDataColumn(context, uri, null, null);
        }
    
        private static String getPicturePathFromUriAboveApi19(Context context, Uri uri) {
            String filePath = null;
            if (DocumentsContract.isDocumentUri(context, uri)) {
                // 如果是document类型的 uri, 则通过document id来进行处理
                String documentId = DocumentsContract.getDocumentId(uri);
                if (isMediaDocument(uri)) { // MediaProvider
                    // 使用':'分割
                    String id = documentId.split(":")[1];
    
                    String selection = MediaStore.Images.Media._ID + "=?";
                    String[] selectionArgs = {id};
                    filePath = getDataColumn(context, MediaStore.Images.Media.EXTERNAL_CONTENT_URI, selection, selectionArgs);
                } else if (isDownloadsDocument(uri)) { // DownloadsProvider
                    Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(documentId));
                    filePath = getDataColumn(context, contentUri, null, null);
                }
            } else if ("content".equalsIgnoreCase(uri.getScheme())) {
                // 如果是 content 类型的 Uri
                filePath = getDataColumn(context, uri, null, null);
            } else if ("file".equals(uri.getScheme())) {
                // 如果是 file 类型的 Uri,直接获取图片对应的路径
                filePath = uri.getPath();
            }
            return filePath;
        }
    
        private static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) {
            String path = null;
    
            String[] projection = new String[]{MediaStore.Images.Media.DATA};
            Cursor cursor = null;
            try {
                cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null);
                if (cursor != null && cursor.moveToFirst()) {
                    int columnIndex = cursor.getColumnIndexOrThrow(projection[0]);
                    path = cursor.getString(columnIndex);
                }
            } catch (Exception e) {
                if (cursor != null) {
                    cursor.close();
                }
            }
            return path;
        }
    
        private static boolean isMediaDocument(Uri uri) {
            return "com.android.providers.media.documents".equals(uri.getAuthority());
        }
    
        private static boolean isDownloadsDocument(Uri uri) {
            return "com.android.providers.downloads.documents".equals(uri.getAuthority());
        }
    

    对照片进行压缩的代码如下:

    public static Bitmap compressPicture(String imgPath) {
            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inJustDecodeBounds = true;
            BitmapFactory.decodeFile(imgPath, options);
            Log.e(TAG, "onActivityResult: 未压缩之前图片的宽:" + options.outWidth + "--未压缩之前图片的高:"
                    + options.outHeight + "--未压缩之前图片大小:" + options.outWidth * options.outHeight * 4 / 1024 / 1024 + "M");
    
            options.inSampleSize = calculateInSampleSize(options, 100, 100);
            Log.e(TAG, "onActivityResult: inSampleSize:" + options.inSampleSize);
            options.inJustDecodeBounds = false;
            Bitmap afterCompressBm = BitmapFactory.decodeFile(imgPath, options);
    //      //默认的图片格式是Bitmap.Config.ARGB_8888
            Log.e(TAG, "onActivityResult: 图片的宽:" + afterCompressBm.getWidth() + "--图片的高:"
                    + afterCompressBm.getHeight() + "--图片大小:" + afterCompressBm.getWidth() * afterCompressBm.getHeight() * 4 / 1024 / 1024 + "M");
            return afterCompressBm;
        }
    
        private static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
            final int height = options.outHeight;
            final int width = options.outWidth;
            int inSampleSize = 1;
    
            if (height > reqHeight || width > reqWidth) {
    
                final int halfHeight = height / 2;
                final int halfWidth = width / 2;
    
                while ((halfHeight / inSampleSize) >= reqHeight
                        && (halfWidth / inSampleSize) >= reqWidth) {
                    inSampleSize *= 2;
                }
            }
    
            return inSampleSize;
        }
    

    对照片压缩这块不熟悉的可以参考文章:
    压缩指定大小的BitMap
    照片处理这块,着重提一下,这边对照片的处理是必须的,除了节省内存不说,还可以提高扫码成功率。这里做了不少测试,如果照片中二维码大小和照片本身大小存在巨大差异的话,就是说照片中的二维码特别小,就会有扫不出来的情况,亲测有效的一个解决方法是通过对照片进行裁剪,把除了二维码外多余的部分裁减掉就可以成功解码了 这里可以通过跳系统的裁剪界面,也可以自己设计裁剪界面来实现裁剪。我这边比较懒,就没做裁剪过程。如果想自定义裁剪界面的话,这边推荐一个源码写的挺好,可以去看看。自定义裁剪界面 这个裁剪逻辑加在上面所说的第二步和第三步中间就行,其他步骤都不变。有需要的可以去看看。

    接着看,照片压缩之后就是对照片的解码了。代码如下:

     @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                ScannerActivity activity = this.activity.get();
                if (activity != null) {
                    if (msg.what == activity.MESSAGE_DECODE_FROM_BITMAP) {
                        Bitmap bm = (Bitmap) msg.obj;
                        DecodeUtils.DecodeAsyncTask decodeAsyncTask = new DecodeUtils.DecodeAsyncTask(activity);
                        decodeAsyncTask.execute(bm);
                    }
                }
            }
            
    
    public static class DecodeAsyncTask extends AsyncTask<Bitmap, Integer, Result> {
    
            private WeakReference<Context> mContext;
            private Result result;
    
            public DecodeAsyncTask(Context mContext) {
                this.mContext = new WeakReference<Context>(mContext);
            }
    
            @Override
            protected void onPreExecute() {
                super.onPreExecute();
            }
    
            @Override
            protected Result doInBackground(Bitmap... bitmaps) {
                result = decodeFromPicture(bitmaps[0]);
                return result;
            }
    
            @Override
            protected void onPostExecute(Result result) {
                super.onPostExecute(result);
                if (result != null) {
                    String text = result.getText();
                    if (!TextUtils.isEmpty(text)) {
                        Intent intent = new Intent(mContext.get(), ShowResultActivity.class);
                        intent.putExtra(Constant.EXTRA_RESULT_TEXT_FROM_PIC, text);
                        mContext.get().startActivity(intent);
                        if (mContext.get() instanceof Activity) ((Activity) mContext.get()).finish();
                    }
                } else {
                    Toast.makeText(mContext.get(), "解码失败", Toast.LENGTH_SHORT).show();
                }
    
            }
        }
    
    

    通过自定义的一个AsyncTask来处理解码这一耗时操作。这边扫码成功后的逻辑是如果扫码扫出来的是一个正确的网址就直接跳转到网页,如果不是的话,就显示到TextView上。

    演示效果

    扫码图片为:

    这里写图片描述

    这里写图片描述


    YZxing

    compile 'com.yangy:YZxing-lib:2.1’

    YZxing目前已更新至2.1版本,修复部分已知bug,添加了从相册获取二维码的功能,该功能默认情况下不启用,如需使用,需要在代码中添加:

    //设置是否启用从相册获取二维码。
    //        intent.putExtra(Constant.EXTRA_IS_ENABLE_SCAN_FROM_PIC,true);
    

    上诉语句表示启用此功能。关于YZxing的完整使用,可以去YZxing项目浏览。

    结语

    上面所列的代码,在YZxing项目上有完整代码。如果有需要可以去YZxing项目 浏览使用。


    加入我的个人技术公众号,一起学习Android知识!
    在这里插入图片描述
    扫码体验小程序:微捷径
    微捷径

    展开全文
  • <div><p> 手机截屏的二维码识别崩溃,建议崩溃这里加非 nil 判断</p><p>该提问来源于开源项目:MxABC/LBXScan</p></div>
  • <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1.0"> <title>my-pro</title>...
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width,initial-scale=1.0">
        <title>my-pro</title>
        <script src="jquery.min.js"></script>
        <script src="reqrcode.js"></script>
    </head>
    
    <body>
    <input type="file" id="newfile">
    </body>
    
    <script>
        var newfile = document.getElementById('newfile');
        var getObjectURL = function (file) {
            var url = null;
            if (window.createObjectURL != undefined) { // basic
                url = window.createObjectURL(file);
            } else if (window.URL != undefined) { // mozilla(firefox)
                url = window.URL.createObjectURL(file);
            } else if (window.webkitURL != undefined) { // webkit or chrome
                url = window.webkitURL.createObjectURL(file);
            }
            return url;
        }
        newfile.onchange = function () {
            //   console.log(newfile[0]);
            console.log(getObjectURL(this.files[0]));// newfile[0]是通过input file上传的二维码图片文件
            qrcode.decode(getObjectURL(this.files[0]));
            qrcode.callback = function (imgMsg) {
                alert("二维码解析:" + imgMsg)
            }
        }
    </script>
    
    </html>
    
    

    在这里插入图片描述
    源码路径

    展开全文
  • 加上从相册选取 。闪光等。目前 android 我已经写好 。地址 https://github.com/yrjwcharm/react-native-simple-scanner-qrcode 其相应博客地址: https://blog.csdn.net/qq_21937107/article/details/91981921

    我的demo 地址 http://github.com/yrjwcharm/react-native-scanner-qrcode 博友直接 下载压缩包 或者git clone
    因为我的版本比较高。所以下载下来 一般都会运行起来 。效果如下。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    最后alert 显示出的就是扫描结果。我是在Zxing框架基础上封装的 可供ReactNative 项目使用的 demo , 之前想着 是 直接把我这个项目弄成一个三方库 发布到npm,供大家使用 ,但是鄙人不太会ios .目前只 实现了 android 所以就没发布。如果大神有ios 实现方案。可在github 上拉取请求 我做个合并。现在目前如果android有需要的话。只能是把我的demo下载下来。运行起来后。直接复制我依赖和所写的相关内容。就可成功。 目前ios只能敬请等待ios 大神 拉取请求 和我合并了。

    可能有些博友 。说一个app 不需要这么多功能的界面。大部分功能 可能就是一个扫描框。加上从相册选取 。闪光等。目前 android 我已经写好 。地址 https://github.com/yrjwcharm/react-native-simple-scanner-qrcode 其相应博客地址:https://blog.csdn.net/qq_21937107/article/details/91981921

    展开全文
  • Zxing图片识别 从相册二维码图片解析总结

    万次阅读 多人点赞 2014-05-03 10:06:02
    Zxing图片识别 从相册选取二维码图片进行解析总结 在Zxing扫描识别和图片识别的解析对象是相同的 本文分三个步骤: 1 获取相册的照片 2 解析二维码图片 3 返回结果 1) 获取相册照片 google对4.4的uri做了点...
  • 上一篇我介绍了如何生成自定义二维码《Android生成自定义二维码》,其中logo和代替黑色色块的图片都是写死的,所以现在我们就来实现拍照或者从相册选取图片这个功能。先看效果图: 拍照 1.启动相机程序 ...
  • <div><p>iOS10 6plus / Xcode 8 测试识别二维码不成功(不会crash) <p><code>NSArray *features = [detector featuresInImage:[CIImage imageWithCGImage:image.CGImage]]; 初步判断是这个部分的...
  • QRCodeScaniOS扫码控件,可以对二维码进行扫描以及从相册选取二维码识别效果图关键代码如下使用iOS原生控件进行扫码#pragma mark - 初始化扫描功能 - (void)initScanWithRect:(CGRect)rect { //获取摄像设备 ...
  • 2. 安装完插件后将二维码的lib包替换为zxing.lib,jar包在我上传的demo里面有。 3. 将demo中的drawable图片拷贝到自己项目中,然后再依次拷贝layout布局文件夹,raw文件夹(此文件夹下是扫描成功后发出的声音),values...
  • 对zxing进行优化的思考 前言 对于Google 的开源框架...Android 基于Zxing扫码实现(三)、从相册选取二维码 Android 二维码开发功能实现(四)------基于Zxing实现编码功能(生成二维码,一维码等) 日常关于条码的...
  • 之前写过生成自定义二维码的两篇文章:《Android生成自定义二维码》《Android生成二维码–拍照或从相册选取图片》,下面就介绍一下Android应用内如何保存以及分享二维码图片。 保存图片 Adnroid中保存图片的方法...
  • GenerateQRCode

    2019-12-23 15:38:46
    GenerateQRCode 项目地址:yangxch/GenerateQRCode 简介: 1....2.拍照或从相册选取图片。3.二维码保存和分享 更多:作者提 Bug 标签: Gdcbb-Vvbc-Cvnn-Hhcbn-Fcvbn- 自定义二维码生成:一般...
  • 需求:发朋友圈进行图片的选择,或者扫描二维码从图库选取。。。那么我们如何实现?这就需要借助媒体库的内容提供者MediaProvider,通过它,我们不仅可以读取图片,还可以读取视频,音频。 下面我们来看一下媒体库的...
  • 昨天我把扫描部分选取相册的部分完成,增加APP图标。 遇到困难:可选取相册中二维码,但无法读取...今天我将继续二维码从相册读取部分的修改。 转载于:https://www.cnblogs.com/a1397240667/p/5433588.html...
  • 2、今天打算做一些图标等的改正,然后将二维码从相册选取部分改正一下。 3、遇到的问题:二维码扫描部分从相册选择可以了,但是扫描的时候无法跳转到相应的网址报错。 转载于:...
  • 1、昨天做的是界面的优化...3、遇到的问题:二维码扫描部分从相册选取部分总是闪退,原因还未查明,有待继续研究,滑动界面还在继续实现,fragment部分报错。 转载于:https://www.cnblogs.com/zz0906/p/5432698.html...
  • 注意:不包括长按识别和从相册选取识别!! 当小程序从聊天顶部场景(场景值1089)中的「最近使用」内打开时,若小程序之前未被销毁,则该组件保持上一次打开小程序时的状态 当从其他小程序返回小程序(场...

空空如也

空空如也

1 2
收藏数 29
精华内容 11
关键字:

从相册选取二维码