iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >Android基于google Zxing实现二维码的生成
  • 352
分享到

Android基于google Zxing实现二维码的生成

googlezxing二维二维码Android 2022-06-06 08:06:09 352人浏览 八月长安
摘要

最近项目用到了二维码的生成与识别,之前没有接触这块,然后就上网搜了搜,发现有好多这方面的资源,特别是Google Zxing对二维码的封装,实现的已经不错了,可以直接拿过来引用

最近项目用到了二维码的生成与识别,之前没有接触这块,然后就上网搜了搜,发现有好多这方面的资源,特别是Google Zxing对二维码的封装,实现的已经不错了,可以直接拿过来引用,下载了他们的源码后,只做了少少的改动,就是在Demo中增加了长按识别的功能,网上虽然也有长按识别的Demo,但好多下载下来却无法运行,然后总结了一下,加在了下面的Demo中。  
下面来介绍这个Demo的主类


public class BarCodeTestActivity extends Activity { 
private TextView resultTextView; 
private EditText qrStrEditText; 
private ImageView qrImgImageView; 
private String time; 
 private File file = null; 
 @Override 
 public void onCreate(Bundle savedInstanceState) { 
  super.onCreate(savedInstanceState); 
  setContentView(R.layout.main);   
  resultTextView = (TextView) this.findViewById(R.id.tv_scan_result); 
  qrStrEditText = (EditText) this.findViewById(R.id.et_qr_string); 
  qrImgImageView = (ImageView) this.findViewById(R.id.iv_qr_image); 
  Button scanBarCodeButton = (Button) this.findViewById(R.id.btn_scan_barcode); 
  scanBarCodeButton.setOnClickListener(new OnClickListener() { 
@Override 
public void onClick(View v) { 
//打开扫描界面扫描条形码或二维码 
Intent openCameraIntent = new Intent(BarCodeTestActivity.this,CaptuReactivity.class); 
startActivityForResult(openCameraIntent, 0); 
} 
}); 
qrImgImageView.setOnLonGClickListener(new OnLongClickListener() { 
@Override 
public boolean onLongClick(View v) { 
// 长按识别二维码 
 saveCurrentImage(); 
return true; 
} 
});   
  Button generateQRCodeButton = (Button) this.findViewById(R.id.btn_add_qrcode); 
  generateQRCodeButton.setOnClickListener(new OnClickListener() { 
@Override 
public void onClick(View v) { 
try { 
String contentString = qrStrEditText.getText().toString(); 
if (!contentString.equals("")) { 
//根据字符串生成二维码图片并显示在界面上,第二个参数为图片的大小(350*350) 
Bitmap qrCodeBitmap = EncodingHandler.createQRCode(contentString, 350); 
qrImgImageView.setImageBitmap(qrCodeBitmap); 
}else { 
//提示文本不能是空的 
Toast.makeText(BarCodeTestActivity.this, "Text can not be empty", Toast.LENGTH_SHORT).show(); 
} 
} catch (WriterException e) { 
// TODO Auto-generated catch block 
e.printStackTrace(); 
} 
} 
}); 
 } 
 //这种方法状态栏是空白,显示不了状态栏的信息 
 private void saveCurrentImage() 
 { 
  //获取当前屏幕的大小 
  int width = getWindow().getDecorView().getRootView().getWidth(); 
  int height = getWindow().getDecorView().getRootView().getHeight(); 
  //生成相同大小的图片 
  Bitmap temBitmap = Bitmap.createBitmap( width, height, Bitmap.Config.ARGB_8888 ); 
  //找到当前页面的根布局 
  View view = getWindow().getDecorView().getRootView(); 
  //设置缓存 
  view.setDrawingCacheEnabled(true); 
  view.buildDrawingCache(); 
  //从缓存中获取当前屏幕的图片,创建一个DrawingCache的拷贝,因为DrawingCache得到的位图在禁用后会被回收 
  temBitmap = view.getDrawingCache(); 
  SimpleDateFORMat df = new SimpleDateFormat("yyyymmddhhmmss"); 
  time = df.format(new Date()); 
  if(Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())){ 
   file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/screen",time + ".png"); 
   if(!file.exists()){ 
    file.getParentFile().mkdirs(); 
    try { 
     file.createNewFile(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
   } 
   FileOutputStream fos = null; 
   try { 
    fos = new FileOutputStream(file); 
    temBitmap.compress(Bitmap.CompressFormat.PNG, 100, fos); 
    fos.flush(); 
    fos.close(); 
   } catch (FileNotFoundException e) { 
    e.printStackTrace(); 
   } catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
   } 
   new Thread(new Runnable() { 
    @Override 
    public void run() { 
     String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/screen/" + time + ".png"; 
     final Result result = parseQRcodeBitmap(path); 
     runOnUiThread(new Runnable() { 
      public void run() { 
      if(null!=result){ 
      resultTextView.setText(result.toString()); 
      }else{ 
       Toast.makeText(BarCodeTestActivity.this, "无法识别", Toast.LENGTH_LONG).show(); 
      } 
      } 
     }); 
    } 
   }).start(); 
   //禁用DrawingCahce否则会影响性能 ,而且不禁止会导致每次截图到保存的是缓存的位图 
   view.setDrawingCacheEnabled(false); 
  } 
 } 
 //解析二维码图片,返回结果封装在Result对象中 
 private com.google.zxing.Result parseQRcodeBitmap(String bitmapPath){ 
  //解析转换类型UTF-8 
  Hashtable<DecodeHintType, String> hints = new Hashtable<DecodeHintType, String>(); 
  hints.put(DecodeHintType.CHARACTER_SET, "utf-8"); 
  //获取到待解析的图片 
  BitmapFactory.Options options = new BitmapFactory.Options();  
  //如果我们把inJustDecodeBounds设为true,那么BitmapFactory.decodeFile(String path, Options opt) 
  //并不会真的返回一个Bitmap给你,它仅仅会把它的宽,高取回来给你 
  options.inJustDecodeBounds = true; 
  //此时的bitmap是null,这段代码之后,options.outWidth 和 options.outHeight就是我们想要的宽和高了 
  Bitmap bitmap = BitmapFactory.decodeFile(bitmapPath,options); 
  //我们现在想取出来的图片的边长(二维码图片是正方形的)设置为400像素 
   
  //以上这种做法,虽然把bitmap限定到了我们要的大小,但是并没有节约内存,如果要节约内存,我们还需要使用inSimpleSize这个属性 
  options.inSampleSize = options.outHeight / 400; 
  if(options.inSampleSize <= 0){ 
   options.inSampleSize = 1; //防止其值小于或等于0 
  } 
   
  options.inJustDecodeBounds = false; 
  bitmap = BitmapFactory.decodeFile(bitmapPath, options);  
  //新建一个RGBLuminanceSource对象,将bitmap图片传给此对象 
  RGBLuminanceSource rgbLuminanceSource = new RGBLuminanceSource(bitmap); 
  //将图片转换成二进制图片 
  BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(rgbLuminanceSource)); 
  //初始化解析对象 
  QRCodeReader reader = new QRCodeReader(); 
  //开始解析 
  Result result = null; 
  try { 
   result = reader.decode(binaryBitmap, hints); 
  } catch (Exception e) { 
   // TODO: handle exception 
  } 
  return result; 
 } 
