Android使用ZXing生成QR码

我在尝试在Android编程中生成QR码时遇到了一些问题。 这是我遵循的教程 。 当我点击生成button时,我正在调用这个方法:

private void generateQR(){ String qrInputText = "test"; //Find screen size WindowManager manager = (WindowManager) getSystemService(WINDOW_SERVICE); Display display = manager.getDefaultDisplay(); Point point = new Point(); display.getSize(point); int width = point.x; int height = point.y; int smallerDimension = width < height ? width : height; smallerDimension = smallerDimension * 3/4; //Encode with a QR Code image QRCodeEncoder qrCodeEncoder = new QRCodeEncoder( qrInputText, null, Contents.Type.TEXT, BarcodeFormat.QR_CODE.toString(), smallerDimension ); try { Bitmap bitmap = qrCodeEncoder.encodeAsBitmap(); ImageView myImage = (ImageView) findViewById(R.id.ivImage); myImage.setImageBitmap(bitmap); } catch (WriterException e) { e.printStackTrace(); } } 

然后对于QRCodeEncoder和Contents类,我跟着教程中的那个。 但是,当我点击生成,我得到的错误信息为:

 01-30 16:37:03.093: I/dalvikvm(1069): Could not find method com.google.zxing.BarcodeFormat.valueOf, referenced from method com.example.qrcodescan.QRCodeEncoder.encodeContents 01-30 16:37:03.093: W/dalvikvm(1069): VFY: unable to resolve static method 338: Lcom/google/zxing/BarcodeFormat;.valueOf (Ljava/lang/String;)Lcom/google/zxing/BarcodeFormat; 01-30 16:37:03.093: D/dalvikvm(1069): VFY: replacing opcode 0x71 at 0x0005 01-30 16:37:03.093: W/dalvikvm(1069): VFY: unable to resolve static field 287 (QR_CODE) in Lcom/google/zxing/BarcodeFormat; 01-30 16:37:03.093: D/dalvikvm(1069): VFY: replacing opcode 0x62 at 0x0011 01-30 16:37:03.093: W/dalvikvm(1069): VFY: unable to resolve static field 287 (QR_CODE) in Lcom/google/zxing/BarcodeFormat; 01-30 16:37:03.093: D/dalvikvm(1069): VFY: replacing opcode 0x62 at 0x0015 01-30 16:37:03.093: W/dalvikvm(1069): VFY: unable to resolve static field 294 (CHARACTER_SET) in Lcom/google/zxing/EncodeHintType; 01-30 16:37:03.093: D/dalvikvm(1069): VFY: replacing opcode 0x62 at 0x0018 01-30 16:37:03.093: E/dalvikvm(1069): Could not find class 'com.google.zxing.MultiFormatWriter', referenced from method com.example.qrcodescan.QRCodeEncoder.encodeAsBitmap 01-30 16:37:03.093: W/dalvikvm(1069): VFY: unable to resolve new-instance 150 (Lcom/google/zxing/MultiFormatWriter;) in Lcom/example/qrcodescan/QRCodeEncoder; 01-30 16:37:03.093: D/dalvikvm(1069): VFY: replacing opcode 0x22 at 0x001d 01-30 16:37:03.093: D/dalvikvm(1069): DexOpt: unable to opt direct call 0x0159 at 0x1f in Lcom/example/qrcodescan/QRCodeEncoder;.encodeAsBitmap 01-30 16:37:03.093: D/AndroidRuntime(1069): Shutting down VM 01-30 16:37:03.093: W/dalvikvm(1069): threadid=1: thread exiting with uncaught exception (group=0x40c341f8) 01-30 16:37:03.101: E/AndroidRuntime(1069): FATAL EXCEPTION: main 01-30 16:37:03.101: E/AndroidRuntime(1069): java.lang.NoClassDefFoundError: com.google.zxing.BarcodeFormat 01-30 16:37:03.101: E/AndroidRuntime(1069): at com.example.qrcodescan.MainActivity.generateQR(MainActivity.java:95) 01-30 16:37:03.101: E/AndroidRuntime(1069): at com.example.qrcodescan.MainActivity.access$0(MainActivity.java:77) 01-30 16:37:03.101: E/AndroidRuntime(1069): at com.example.qrcodescan.MainActivity$2.onClick(MainActivity.java:54) 01-30 16:37:03.101: E/AndroidRuntime(1069): at android.view.View.performClick(View.java:3620) 01-30 16:37:03.101: E/AndroidRuntime(1069): at android.view.View$PerformClick.run(View.java:14292) 01-30 16:37:03.101: E/AndroidRuntime(1069): at android.os.Handler.handleCallback(Handler.java:605) 01-30 16:37:03.101: E/AndroidRuntime(1069): at android.os.Handler.dispatchMessage(Handler.java:92) 01-30 16:37:03.101: E/AndroidRuntime(1069): at android.os.Looper.loop(Looper.java:137) 01-30 16:37:03.101: E/AndroidRuntime(1069): at android.app.ActivityThread.main(ActivityThread.java:4512) 01-30 16:37:03.101: E/AndroidRuntime(1069): at java.lang.reflect.Method.invokeNative(Native Method) 01-30 16:37:03.101: E/AndroidRuntime(1069): at java.lang.reflect.Method.invoke(Method.java:511) 01-30 16:37:03.101: E/AndroidRuntime(1069): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:982) 01-30 16:37:03.101: E/AndroidRuntime(1069): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:749) 01-30 16:37:03.101: E/AndroidRuntime(1069): at dalvik.system.NativeStart.main(Native Method) 

