精华内容
下载资源
问答
  • 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知识!
    在这里插入图片描述
    扫码体验小程序:微捷径
    微捷径

    展开全文
  • <!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
    因为我的版本比较高。所以下载下来 一般都会运行起来 。效果如下。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

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

    万次阅读 多人点赞 2014-05-03 10:06:02
    Zxing图片识别 从相册选取二维码图片进行解析总结 在Zxing扫描识别和图片识别的解析对象是相同的 本文分三个步骤: 1 获取相册的照片 2 解析二维码图片 3 返回结果 1) 获取相册照片 google对4.4的uri做了点...
  • 现在很多App都有扫码识别二维码的场景,最新的扫码已经支持全屏扫码、从相册选取二维码识别,以下使用基于Zxing封装的一个库:https://github.com/maning0303/MNZXingCode MNZXingCode 快速集成zxing二维码扫描 ...
  • 项目提供了相册选取二维码扫描,定制二维码扫描界面,生成二维码,也可根据自身要求修改界面,我是修改为扫描自己二维码进行定制。
  • React-Native 扫码功能以及从相册读取二维码

    千次阅读 热门讨论 2019-03-02 12:30:24
    我使用的技术栈是:react-native(0.57.8...我在做的ReactNative项目需要实现扫码功能以及从相册读取本地二维码的功能 我实现这两个功能使用的插件有 react-native-camera react-native-image-picker react-native-...
  • 拍照或从相册选择图片是我们日常开发中经常使用到的,可以说是必须掌握的东西。
  • 本在在做一个从相册读取二维码的程序,现在通过以下代码可以对所选图案的解析. 问题: 无法判断所选取的图案是否是有效的二维码. 导致错误的信息读取.  -( void )imagePickerController:( ...
  • 今天要在二维码扫一扫中添加一个功能:扫描相册二维码图片。 在网上查了下,都是用第三方库来实现的,就去研究了下ios8官方文档,发现原生库中已经有了办法:  1、跳转相册我是直接用的...
  • 二维码的处理及系统原生API扫描、 Zbar扫描和Zing扫描 ...系统扫描的效率是最高,反正包括各种你见过的没见过的码,但是有一点我不是很清楚 iOS7 扫描二维码可以,但从相册照片读取二维码苹果不支持,必须是iOS8+。 ...
  • 用react-native-image-crop-picker库选取相册二维码图片 用react-native-local-barcode-recognizer解析二维码图片 如果只需要扫描二维码,不需要识别相册中的二维码图片,只安装react-native-camera库就好 ...
  • 二维码生成 //MARK: 传进去字符串,生成二维码图片(>=iOS7) text:要生成的二维码内容 WH:二维码高宽 private func creatQRCodeImage(text: String,WH:CGFloat) -> UIImage{ //创建滤镜 let fi....
  • 在官方H5+ API中barcode通过调用设备的摄像头对二维码进行扫描识别,扫描到二维码后进行解码并返回码数据内容及码类型。但是暂未给出识别手机拍摄的二维码,以下代码实现了此功能。 完整demo:...
  • 使用zbar调用相机扫码代码: //打开相机 - (void) init_camera {   self.navigationController.navigationBarHidden=YES;  [common ...Info:@"二维码" Target:self action:@se
  • android zxing 二维码长按识别和生成 注:没有扫描 和 从相册选取二维码图片识别的功能 版本 zxing3.2.0
  • 项目中添加设备操作需要扫描二维码,考虑到多种扫码...首先跳转系统相册选取图片 Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startA...
  • 项目中有用到h5识别我们的单据,单据上面有二维码. 实现的场景就是业务人员扫码 类似以下场景 业务员拿到单据以后,直接可以扫码进入相关单据业也可以 输入二维码下方的号码进行识别 下面是h5的页面构造...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 932
精华内容 372
关键字:

从相册选取二维码