@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
super.onActivityResult(requestCode, resultCode, data); 
//处理扫描结果(在界面上显示) 
if (resultCode == RESULT_OK) { 
Bundle bundle = data.getExtras(); 
String scanResult = bundle.getString("result"); 
resultTextView.setText(scanResult); 
} 
} 
} 

然后长按识别二维码调用了RGBLuminanceSource这个类


public class RGBLuminanceSource extends LuminanceSource { 
private byte bitmapPixels[]; 
protected RGBLuminanceSource(Bitmap bitmap) { 
super(bitmap.getWidth(), bitmap.getHeight()); 
// 首先,要取得该图片的像素数组内容 
int[] data = new int[bitmap.getWidth() * bitmap.getHeight()]; 
this.bitmapPixels = new byte[bitmap.getWidth() * bitmap.getHeight()]; 
bitmap.getPixels(data, 0, getWidth(), 0, 0, getWidth(), getHeight()); 
// 将int数组转换为byte数组,也就是取像素值中蓝色值部分作为辨析内容 
for (int i = 0; i < data.length; i++) { 
this.bitmapPixels[i] = (byte) data[i]; 
} 
} 
@Override 
public byte[] getMatrix() { 
// 返回我们生成好的像素数据 
return bitmapPixels; 
} 
@Override 
public byte[] getRow(int y, byte[] row) { 
// 这里要得到指定行的像素数据 
System.arraycopy(bitmapPixels, y * getWidth(), row, 0, getWidth()); 
return row; 
} 
} 

相机识别二维码调用了CaptureActivity这个类 


