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 '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) {
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 {
public static Bitmap getQrCodeImage (int QR_WIDTH, int QR_HEIGHT, String text) throws WriterException {
try {
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 ;
}
}
}
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) {
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.5 f);
}
}
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);
}
@Override
protected void onResume () {
super .onResume();
mScannerView = new ZXingScannerView(ScanActivity.this );
setContentView(mScannerView);
mScannerView.setResultHandler(ScanActivity.this );
mScannerView.startCamera();
}
@Override
protected void onPause () {
super .onPause();
if (mScannerView != null && mScannerView.isActivated()) {
mScannerView.stopCamera();
}
}
@Override
public void handleResult (Result rawResult) {
Log.e("handler" , rawResult.getText());
Log.e("handler" , rawResult.getBarcodeFormat().toString());
AlertDialog.Builder builder = new AlertDialog.Builder(this );
builder.setTitle("Scan Result" );
builder.setMessage(rawResult.getText());
AlertDialog alert1 = builder.create();
alert1.show();
}
}