studio plugin libreria generate code java android zxing qr-code

java - libreria - zxing plugin qr



Android usando ZXing generar código QR (4)

Estaba teniendo algún problema al intentar generar un código QR en la programación de Android. Aquí está el Tutorial que seguí. Cuando mi botón de generar haga clic, estoy llamando a este método:

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(); } }

Y luego, para las clases QRCodeEncoder y Contents, seguí el del tutorial. Sin embargo, cuando hago clic en Generar, aparece el mensaje de error como:

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)

He añadido el core.jar en la carpeta libs. ¿Algunas ideas? Gracias por adelantado.


Aquí es cómo puede generar una imagen con código QR desde una cadena -

Primero agregue la siguiente línea al archivo build.gradle en su proyecto de Android Studio :

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

O si aún usa Eclipse con ADT-plugin, agregue core.jar de ZXing desde el repositorio de Maven al subdirectorio libs de su proyecto de Eclipse ADT (aquí, en fullscreen ):

Y luego use el código de ejemplo de mi 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; }


El siguiente código funcionó para mí:

... 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); } }


La biblioteca ZXing puede proporcionar una manera fácil.

Origen es: Generar QRCode Ejemplo de Android

añadir en dependencias

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

Aquí está el método para convertir la cadena en la imagen 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; }

Guardar imagen de qr geneat

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 ""; }


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, WIDTH, 0, 0, w, h); } catch (Exception iae) { iae.printStackTrace(); return null; } return bitmap; }