build.gradle
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "24.0.0"
defaultConfig {
applicationId "com.itant.zxingtest"
minSdkVersion 15
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.4.0'
/*自定义*/
/*compile 'com.google.zxing:core:3.2.1'*/
/*快速集成*/
compile 'me.dm7.barcodescanner:zxing:1.9'
}
权限配置:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.itant.zxingtest">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.CAMERA" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".ScanActivity"/>
</application>
</manifest>
MainActivity.java
package com.itant.zxingtest;
import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.os.Environment;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;
import com.google.zxing.WriterException;
public class MainActivity extends AppCompatActivity {
private String directoryString;
private Bitmap bitmap;
private static String[] REQUIRED_PERMISSIONS = {
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.CAMERA
};
/**
* 初始化权限
*/
private void initPermission() {
int permission = ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
if (permission != PackageManager.PERMISSION_GRANTED) {
// We don't have permission so prompt the user
ActivityCompat.requestPermissions(
this,
REQUIRED_PERMISSIONS,
1
);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == 1) {
int grantResult = grantResults[0];
boolean granted = grantResult == PackageManager.PERMISSION_GRANTED;
if (!granted) {
Toast.makeText(this, "您拒绝了程序运行所需的最基本权限", Toast.LENGTH_SHORT).show();
System.exit(0);
}
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
directoryString = Environment.getExternalStorageDirectory().getPath() + "/erweima/";
initPermission();
ImageView imageView = (ImageView) findViewById(R.id.imageView);
try {
bitmap = BitmapTool.getQrCodeImage(UITool.dipToPx(this, 125), UITool.dipToPx(this, 125), "www.baidu.com");
imageView.setImageBitmap(bitmap);
} catch (WriterException e) {
e.printStackTrace();
}
imageView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
if (bitmap != null) {
FileTool.saveBitmap(bitmap, directoryString, "erweima");
Toast.makeText(MainActivity.this, "二维码保存成功", Toast.LENGTH_SHORT).show();
}
return false;
}
});
Button btn_scan = (Button) findViewById(R.id.btn_scan);
btn_scan.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, ScanActivity.class);
MainActivity.this.startActivity(intent);
}
});
}
}
BitmapTool.java
package com.itant.zxingtest;
import android.graphics.Bitmap;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import java.util.Hashtable;
/**
* Created by 詹子聪 on 2016/11/29.
*/
public class BitmapTool {
// 生成QR图
public static Bitmap getQrCodeImage(int QR_WIDTH, int QR_HEIGHT, String text) throws WriterException {
try {
// 需要引入core包
QRCodeWriter writer = new QRCodeWriter();
if (text == null || "".equals(text) || text.length() < 1) {
return null;
}
Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
hints.put(EncodeHintType.MARGIN, 0);
BitMatrix bitMatrix = new QRCodeWriter().encode(text, BarcodeFormat.QR_CODE, QR_WIDTH, QR_HEIGHT, hints);
int[] pixels = new int[QR_WIDTH * QR_HEIGHT];
for (int y = 0; y < QR_HEIGHT; y++) {
for (int x = 0; x < QR_WIDTH; x++) {
if (bitMatrix.get(x, y)) {
pixels[y * QR_WIDTH + x] = 0xff000000;
} else {
pixels[y * QR_WIDTH + x] = 0xffffffff;// 解决保存之后一片黑的bug
}
}
}
Bitmap bitmap = Bitmap.createBitmap(QR_WIDTH, QR_HEIGHT,
Bitmap.Config.ARGB_8888);
bitmap.setPixels(pixels, 0, QR_WIDTH, 0, 0, QR_WIDTH, QR_HEIGHT);
return bitmap;
} catch (WriterException e) {
e.printStackTrace();
return null;
}
}
}
FileTool.java
package com.itant.zxingtest;
import android.graphics.Bitmap;
import android.os.Environment;
import java.io.File;
import java.io.FileOutputStream;
/**
* Created by 詹子聪 on 2016/11/29.
*/
public class FileTool {
/**
* 保存bitmap为文件
*
* @param bitmap
* @param directoryString 目录名称
* @param fileName 文件名(不包括后缀名)
* @return
*/
public static File saveBitmap(Bitmap bitmap, String directoryString, String fileName) {
File directory = new File(directoryString);
if (!directory.exists()) {
boolean createSuc = false;
createSuc = directory.mkdirs();
if (!createSuc) {
return null;
}
}
File file = new File(directoryString + fileName + ".png");
if (file.exists()) {
boolean delSuc = file.delete();
if (!delSuc) {
return null;
}
}
try {
file.createNewFile();
FileOutputStream out = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.PNG, 90, out);
out.flush();
out.close();
} catch (Exception e) { // TODO Auto-generated catch block
e.printStackTrace();
}
return file;
}
}
UITool.java
package com.itant.zxingtest;
import android.content.Context;
/**
* Created by 詹子聪 on 2016/11/29.
*/
public class UITool {
/**
* @Description 根据手机的分辨率从 dip 的单位 转成为 px(像素)
* @param context
* 环境
* @param dipValue
* 需要转化的dip值
* @return int 转化后的px值
*/
public static int dipToPx(Context context, float dipValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dipValue * scale + 0.5f);
}
}
ScanActivity.java
package com.itant.zxingtest;
import android.app.Activity;
import android.app.AlertDialog;
import android.os.Bundle;
import android.os.PersistableBundle;
import android.util.Log;
import com.google.zxing.Result;
import me.dm7.barcodescanner.zxing.ZXingScannerView;
/**
* Created by 詹子聪 on 2016/11/30.
*/
public class ScanActivity extends Activity implements ZXingScannerView.ResultHandler{
private ZXingScannerView mScannerView;
@Override
public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState) {
super.onCreate(savedInstanceState, persistentState);
//setContentView(R.layout.activity_scan);
}
@Override
protected void onResume() {
super.onResume();
mScannerView = new ZXingScannerView(ScanActivity.this); // Programmatically initialize the scanner view
setContentView(mScannerView);
mScannerView.setResultHandler(ScanActivity.this); // Register ourselves as a handler for scan results.
mScannerView.startCamera(); // Start camera
}
@Override
protected void onPause() {
super.onPause();
if (mScannerView != null && mScannerView.isActivated()) {
mScannerView.stopCamera();
}
}
@Override
public void handleResult(Result rawResult) {
// Do something with the result here
Log.e("handler", rawResult.getText()); // Prints scan results
Log.e("handler", rawResult.getBarcodeFormat().toString()); // Prints the scan format (qrcode)
// show the scanner result into dialog box.
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Scan Result");
builder.setMessage(rawResult.getText());
AlertDialog alert1 = builder.create();
alert1.show();
// If you would like to resume scanning, call this method below:
// mScannerView.resumeCameraPreview(this);
}
}