public class CaptureActivity extends Activity implements Callback { 
private CaptureActivityHandler handler; 
private ViewfinderView viewfinderView; 
private boolean hasSurface; 
private Vector<BarcodeFormat> decodeFormats; 
private String characterSet; 
private InactivityTimer inactivityTimer; 
private MediaPlayer mediaPlayer; 
private boolean playBeep; 
private static final float BEEP_VOLUME = 0.10f; 
private boolean vibrate; 
private Button cancelScanButton; 
 
@Override 
public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.camera); 
CameraManager.init(getApplication()); 
viewfinderView = (ViewfinderView) findViewById(R.id.viewfinder_view); 
cancelScanButton = (Button) this.findViewById(R.id.btn_cancel_scan); 
hasSurface = false; 
inactivityTimer = new InactivityTimer(this); 
} 
@Override 
protected void onResume() { 
super.onResume(); 
SurfaceView surfaceView = (SurfaceView) findViewById(R.id.preview_view); 
SurfaceHolder surfaceHolder = surfaceView.getHolder(); 
if (hasSurface) { 
initCamera(surfaceHolder); 
} else { 
surfaceHolder.addCallback(this); 
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
} 
decodeFormats = null; 
characterSet = null; 
playBeep = true; 
AudioManager audiOService = (AudioManager) getSystemService(AUDIO_SERVICE); 
if (audioService.getRingerMode() != AudioManager.RINGER_MODE_NORMAL) { 
playBeep = false; 
} 
initBeepSound(); 
vibrate = true; 
//quit the scan view 
cancelScanButton.setOnClickListener(new OnClickListener() { 
@Override 
public void onClick(View v) { 
CaptureActivity.this.finish(); 
} 
}); 
} 
@Override 
protected void onPause() { 
super.onPause(); 
if (handler != null) { 
handler.quitSynchronously(); 
handler = null; 
} 
CameraManager.get().closeDriver(); 
} 
@Override 
protected void onDestroy() { 
inactivityTimer.shutdown(); 
super.onDestroy(); 
} 
 
public void handleDecode(Result result, Bitmap barcode) { 
inactivityTimer.onActivity(); 
playBeepSoundAndVibrate(); 
String resultString = result.getText(); 
//FIXME 
if (resultString.equals("")) { 
//扫描失败 
Toast.makeText(CaptureActivity.this, "Scan failed!", Toast.LENGTH_SHORT).show(); 
}else { 
// System.out.println("Result:"+resultString); 
Intent resultIntent = new Intent(); 
Bundle bundle = new Bundle(); 
bundle.putString("result", resultString); 
resultIntent.putExtras(bundle); 
this.setResult(RESULT_OK, resultIntent); 
} 
CaptureActivity.this.finish(); 
} 
private void initCamera(SurfaceHolder surfaceHolder) { 
try { 
CameraManager.get().openDriver(surfaceHolder); 
} catch (IOException ioe) { 
return; 
} catch (RuntimeException e) { 
return; 
} 
if (handler == null) { 
handler = new CaptureActivityHandler(this, decodeFormats, 
characterSet); 
} 
} 
@Override 
public void surfaceChanged(SurfaceHolder holder, int format, int width, 
int height) { 
} 
@Override 
public void surfaceCreated(SurfaceHolder holder) { 
if (!hasSurface) { 
hasSurface = true; 
initCamera(holder); 
} 
} 
@Override 
public void surfaceDestroyed(SurfaceHolder holder) { 
hasSurface = false; 
} 
public ViewfinderView getViewfinderView() { 
return viewfinderView; 
}  
public Handler getHandler() { 
return handler; 
}  
public void drawViewfinder() { 
viewfinderView.drawViewfinder(); 
} 
private void initBeepSound() { 
if (playBeep && mediaPlayer == null) { 
// The volume on STREAM_SYSTEM is not adjustable, and users found it 
// too loud, 
// so we now play on the music stream. 
setVolumeControlStream(AudioManager.STREAM_MUSIC); 
mediaPlayer = new MediaPlayer(); 
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
mediaPlayer.setOnCompletionListener(beepListener); 
AssetFileDescriptor file = getResources().openRawResourceFd( 
R.raw.beep); 
try { 
mediaPlayer.setDataSource(file.getFileDescriptor(), 
file.getStartOffset(), file.getLength()); 
file.close(); 
mediaPlayer.setVolume(BEEP_VOLUME, BEEP_VOLUME); 
mediaPlayer.prepare(); 
} catch (IOException e) { 
mediaPlayer = null; 
} 
} 
} 
private static final long VIBRATE_DURATION = 200L;  
private void playBeepSoundAndVibrate() { 
if (playBeep && mediaPlayer != null) { 
mediaPlayer.start(); 
} 
if (vibrate) { 
Vibrator vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE); 
vibrator.vibrate(VIBRATE_DURATION); 
} 
} 
 
