QRコードをAndroidプログラミングで生成しようとすると問題が発生しました。ここに チュートリアル があります。クリックして生成ボタンを作成すると、このメソッドを呼び出します:
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クラスについては、チュートリアルの1つに従いました。ただし、生成をクリックすると、次のようなエラーメッセージが表示されます。
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を追加しました。何か案は?前もって感謝します。
文字列からQRコードを使用して画像を生成する方法を次に示します-
まず、Android Studioプロジェクトのbuild.gradleファイルに次の行を追加します。
dependencies {
....
compile 'com.google.zxing:core:3.2.1'
}
または、EclipseとADT-pluginをまだ使用している場合、ZXingのcore.jarを Mavenリポジトリ tolibssubdir on your Eclipse ADT project(here fullscreen ):
そして、私の 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, WIDTH, 0, 0, w, h);
} catch (Exception iae) {
iae.printStackTrace();
return null;
}
return bitmap;
}
ZXingライブラリは簡単な方法を提供できます。
Originは: QRCodeの生成Android例
依存関係を追加する
compile 'com.google.zxing:core:3.2.1'
文字列を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);
}
}