我确实在libs文件夹下添加了core.jar。 有任何想法吗? 提前致谢。

Solutions Collecting From Web of "Android使用ZXing生成QR码"

这里是如何使用QR码从string生成图像 –

截图

首先将以下行添加到Android Studio项目中的build.gradle文件中:

 dependencies { .... compile 'com.google.zxing:core:3.2.1' } 

或者如果在ADT插件中仍然使用Eclipse,请将Maven存储库中的ZXing core.jar添加到Eclipse ADT项目的libs子目录(此处为全屏 ):

蚀

然后使用我的MainActivity.java中的示例代码:

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ImageView imageView = (ImageView) findViewById(R.id.qrCode); try { Bitmap bitmap = encodeAsBitmap(STR); imageView.setImageBitmap(bitmap); } catch (WriterException e) { e.printStackTrace(); } } Bitmap encodeAsBitmap(String str) throws WriterException { BitMatrix result; try { result = new MultiFormatWriter().encode(str, BarcodeFormat.QR_CODE, WIDTH, WIDTH, null); } catch (IllegalArgumentException iae) { // Unsupported format return null; } int w = result.getWidth(); int h = result.getHeight(); int[] pixels = new int[w * h]; for (int y = 0; y < h; y++) { int offset = y * w; for (int x = 0; x < w; x++) { pixels[offset + x] = result.get(x, y) ? BLACK : WHITE; } } Bitmap bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); bitmap.setPixels(pixels, 0, width, 0, 0, w, h); return bitmap; } 
 public static int white = 0xFFFFFFFF; public static int black = 0xFF000000; public final static int WIDTH=500; try { Bitmap bmp = encodeAsBitmap("Life is a bitch"); imgView.setImageBitmap(bmp); } catch (Exception e) { e.printStackTrace(); } Bitmap encodeAsBitmap(String str) throws WriterException { BitMatrix result; Bitmap bitmap=null; try { result = new MultiFormatWriter().encode(str, BarcodeFormat.QR_CODE, WIDTH, WIDTH, null); int w = result.getWidth(); int h = result.getHeight(); int[] pixels = new int[w * h]; for (int y = 0; y < h; y++) { int offset = y * w; for (int x = 0; x < w; x++) { pixels[offset + x] = result.get(x, y) ? black:white; } } bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); bitmap.setPixels(pixels, 0, 500, 0, 0, w, h); } catch (Exception iae) { iae.printStackTrace(); return null; } return bitmap; } 

ZXing库可以提供简单的方法。

起源是: 生成QRCode Android示例

添加依赖关系

 compile 'com.google.zxing:core:3.2.1' 

这是将string转换为QR图像的方法

 private Bitmap TextToImageEncode(String Value) throws WriterException { BitMatrix bitMatrix; try { bitMatrix = new MultiFormatWriter().encode( Value, BarcodeFormat.DATA_MATRIX.QR_CODE, QRcodeWidth, QRcodeWidth, null ); } catch (IllegalArgumentException Illegalargumentexception) { return null; } int bitMatrixWidth = bitMatrix.getWidth(); int bitMatrixHeight = bitMatrix.getHeight(); int[] pixels = new int[bitMatrixWidth * bitMatrixHeight]; for (int y = 0; y < bitMatrixHeight; y++) { int offset = y * bitMatrixWidth; for (int x = 0; x < bitMatrixWidth; x++) { pixels[offset + x] = bitMatrix.get(x, y) ? getResources().getColor(R.color.black):getResources().getColor(R.color.white); } } Bitmap bitmap = Bitmap.createBitmap(bitMatrixWidth, bitMatrixHeight, Bitmap.Config.ARGB_4444); bitmap.setPixels(pixels, 0, 500, 0, 0, bitMatrixWidth, bitMatrixHeight); return bitmap; } 

保存生成的qr图像

  public String saveImage(Bitmap myBitmap) { ByteArrayOutputStream bytes = new ByteArrayOutputStream(); myBitmap.compress(Bitmap.CompressFormat.JPEG, 90, bytes); File wallpaperDirectory = new File( Environment.getExternalStorageDirectory() + IMAGE_DIRECTORY); // have the object build the directory structure, if needed. if (!wallpaperDirectory.exists()) { Log.d("dirrrrrr", "" + wallpaperDirectory.mkdirs()); wallpaperDirectory.mkdirs(); } try { File f = new File(wallpaperDirectory, Calendar.getInstance() .getTimeInMillis() + ".jpg"); f.createNewFile(); //give read write permission FileOutputStream fo = new FileOutputStream(f); fo.write(bytes.toByteArray()); MediaScannerConnection.scanFile(this, new String[]{f.getPath()}, new String[]{"image/jpeg"}, null); fo.close(); Log.d("TAG", "File Saved::--->" + f.getAbsolutePath()); return f.getAbsolutePath(); } catch (IOException e1) { e1.printStackTrace(); } return ""; } 

以下代码为我工作:

 ... String QRcode = "..."; new generateQrcode(qrcodeImageview).execute(QRcode); ... private class generateQrcode extends AsyncTask<String, Void, Bitmap> { public final static int WIDTH = 400; ImageView bmImage; public generateQrcode(ImageView bmImage) { this.bmImage = bmImage; } protected Bitmap doInBackground(String... urls) { String Value = urls[0]; com.google.zxing.Writer writer = new QRCodeWriter(); Bitmap bitmap = null; BitMatrix bitMatrix = null; try { bitMatrix = writer.encode(Value, com.google.zxing.BarcodeFormat.QR_CODE, WIDTH, WIDTH, ImmutableMap.of(EncodeHintType.MARGIN, 1)); bitmap = Bitmap.createBitmap(400, 400, Bitmap.Config.ARGB_8888); for (int i = 0; i < 400; i++) { for (int j = 0; j < 400; j++) { bitmap.setPixel(i, j, bitMatrix.get(i, j) ? Color.BLACK : Color.WHITE); } } } catch (WriterException e) { e.printStackTrace(); } return bitmap; } protected void onPostExecute(Bitmap result) { bmImage.setImageBitmap(result); } }