Android中生成条形码和二维码

准备目前Google的zxing jar包不支持中文码的生成,所以本示例中也不支持中文。需要中文支持的朋友,请自行修改zxing.jar包再编译下。 废话不说,直接上效果图:

Android二维码条形码生成

Android二维码条形码生成

 

具体示例代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
package com.test.createcode;
 
import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;
 
import com.google.zxing.BarcodeFormat;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
 
/**
  * 用于创建和扫描二维码
  */
public class CreateCodeActivity  extends Activity {
 
    
     /**
      * 将要生成二维码的内容
      */
     private EditText codeEdit;
 
     /**
      * 生成二维码代码
      */
     private Button twoCodeBtn;
     /**
      * 用于展示生成二维码的imageView
      */
     private ImageView codeImg;
    
     /**
      * 生成一维码按钮
      */
     private Button oneCodeBtn;
 
     /**
      * 界面的初始化事件
      *
      * @param savedInstanceState Bundle对象
      */
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super .onCreate(savedInstanceState);
         setContentView(R.layout.main);
         initView();
         setListener();
 
     }
 
     /**
      * 用于初始化界面展示的view
      */
     private void initView() {
         codeEdit = (EditText) findViewById(R.id.code_edittext);
         twoCodeBtn = (Button) findViewById(R.id.code_btn);
         oneCodeBtn = (Button) findViewById(R.id.btn_code);
         codeImg = (ImageView) findViewById(R.id.code_img);
     }
 
     /**
      * 设置生成二维码和扫描二维码的事件
      */
     private void setListener() {
         twoCodeBtn.setOnClickListener( new OnClickListener() {
 
             @Override
             public void onClick(View v) {
                 String str = codeEdit.getText().toString().trim();
                 Bitmap bmp =  null ;
                 try {
                     if (str !=  null && ! "" .equals(str)) {
                         bmp = CreateTwoDCode(str);
                     }
                 catch (WriterException e) {
                     e.printStackTrace();
                 }
                 if (bmp !=  null ) {
                     codeImg.setImageBitmap(bmp);
                 }
 
             }
         });
 
 
         oneCodeBtn.setOnClickListener( new OnClickListener() {
             @Override
             public void onClick(View view) {
                 String str = codeEdit.getText().toString().trim();
                 int size = str.length();
                 for ( int i =  0 ; i < size; i++) {
                     int c = str.charAt(i);
                     if (( 19968 <= c && c <  40623 )) {
                         Toast.makeText(CreateCodeActivity. this "生成条形码的时刻不能是中文" , Toast.LENGTH_SHORT).show();
                         return ;
                     }
 
                 }
                 Bitmap bmp =  null ;
                 try {
                     if (str !=  null && ! "" .equals(str)) {
                         bmp = CreateOneDCode(str);
                     }
                 catch (WriterException e) {
                     e.printStackTrace();
                 }
                 if (bmp !=  null ) {
                     codeImg.setImageBitmap(bmp);
                 }
             }
         });
     }
 
     /**
      * 将指定的内容生成成二维码
      *
      * @param content 将要生成二维码的内容
      * @return 返回生成好的二维码事件
      * @throws WriterException WriterException异常
      */
     public Bitmap CreateTwoDCode(String content)  throws WriterException {
         // 生成二维矩阵,编码时指定大小,不要生成了图片以后再进行缩放,这样会模糊导致识别失败
         BitMatrix matrix =  new MultiFormatWriter().encode(content,
                 BarcodeFormat.QR_CODE,  300 300 );
         int width = matrix.getWidth();
         int height = matrix.getHeight();
         // 二维矩阵转为一维像素数组,也就是一直横着排了
         int [] pixels =  new int [width * height];
         for ( int y =  0 ; y < height; y++) {
             for ( int x =  0 ; x < width; x++) {
                 if (matrix.get(x, y)) {
                     pixels[y * width + x] =  0xff000000 ;
                 }
             }
         }
 
         Bitmap bitmap = Bitmap.createBitmap(width, height,
                 Bitmap.Config.ARGB_8888);
         // 通过像素数组生成bitmap,具体参考api
         bitmap.setPixels(pixels,  0 , width,  0 0 , width, height);
         return bitmap;
     }
 
     /**
      * 用于将给定的内容生成成一维码 注:目前生成内容为中文的话将直接报错,要修改底层jar包的内容
      *
      * @param content 将要生成一维码的内容
      * @return 返回生成好的一维码bitmap
      * @throws WriterException WriterException异常
      */
     public Bitmap CreateOneDCode(String content)  throws WriterException {
         // 生成一维条码,编码时指定大小,不要生成了图片以后再进行缩放,这样会模糊导致识别失败
         BitMatrix matrix =  new MultiFormatWriter().encode(content,
                 BarcodeFormat.CODE_128,  500 200 );
         int width = matrix.getWidth();
         int height = matrix.getHeight();
         int [] pixels =  new int [width * height];
         for ( int y =  0 ; y < height; y++) {
             for ( int x =  0 ; x < width; x++) {
                 if (matrix.get(x, y)) {
                     pixels[y * width + x] =  0xff000000 ;
                 }
             }
         }
 
         Bitmap bitmap = Bitmap.createBitmap(width, height,
                 Bitmap.Config.ARGB_8888);
         // 通过像素数组生成bitmap,具体参考api
         bitmap.setPixels(pixels,  0 , width,  0 0 , width, height);
         return bitmap;
     }
 
}
main.xml文件如下:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<? xml version = "1.0" encoding = "utf-8" ?> 
< LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android" 
               android:orientation = "vertical" android:layout_width = "fill_parent" 
               android:layout_height = "fill_parent" android:background = "#ff999999"
     < EditText android:layout_width = "fill_parent" android:id = "@+id/code_edittext" 
               android:layout_height = "wrap_content" android:text = "" /> 
     < LinearLayout android:layout_width = "wrap_content" 
                   android:layout_height = "wrap_content" android:orientation = "horizontal" 
                   android:layout_marginTop = "20dip" android:layout_gravity = "center_horizontal"
         < Button android:id = "@+id/code_btn" android:layout_width = "100dip" 
                 android:layout_height = "40dip" android:text = "生成二维码" /> 
         < Button android:id = "@+id/btn_code" android:layout_width = "100dip" android:layout_height = "40dip" 
                 android:text = "生成一维码" ></ Button
     </ LinearLayout
       
   
     < ImageView android:layout_width = "wrap_content" android:id = "@+id/code_img" 
                android:layout_height = "wrap_content" android:layout_marginTop = "20dip" 
                android:layout_gravity = "center_horizontal" /> 
</ LinearLayout >
清单文件如下:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<? xml version = "1.0" encoding = "utf-8" ?> 
< manifest xmlns:android = "http://schemas.android.com/apk/res/android" 
     package = "com.test.createcode" 
     android:versionCode = "1" 
     android:versionName = "1.0"
   
     < uses-sdk android:minSdkVersion = "10" /> 
   
     < application 
         android:icon = "@drawable/ic_launcher" 
         android:label = "@string/app_name"
         < activity 
             android:name = ".CreateCodeActivity" 
             android:label = "@string/app_name"
             < intent-filter
                 < action android:name = "android.intent.action.MAIN" /> 
   
                 < category android:name = "android.intent.category.LAUNCHER" /> 
             </ intent-filter
         </ activity
     </ application
   
</ manifest >

最后不要下载个zxing.jar放在libs文件夹中,即可。(上述的BitMatrix及BarcodeFormat等类是依赖于zxing.jar的。)


下载地址:

http://code.google.com/p/zxing/

来自:http://blog.csdn.net/chenshufei2/article/details/8682934

不明白的朋友下载我的例子:

http://download.csdn.net/detail/zhaihaohao1/8387031

我的相关文章:

http://blog.csdn.net/zhaihaohao1/article/details/42920591



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值