private final OnCompletionListener beepListener = new OnCompletionListener() { 
public void onCompletion(MediaPlayer mediaPlayer) { 
mediaPlayer.seekTo(0); 
} 
}; 
} 

下面是主布局mian文件


<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:Android="Http://schemas.android.com/apk/res/android" 
 android:layout_width="fill_parent" 
 android:layout_height="fill_parent" 
 android:background="@android:color/white" 
 android:orientation="vertical" > 
 <Button 
  android:id="@+id/btn_scan_barcode" 
  android:layout_width="fill_parent" 
  android:layout_height="wrap_content" 
  android:layout_marginTop="30dp" 
  android:text="Open camera" /> 
 <LinearLayout 
  android:orientation="horizontal" 
  android:layout_marginTop="10dp" 
  android:layout_width="fill_parent" 
  android:layout_height="wrap_content"> 
  <TextView 
  android:layout_width="wrap_content" 
  android:layout_height="wrap_content" 
  android:textColor="@android:color/black" 
  android:textSize="18sp" 
  android:text="Scan result:" /> 
  <TextView 
  android:id="@+id/tv_scan_result" 
  android:layout_width="fill_parent" 
  android:textSize="18sp" 
  android:textColor="@android:color/black" 
  android:layout_height="wrap_content" /> 
 </LinearLayout> 
 <EditText 
  android:id="@+id/et_qr_string" 
  android:layout_width="fill_parent" 
  android:layout_height="wrap_content" 
  android:layout_marginTop="30dp" 
  android:hint="Input the text"/> 
 <Button 
  android:id="@+id/btn_add_qrcode" 
  android:layout_width="fill_parent" 
  android:layout_height="wrap_content" 
  android:text="Generate QRcode" /> 
 <ImageView 
  android:id="@+id/iv_qr_image" 
  android:layout_width="250dp" 
  android:layout_height="250dp" 
  android:scaleType="fitXY" 
  android:layout_marginTop="10dp" 
  android:layout_gravity="center"/> 
</LinearLayout>

 详细了解的请下载demo自己看,Demo中解决了在竖拍解码时二维码被拉伸的现象。
不过我遇到了一个问题是 二维码的扫描框调大后,扫描的灵敏度降低了,希望知道的朋友给指导下
有兴趣的可以下载Demo看一看:google Zxing实现二维码的生成

您可能感兴趣的文章:Android上使用ZXing识别条形码与二维码的方法Android开发框架之自定义ZXing二维码扫描界面并解决取景框拉伸问题Java中基于Maven实现zxing二维码功能Android项目实战(二十八):使用Zxing实现二维码及优化实例Android基于google Zxing实现各类二维码扫描效果java中ZXing 生成、解析二维码图片的小示例Android中使用ZXing生成二维码(支持添加Logo图案)Android基于zxing的二维码(网格)扫描 仿支付宝网格扫描Java利用Zxing生成二维码的简单实例Android zxing如何识别反转二维码详解


--结束END--

本文标题: Android基于google Zxing实现二维码的生成

