Android:使用ZXing生成二维码(支持添加Logo图案)
生活随笔
收集整理的這篇文章主要介紹了
Android:使用ZXing生成二维码(支持添加Logo图案)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
ZXing是谷歌的一個(gè)開(kāi)源庫(kù),可以用來(lái)生成二維碼、掃描二維碼。本文所介紹的是第一部分。
首先上效果圖:
ZXing相關(guān)各種文件官方下載地址:https://github.com/zxing/zxing/releases?
或者在這里下載(只有本項(xiàng)目所用的jar包,版本號(hào):3.2.0):鏈接: http://pan.baidu.com/s/1hq3s5EW 密碼: mvg7
1.生成二維碼的工具類(lèi)
/*** 二維碼生成工具類(lèi)*/ public class QRCodeUtil {/*** 生成二維碼Bitmap** @param content 內(nèi)容* @param widthPix 圖片寬度* @param heightPix 圖片高度* @param logoBm 二維碼中心的Logo圖標(biāo)(可以為null)* @param filePath 用于存儲(chǔ)二維碼圖片的文件路徑* @return 生成二維碼及保存文件是否成功*/public static boolean createQRImage(String content, int widthPix, int heightPix, Bitmap logoBm, String filePath) {try {if (content == null || "".equals(content)) {return false;}//配置參數(shù)Map<EncodeHintType, Object> hints = new HashMap<>();hints.put(EncodeHintType.CHARACTER_SET, "utf-8");//容錯(cuò)級(jí)別hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);//設(shè)置空白邊距的寬度 // hints.put(EncodeHintType.MARGIN, 2); //default is 4// 圖像數(shù)據(jù)轉(zhuǎn)換,使用了矩陣轉(zhuǎn)換BitMatrix bitMatrix = new QRCodeWriter().encode(content, BarcodeFormat.QR_CODE, widthPix, heightPix, hints);int[] pixels = new int[widthPix * heightPix];// 下面這里按照二維碼的算法,逐個(gè)生成二維碼的圖片,// 兩個(gè)for循環(huán)是圖片橫列掃描的結(jié)果for (int y = 0; y < heightPix; y++) {for (int x = 0; x < widthPix; x++) {if (bitMatrix.get(x, y)) {pixels[y * widthPix + x] = 0xff000000;} else {pixels[y * widthPix + x] = 0xffffffff;}}}// 生成二維碼圖片的格式,使用ARGB_8888Bitmap bitmap = Bitmap.createBitmap(widthPix, heightPix, Bitmap.Config.ARGB_8888);bitmap.setPixels(pixels, 0, widthPix, 0, 0, widthPix, heightPix);if (logoBm != null) {bitmap = addLogo(bitmap, logoBm);}//必須使用compress方法將bitmap保存到文件中再進(jìn)行讀取。直接返回的bitmap是沒(méi)有任何壓縮的,內(nèi)存消耗巨大!return bitmap != null && bitmap.compress(Bitmap.CompressFormat.JPEG, 100, new FileOutputStream(filePath));} catch (WriterException | IOException e) {e.printStackTrace();}return false;}/*** 在二維碼中間添加Logo圖案*/private static Bitmap addLogo(Bitmap src, Bitmap logo) {if (src == null) {return null;}if (logo == null) {return src;}//獲取圖片的寬高int srcWidth = src.getWidth();int srcHeight = src.getHeight();int logoWidth = logo.getWidth();int logoHeight = logo.getHeight();if (srcWidth == 0 || srcHeight == 0) {return null;}if (logoWidth == 0 || logoHeight == 0) {return src;}//logo大小為二維碼整體大小的1/5float scaleFactor = srcWidth * 1.0f / 5 / logoWidth;Bitmap bitmap = Bitmap.createBitmap(srcWidth, srcHeight, Bitmap.Config.ARGB_8888);try {Canvas canvas = new Canvas(bitmap);canvas.drawBitmap(src, 0, 0, null);canvas.scale(scaleFactor, scaleFactor, srcWidth / 2, srcHeight / 2);canvas.drawBitmap(logo, (srcWidth - logoWidth) / 2, (srcHeight - logoHeight) / 2, null);canvas.save(Canvas.ALL_SAVE_FLAG);canvas.restore();} catch (Exception e) {bitmap = null;e.getStackTrace();}return bitmap;}}2.在Activity中的使用: /*** 二維碼生成*/ public class MainActivity extends ActionBarActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//內(nèi)容final EditText contentET = (EditText) findViewById(R.id.create_qr_content);//顯示二維碼圖片final ImageView imageView = (ImageView) findViewById(R.id.create_qr_iv);//是否添加Logofinal CheckBox addLogoCB = (CheckBox) findViewById(R.id.create_qr_addLogo);Button createQrBtn = (Button) findViewById(R.id.create_qr_btn);createQrBtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {final String filePath = getFileRoot(MainActivity.this) + File.separator+ "qr_" + System.currentTimeMillis() + ".jpg";//二維碼圖片較大時(shí),生成圖片、保存文件的時(shí)間可能較長(zhǎng),因此放在新線(xiàn)程中new Thread(new Runnable() {@Overridepublic void run() {boolean success = QRCodeUtil.createQRImage(contentET.getText().toString().trim(), 800, 800,addLogoCB.isChecked() ? BitmapFactory.decodeResource(getResources(), R.mipmap.qr_logo) : null,filePath);if (success) {runOnUiThread(new Runnable() {@Overridepublic void run() {imageView.setImageBitmap(BitmapFactory.decodeFile(filePath));}});}}}).start();}});}//文件存儲(chǔ)根目錄private String getFileRoot(Context context) {if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {File external = context.getExternalFilesDir(null);if (external != null) {return external.getAbsolutePath();}}return context.getFilesDir().getAbsolutePath();} }3.本項(xiàng)目中圖片文件保存在
context.getExternalFilesDir(null)目錄之下的。按照官方的api文檔,從KitKat開(kāi)始(Android 4.4),保存文件到這個(gè)目錄下將不需要SD卡讀寫(xiě)權(quán)限。但是經(jīng)過(guò)測(cè)驗(yàn)表明,在紅米Note和魅族MX3上(系統(tǒng)均為android 4.4.4),的確不需要權(quán)限;但是在本人的華為P6上(Android 4.4.2),必須聲明權(quán)限才能成功的保存文件,即必須在manifest中添加如下內(nèi)容: <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />因此,個(gè)人猜測(cè),所謂的不需要權(quán)限是從 Android 4.4.4開(kāi)始的。
總結(jié)
以上是生活随笔為你收集整理的Android:使用ZXing生成二维码(支持添加Logo图案)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【PPT模板】图片轮播(含资源下载和制作
- 下一篇: 女生相亲了个年薪50万的程序员,看到对方