Error when using QRGen library to generate QR code

2019-08-26 08:17发布

问题:

I am using the QRGen library to generate a ByteArrayOutputStream for a QR code and the generate a Bitmap image for it.

I have imported the 3 following jars into my project:

  • qrgen-1.0.jar
  • zxing-core-1.7.jar
  • zxing-j2se-1.7.jar

This is the method generating the QR code ByteArray:

public Bitmap qrBitmapFromString(String qrText){
    ByteArrayOutputStream out = QRCode.from(qrText).to(ImageType.PNG).withSize(300, 300).stream();
    byte[] data = out.toByteArray();
    Bitmap bmp = BitmapFactory.decodeByteArray (data,0,data.length, null);
    return bmp;
}

But I am getting the following error:

03-05 12:39:31.089: E/AndroidRuntime(1479): FATAL EXCEPTION: main
03-05 12:39:31.089: E/AndroidRuntime(1479): java.lang.NoClassDefFoundError: java.awt.image.BufferedImage
03-05 12:39:31.089: E/AndroidRuntime(1479):     at com.google.zxing.client.j2se.MatrixToImageWriter.toBufferedImage(MatrixToImageWriter.java:48)
03-05 12:39:31.089: E/AndroidRuntime(1479):     at com.google.zxing.client.j2se.MatrixToImageWriter.writeToStream(MatrixToImageWriter.java:75)
03-05 12:39:31.089: E/AndroidRuntime(1479):     at net.glxn.qrgen.QRCode.stream(QRCode.java:99)
03-05 12:39:31.089: E/AndroidRuntime(1479):     at co.emuze.emuzepay.PayCardFragment.qrBitmapFromString(PayCardFragment.java:27)
03-05 12:39:31.089: E/AndroidRuntime(1479):     at co.emuze.emuzepay.PayCardFragment.onCreateView(PayCardFragment.java:23)
03-05 12:39:31.089: E/AndroidRuntime(1479):     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:795)
03-05 12:39:31.089: E/AndroidRuntime(1479):     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:998)
03-05 12:39:31.089: E/AndroidRuntime(1479):     at android.app.BackStackRecord.run(BackStackRecord.java:622)
03-05 12:39:31.089: E/AndroidRuntime(1479):     at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1330)
03-05 12:39:31.089: E/AndroidRuntime(1479):     at android.app.Activity.performStart(Activity.java:4474)
03-05 12:39:31.089: E/AndroidRuntime(1479):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1928)
03-05 12:39:31.089: E/AndroidRuntime(1479):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1980)
03-05 12:39:31.089: E/AndroidRuntime(1479):     at android.app.ActivityThread.access$600(ActivityThread.java:122)
03-05 12:39:31.089: E/AndroidRuntime(1479):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1146)
03-05 12:39:31.089: E/AndroidRuntime(1479):     at android.os.Handler.dispatchMessage(Handler.java:99)
03-05 12:39:31.089: E/AndroidRuntime(1479):     at android.os.Looper.loop(Looper.java:137)
03-05 12:39:31.089: E/AndroidRuntime(1479):     at android.app.ActivityThread.main(ActivityThread.java:4340)
03-05 12:39:31.089: E/AndroidRuntime(1479):     at java.lang.reflect.Method.invokeNative(Native Method)
03-05 12:39:31.089: E/AndroidRuntime(1479):     at java.lang.reflect.Method.invoke(Method.java:511)
03-05 12:39:31.089: E/AndroidRuntime(1479):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
03-05 12:39:31.089: E/AndroidRuntime(1479):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
03-05 12:39:31.089: E/AndroidRuntime(1479):     at dalvik.system.NativeStart.main(Native Method)

What can cause that?

回答1:

The stack trace answers your question. java.awt classes don't exist in Android. You can't use libraries that use AWT. You can't use QRGen, or at least not this part of it.



回答2:

2.0-SNAPSHOT should solve this https://oss.sonatype.org/content/repositories/snapshots/net/glxn/qrgen/android/2.0-SNAPSHOT/

https://github.com/kenglxn/QRGen



回答3:

2.0-SNAPSHOT works very well on android and has become faster during the last week. An example can be found here: https://github.com/atomfrede/qrgen-android-example