本文链接: https://www.lsjlt.com/news/24917.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 基于google zxing的Java二维码生成与解码
     本文实例为大家分享了Java二维码生成与解码的具体代码,供大家参考,具体内容如下一、添加Maven依赖(解码时需要上传二维码图片,所以需要依赖文件上传包)<!-- google二维码工具 --><depende...
    99+
    2023-05-31
    google zxing java
  • Android中google Zxing实现二维码与条形码扫描
    Android中google Zxing实现二维码与条形码扫描了解二维码这个东西还是从微信中,当时微信推出二维码扫描功能,自己感觉挺新颖的,从一张图片中扫一下竟然能直接加好友,不可思议啊,那时候还不了解二维码,呵呵,然后做项目的时候,老板说...
    99+
    2023-05-31
    android zxing 二维码
  • Android利用zxing生成二维码的详细过程
    本篇内容介绍了“Android利用zxing生成二维码的详细过程”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!目录二维码生成原理(即工作原理...
    99+
    2023-06-20
  • Android利用zxing生成二维码的过程记录
    目录二维码生成原理(即工作原理)效果图如下:前提:源码如下:总结二维码生成原理(即工作原理) 二维码官方叫版本Version。Version 1是21 x 21的矩阵,Versio...
    99+
    2024-04-02
  • QR-Code二维码如何利用zxing库实现生成
    QR-Code二维码如何利用zxing库实现生成?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。详解使用zxing库生成QR-Code二维码首先是引入zxing库,我是使用mav...
    99+
    2023-05-31
    zxing库 qr-code 二维码
  • Android中二维码的扫描和生成(使用zxing库)
    目录一.zxing是什么?二.集成zxing框架三.界面设计四.二维码生成五.二维码扫描附:Android使用Zxing识别图片多个二维码总结一.zxing是什么? zxing是go...
    99+
    2024-04-02
  • Android studio 实现生成二维码和扫描二维码
    效果图 build.gradle(:app)添加依赖 dependencies { implementation 'com.google.zxing:core:3.3.3' imple...
    99+
    2023-09-30
    android studio android ide
  • 基于SpringBoot生成二维码的几种实现方式
    目录一、基于Google开发工具包ZXing生成二维码二、基于开源的Hutool工具生成二维码本文将基于Spring Boot介绍两种生成二维码的实现方式,一种是基于Google开发...
    99+
    2024-04-02
  • 基于Python实现在线二维码生成工具
    目录1.环境搭建2.二维码生成功能的封装3.网页应用的搭建在今天的教程中,费老师我将为大家展示如何通过纯Python编程的方式,开发出一个网页应用,从而帮助用户直接通过浏览器访问,即...
    99+
    2024-04-02
  • 基于JS怎么实现二维码名片生成
    这篇文章主要介绍“基于JS怎么实现二维码名片生成”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“基于JS怎么实现二维码名片生成”文章能帮助大家解决问题。演示技术栈这里用到了一个二维码生成库qrcode...
    99+
    2023-07-02
  • 如何基于SpringBoot生成二维码
    这篇文章给大家分享的是有关如何基于SpringBoot生成二维码的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、基于Google开发工具包ZXing生成二维码(1)首先,需要在pom.xml依赖配置文件中加入该...
    99+
    2023-06-29
  • 基于JS实现二维码名片生成的示例代码
    目录演示技术栈源码cssjs演示 技术栈 这里用到了一个二维码生成库qrcode.js下面是简单介绍: //初始化QRCode对象 var qrcode = new QRCode...
    99+
    2024-04-02
  • Java使用Zxing二维码生成的简单示例
    目录1、二维码简介2、ZXing简介3、示例3.1 搭建一个maven项目,引入Zxing依赖包3.2 创建QrCodeUtil.java 类总结1、二维码简介 二维条形码是用某种特...
    99+
    2023-01-17
    Java二维码生成 java代码生成二维码 java zxing二维码生成
  • Android基于OpenCV实现QR二维码检测
    目录QR二维码QR二维码格式QR二维码结构APIQRCodeDetector类结构检测QR二维码识别QR二维码检测并识别QR二维码操作结果源码QR二维码 QR码(英语:Quick...
    99+
    2024-04-02
  • 基于barcodescanner实现Android二维码扫描功能
    二维码扫描现在成为一种非常常见的APP基础功能,附录1是我曾经用过的二维码/条形码扫描开源项目,但是附录1的项目集成和二次定制比较繁琐和麻烦,因此可以发现不少人基于ZXing做了二次的开发,并贡献出这些项目,发到github上,其中barc...
    99+
    2023-05-30
    android 二维码 barcodescanner
  • QRCode.js如何基于JQuery生成二维码JS库
    这篇文章主要介绍了QRCode.js如何基于JQuery生成二维码JS库,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1. QRCode.j...
    99+
    2024-04-02
  • Android利用zxing快速集成二维码扫描的实例教程
    前言大家应该都还记得,以前的我们常见的都是条形扫码,自从微信使用二维码扫描后,现在市场上基本都用二维码扫描,基本上每一个项目都会有一个二维码扫描,这篇就简单快速的实现一个扫描效果,让我们对二维码的扫描有一个初步的认识和让我们的项目可以快速的...
    99+
    2023-05-30
    android zxing 集成二维码
  • 基于Python编写一个二维码生成器
    目录前言1、安装第三方库2、QRCode参数解释3、自定义二维码生成器4、给二维码加图片5、全部代码前言 二维码又称二维条码,常见的二维码为QR Code,QR全称Quick Res...
    99+
    2024-04-02
  • 二维码生成Java实现代码
    本文实例为大家分享了二维码生成Java实现代码,供大家参考,具体内容如下package com.yihaomen.barcode;import java.awt.BasicStroke;import java.awt.Graphics;im...
    99+
    2023-05-31
    java 二维码 ava
  • 基于PyQT5制作一个二维码生成器
    个性化二维码的exe桌面应用的获取方式我放在文章最后面了,注意查收。通过执行打包后的exe应用程序可以直接运行生成个性化二维码。 开始之前先来看一下通过二维码生成器是如何生成个性化二...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作