二维码发展到现在几乎是每一个App都有的功能,之前项目里用到了二维码功能就研究了下如何嵌入zxing二维码工程,之前的用法制包含了最基本的二维码扫码工能,用QQ时看到QQd的扫一扫,功能相对较全,可以扫图片,可以开闪光灯,还可以生成二维码,都是比较常用的功能,于是就仿照QQ的二维码样式和功能,自己也做了一个common工程,这样,以后要用二维码是就不必再做配置等工作了,直接关联到这个二维码工程即可.文章最后我会将整个工程上传到我的资源中,有需要的可以下载。

下面先看一下整体效果图:                                                                   点击相册后的效果图:

开灯后的效果图和设备串号生成的二维码:

由于没有美工配合,样子真心是不如QQ好看,好在功能基本都实现了,相册就是从本地图库中选去二维码扫描,开灯就是打开手机闪光灯,二维码是将手机序列号生成一个二维码。下面是代码部分,改动的地方和添加的地方都做了注释,相信大家能看懂。‘

1.相册功能添加代码,代码添加在zxing工程已有的CaptureActivity.java类中。

相册点击事件处理:

 public void onClick(View v){switch (v.getId()){case R.id.photo_btn:// 打开手机中的相册Intent innerIntent = new Intent(Intent.ACTION_GET_CONTENT); // "android.intent.action.GET_CONTENT"innerIntent.setType("image/*");Intent wrapperIntent = Intent.createChooser(innerIntent, "选择二维码图片");this.startActivityForResult(wrapperIntent, REQUEST_CODE);break;}}

利用zxing执行图片扫码:

protected void onActivityResult(int requestCode, int resultCode, Intent data){super.onActivityResult(requestCode, resultCode, data);if (resultCode == RESULT_OK){switch (requestCode){case REQUEST_CODE:// 获取选中图片的路径Cursor cursor = getContentResolver().query(data.getData(), null, null, null, null);if (cursor.moveToFirst()){photo_path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));}cursor.close();new Thread(new Runnable(){@Overridepublic void run(){Result result = scanningImage(photo_path);if (result != null){Message m = mHandler.obtainMessage();m.what = PARSE_BARCODE_SUC;m.obj = result.getText();mHandler.sendMessage(m);}else{Message m = mHandler.obtainMessage();m.what = PARSE_BARCODE_FAIL;m.obj = "Scan failed!";mHandler.sendMessage(m);}}}).start();break;}}}

scanneringImage()方法代码:

/*** 扫描二维码图片的方法* * @param path* @return*/public Result scanningImage(String path){if (TextUtils.isEmpty(path)){return null;}Hashtable<DecodeHintType, String> hints = new Hashtable<DecodeHintType, String>();hints.put(DecodeHintType.CHARACTER_SET, "UTF8"); // 设置二维码内容的编码BitmapFactory.Options options = new BitmapFactory.Options();options.inJustDecodeBounds = true; // 先获取原大小scanBitmap = BitmapFactory.decodeFile(path, options);options.inJustDecodeBounds = false; // 获取新的大小int sampleSize = (int) (options.outHeight / (float) 200);if (sampleSize <= 0)sampleSize = 1;options.inSampleSize = sampleSize;scanBitmap = BitmapFactory.decodeFile(path, options);RGBLuminanceSource source = new RGBLuminanceSource(scanBitmap);BinaryBitmap bitmap1 = new BinaryBitmap(new HybridBinarizer(source));QRCodeReader reader = new QRCodeReader();try{return reader.decode(bitmap1, hints);}catch (NotFoundException e){e.printStackTrace();}catch (ChecksumException e){e.printStackTrace();}catch (FormatException e){e.printStackTrace();}return null;}

2.开闪光灯,下面是开闪光灯要添加的代码,代码添加在CameraManager.java中。

 /*** 通过设置Camera打开闪光灯*/public void turnLightOn(){if (camera == null){return;}Parameters parameters = camera.getParameters();if (parameters == null){return;}List<String> flashModes = parameters.getSupportedFlashModes();if (flashModes == null){return;}String flashMode = parameters.getFlashMode();Log.i(TAG, "Flash mode: " + flashMode);Log.i(TAG, "Flash modes: " + flashModes);// 闪光灯关闭状态if (!Parameters.FLASH_MODE_TORCH.equals(flashMode)){// Turn on the flashif (flashModes.contains(Parameters.FLASH_MODE_TORCH)){parameters.setFlashMode(Parameters.FLASH_MODE_TORCH);camera.setParameters(parameters);camera.startPreview();}else{}}}/*** 通过设置Camera关闭闪光灯 * @param mCamera*/public void turnLightOff(){if (camera == null){return;}Parameters parameters = camera.getParameters();if (parameters == null){return;}List<String> flashModes = parameters.getSupportedFlashModes();String flashMode = parameters.getFlashMode();// Check if camera flash existsif (flashModes == null){return;}// 闪光灯打开状态if (!Parameters.FLASH_MODE_OFF.equals(flashMode)){// Turn off the flashif (flashModes.contains(Parameters.FLASH_MODE_OFF)){parameters.setFlashMode(Parameters.FLASH_MODE_OFF);camera.setParameters(parameters);}else{Log.e(TAG, "FLASH_MODE_OFF not supported");}}}

3.生成二维码,代码添加在CaptureActivity.java类中。

/**** 获得手机设备的串号* @param context* @return*/public static String getIMEI(Context context){TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);// Get deviceIdString deviceId = tm.getDeviceId();// If running on an emulatorif (deviceId == null || deviceId.trim().length() == 0 || deviceId.matches("0+")){deviceId = (new StringBuilder("EMU")).append((new Random(System.currentTimeMillis())).nextLong()).toString();}return deviceId;}/*** 生成二维码方法*/private Bitmap createQRCode(){int QR_WIDTH = 100;int QR_HEIGHT = 100;try{// 需要引入core包QRCodeWriter writer = new QRCodeWriter();String mime= getIMEI(this);if (text == null || "".equals(text) || text.length() < 1){return null;}// 把输入的文本转为二维码BitMatrix martix = writer.encode(text, BarcodeFormat.QR_CODE, QR_WIDTH, QR_HEIGHT);System.out.println("w:" + martix.getWidth() + "h:" + martix.getHeight());Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>();hints.put(EncodeHintType.CHARACTER_SET, "utf-8");BitMatrix bitMatrix = new QRCodeWriter().encode(text, BarcodeFormat.QR_CODE, QR_WIDTH, QR_HEIGHT, hints);int[] pixels = new int[QR_WIDTH * QR_HEIGHT];for (int y = 0; y < QR_HEIGHT; y++){for (int x = 0; x < QR_WIDTH; x++){if (bitMatrix.get(x, y)){pixels[y * QR_WIDTH + x] = 0xff000000;}else{pixels[y * QR_WIDTH + x] = 0xffffffff;}}}// cheng chen de er wei maBitmap bitmap = Bitmap.createBitmap(QR_WIDTH, QR_HEIGHT, Bitmap.Config.ARGB_8888);bitmap.setPixels(pixels, 0, QR_WIDTH, 0, 0, QR_WIDTH, QR_HEIGHT);return bitmap;}catch (WriterException e){e.printStackTrace();}return null;}

初始工程的配置和对扫描框的修改都参考了这篇博客,大家可以看下。http://blog.csdn.net/xiaanming/article/details/10163203.

项目源码

android二维码工程之仿QQ二维码实现相关推荐

  1. 二维码之zxing仿新浪微博二维码

    在前言中最后部分,提到了二维码开发工具资源ZXing.网上有它最新1.7版的源码,感兴趣的可以下载下来看看,要打包生成core比较麻烦,网上有相关教程.嫌麻烦的朋友,可以去我的资源里下载Java版的c ...

  2. Android特效专辑(六)——仿QQ聊天撒花特效,无形装逼,最为致命

    Android特效专辑(六)--仿QQ聊天撒花特效,无形装逼,最为致命 我的关于特效的专辑已经在CSDN上申请了一个专栏--http://blog.csdn.net/column/details/li ...

  3. Android源码解析--SwipeMenuListView仿QQ聊天左滑

    版权声明:本文为博主原创文章,转载请标明出处. https://blog.csdn.net/lyhhj/article/details/50612714 绪论: 好久没写博客了,最近比较懒,不想写博客 ...

  4. android弹窗使用总结,高仿QQ空间操作弹窗

    android弹窗一共有两种方式,一种是dialog及其子类,另一种是popupwindow:Dialog及其子类尤其AlertDialog是最常用的,也是最自由的一种. **Popupwindow与 ...

  5. 仿qq空间源码_【每日源码】一个Go语言编写的百度网盘客户端,强力推荐

    本月第7个源码推送 仿 Linux shell 文件处理命令的百度网盘命令行客户端. 功能简介: 目录 特色 编译/交叉编译 说明 下载/运行 说明 Windows Linux / macOS And ...

  6. 仿qq空间java源码_android 发说说动态源码下载(高仿QQ空间,含图片多选)

    [实例简介]仿qq发动态,图片发布效果 [实例截图] [核心代码] package com.king.photo.activity; import android.annotation.Suppres ...

  7. 仿qq邮箱源码程序_QQ微信头像制图工具箱小程序纯前端源码

    今天在网上看到了一个微信小程序源码,经测试QQ小程序也可以完美运行,所以给大家分享一下这个QQ微信头像制图工具箱小程序纯前端源码. 主要功能有文字九格.头像挂件生成.爆趣九宫格.形状九宫格.创意长图. ...

  8. flappy bird java源码_android高仿flappy bird源码

    [实例简介]android高仿flappy bird源码,可以在任何机型上完美运行,难度可以自己调整,适合新手,当做一个小项目练练手. [实例截图] [核心代码] package liqiang.fl ...

  9. android变声后的文件,仿QQ语音变声功能实现(二)---移植到android studio 并解决部分问题...

    版权声明:转载必须注明本文转自张鹏辉的博客: http://blog.csdn.net/qingtiangg 大家好,距离上一篇博客半年过去了,关于上一篇博客很多人加我QQ留言问了几个问题,最近不忙决 ...

  10. bomb android实战,android 仿qq app源码下载(bmob)

    [实例简介] [实例截图] [核心代码] package com.bmob.im.demo.ui; import android.os.Bundle; import android.support.v ...

最新文章

  1. 如何画出优秀的架构图?
  2. 估值380亿美元!这家微软、谷歌、亚马逊都投资的AI初创公司什么来头?
  3. ubuntu下wps无法使用搜狗输入法输入中文
  4. 结合keepalived实现redis群集高可用故障自动切换
  5. anaconda管理环境
  6. cdoj1342郭大侠与甲铁城
  7. 分账汇总少了一笔 和 对账和商户汇总比基础表少了一笔 问题处理方式
  8. Oracle和Mysql的不同
  9. 扒一扒,互联网大厂内部都用什么软件沟通?
  10. YOLOv2——中文版翻译
  11. 魔兽服务器里炉石怎么修改,魔兽世界炉石怎么用
  12. 2022年安全员-A证考题模拟考试平台操作
  13. ad18常用快捷键可以修改吗_AD18快捷键
  14. 结合OPENCV SIFT代码浅谈Lowe的一些SIFT算法细节
  15. 远程ntp服务器响应模式6查询,H3C WP5048无线PoE注入器 命令参考-Release 2208-6W100
  16. 中图法检索计算机科学方面,信息检索 第一次上机答案lpar;南通大学rpar;
  17. 程序员不能忍996了!发起抗议网站,GitHub一小时破千星
  18. QCustomPlot常用操作
  19. 【分享】新浪微博、QQ分享、微信分享的申请过程
  20. nginx部署vue项目加载资源慢优化方案

热门文章

  1. jQuery:基础知识学习
  2. loading怎么关闭 vant_Vant Loading 加载
  3. Mysql数据库性能优化配置:my.cnf/my.ini配置说明详解(测试机器为16GB内存)
  4. 使用js事件绑定要调用函数的的三种方式
  5. 多GPU环境运行实验的一点经验
  6. python运算优先级
  7. s5p6818开发板uboot网络开通
  8. jQuery淡入淡出
  9. Linux 下超级有趣的命令
  10. MFC DoDataExchange()绑定技术