Android
這里給出總結(jié)的一些基礎(chǔ)代碼和使用規(guī)則:
首先要一定要先去官網(wǎng)看看:
github-Zxing官方庫的地址
github-zxing-android-embedded 一個(gè)非常好用的android工具
1. 如何導(dǎo)入
如果是使用android studio, 那么在gradle文件里添加以下:
compile 'com.google.zxing:core:3.2.1'
或者
compile group: 'com.google.zxing', name: 'core', version: '3.2.1'
給大家一個(gè)網(wǎng)址 在這個(gè)里面可以搜索到可以用的Maven庫
導(dǎo)入 ZXing Android Embedded
repositories {
jcenter()
}
dependencies {
compile 'com.journeyapps:zxing-android-embedded:3.3.0'
compile 'com.android.support:appcompat-v7:23.1.0' // Version 23+ is required || 要求版本23以上
}
android {
buildToolsVersion '23.0.2' // Older versions may give compile errors || 更早的版本可能會報(bào)錯
}
如何生成一個(gè)二維碼?
以下這個(gè)方法蝴猪,傳入一個(gè)字符串若厚,生成一個(gè)二維碼的Bitmap,可以用于顯示
Bitmap encodeAsBitmap(String str){
Bitmap bitmap = null;
BitMatrix result = null;
MultiFormatWriter multiFormatWriter = new MultiFormatWriter();
try {
result = multiFormatWriter.encode(str, BarcodeFormat.QR_CODE, 200, 200);
// 使用 ZXing Android Embedded 要寫的代碼
BarcodeEncoder barcodeEncoder = new BarcodeEncoder();
bitmap = barcodeEncoder.createBitmap(result);
} catch (WriterException e){
e.printStackTrace();
} catch (IllegalArgumentException iae){ // ?
return null;
}
// 如果不使用 ZXing Android Embedded 的話贾惦,要寫的代碼
// 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,100,0,0,w,h);
return bitmap;
}
是不是使用ZXing Android Embedded的好處就很明顯了?之后的掃描和生成功能敦捧,就不分開討論了
如何掃描须板?
使用掃描的時(shí)候,是用到系統(tǒng)的服務(wù)的兢卵,是從當(dāng)前的 MainActivity 跳轉(zhuǎn)到 CustomScanActivity
掃描的樣式是完全 可以 自定義的
以下是相關(guān)代碼:
MainActivity中:
// 你也可以使用簡單的掃描功能习瑰,但是一般掃描的樣式和行為都是可以自定義的,這里就寫關(guān)于自定義的代碼了
// 你可以把這個(gè)方法作為一個(gè)點(diǎn)擊事件
public void customScan(){
new IntentIntegrator(this)
.setOrientationLocked(false)
.setCaptureActivity(CustomScanActivity.class) // 設(shè)置自定義的activity是CustomActivity
.initiateScan(); // 初始化掃描
}
@Override
// 通過 onActivityResult的方法獲取 掃描回來的 值
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
IntentResult intentResult = IntentIntegrator.parseActivityResult(requestCode,resultCode,data);
if(intentResult != null) {
if(intentResult.getContents() == null) {
Toast.makeText(this,"內(nèi)容為空",Toast.LENGTH_LONG).show();
} else {
Toast.makeText(this,"掃描成功",Toast.LENGTH_LONG).show();
// ScanResult 為 獲取到的字符串
String ScanResult = intentResult.getContents();
}
} else {
super.onActivityResult(requestCode,resultCode,data);
}
}
CustomScanActivity 添加了 打開閃光燈button秽荤,和兩個(gè)做樣子的button
對應(yīng)的 layout 文件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.zhaojun.zxingtest.CustomScanActivity">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="SwitchLight"
android:id="@+id/btn_switch"
android:layout_alignParentBottom="true"
android:layout_alignParentStart="true" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="hint_1"
android:id="@+id/btn_hint1"
android:layout_alignTop="@+id/btn_switch"
android:layout_centerHorizontal="true" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="hint_2"
android:id="@+id/btn_hint2"
android:layout_alignTop="@+id/btn_hint1"
android:layout_alignParentEnd="true" />
<!-- 我這里只是在大局下修改了一些樣式甜奄,不過其實(shí) 掃描框中的 各種激光條,邊框都可以改變窃款,有興趣的同學(xué)可以自己去搜一下 -->
<!-- 這個(gè)控件就是掃描的窗口了 -->
<com.journeyapps.barcodescanner.DecoratedBarcodeView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/dbv_custom"
app:zxing_framing_rect_width="200dp"
app:zxing_framing_rect_height="50dp"
app:zxing_preview_scaling_strategy="fitXY"
app:zxing_use_texture_view="true"
android:layout_above="@+id/btn_switch"
android:layout_alignEnd="@+id/btn_hint2">
</com.journeyapps.barcodescanner.DecoratedBarcodeView>
</RelativeLayout>
java文件 其中有使用 ButterKnife
public class CustomScanActivity extends AppCompatActivity implements DecoratedBarcodeView.TorchListener{ // 實(shí)現(xiàn)相關(guān)接口
// 添加一個(gè)按鈕用來控制閃光燈课兄,同時(shí)添加兩個(gè)按鈕表示其他功能,先用Toast表示
@BindView(R.id.btn_switch) Button swichLight;
@BindView(R.id.btn_hint1) Button hint1Show;
@BindView(R.id.btn_hint2) Button hint2Show;
@BindView(R.id.dbv_custom) DecoratedBarcodeView mDBV;
private CaptureManager captureManager;
private boolean isLightOn = false;
@Override
protected void onPause() {
super.onPause();
captureManager.onPause();
}
@Override
protected void onResume() {
super.onResume();
captureManager.onResume();
}
@Override
protected void onDestroy() {
super.onDestroy();
captureManager.onDestroy();
}
@Override
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
super.onSaveInstanceState(outState, outPersistentState);
captureManager.onSaveInstanceState(outState);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
return mDBV.onKeyDown(keyCode, event) || super.onKeyDown(keyCode, event);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_custom_scan);
ButterKnife.bind(this);
mDBV.setTorchListener(this);
// 如果沒有閃光燈功能晨继,就去掉相關(guān)按鈕
if(!hasFlash()) {
swichLight.setVisibility(View.GONE);
}
//重要代碼烟阐,初始化捕獲
captureManager = new CaptureManager(this,mDBV);
captureManager.initializeFromIntent(getIntent(),savedInstanceState);
captureManager.decode();
}
// torch 手電筒
@Override
public void onTorchOn() {
Toast.makeText(this,"torch on",Toast.LENGTH_LONG).show();
isLightOn = true;
}
@Override
public void onTorchOff() {
Toast.makeText(this,"torch off",Toast.LENGTH_LONG).show();
isLightOn = false;
}
// 判斷是否有閃光燈功能
private boolean hasFlash() {
return getApplicationContext().getPackageManager()
.hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);
}
// 點(diǎn)擊切換閃光燈
@OnClick(R.id.btn_switch)
public void swichLight(){
if(isLightOn){
mDBV.setTorchOff();
}else{
mDBV.setTorchOn();
}
}
}
核心代碼其實(shí)很少,比較容易掌握