Google Mobile Vision
早期最常用的SDK有Zxing, 後來google開發了Google Mobile Vision將之取代 , 而且掃瞄速度更快.
下載SDK
https://github.com/avaneeshkumarmaurya/Barcode-Reader 按下clone or download, 解開後, 再由Android studio的File/New/import module, 選取解壓縮後的barcode-reader目錄
build.grandle
在build.grandle 加入如下設定
dependencies { // google vision gradle implementation 'com.google.android.gms:play-services-vision:15.0.2' implementation project(path: ':barcode-reader') }
Google範例
以下代碼是Google套件的範例, 只需在 MainActivity加入如下代碼即可測試
public class MainActivity extends AppCompatActivity { final int BARCODE_READER_ACTIVITY_REQUEST=1000; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Intent launchIntent = BarcodeReaderActivity.getLaunchIntent(this, true, false); startActivityForResult(launchIntent, BARCODE_READER_ACTIVITY_REQUEST); } protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode != Activity.RESULT_OK) { Toast.makeText(this, "error in scanning", Toast.LENGTH_SHORT).show(); return; } if (requestCode == BARCODE_READER_ACTIVITY_REQUEST && data != null) { Barcode barcode = data.getParcelableExtra(BarcodeReaderActivity.KEY_CAPTURED_BARCODE); Toast.makeText(this, barcode.rawValue, Toast.LENGTH_SHORT).show(); } } }
實際專案
此部份為小編實際專案, 圖示如下
修正import
下圖引入的library中, 會發生編譯錯誤, 原因在於此library使用舊版的sdk編譯, 所以把相關的import刪除, 再於錯誤處按下Alt+Enter, 重新import新版sdk即可

BarcodeReaderFragment修改
public void start(){
CameraSource localCameraSource = this.mCameraSource;
if (localCameraSource != null) {
try
{
this.mPreview.start(localCameraSource, this.mGraphicOverlay);
}
catch (IOException localIOException)
{
Log.e(TAG, "Unable to start camera source.", localIOException);
this.mCameraSource.release();
this.mCameraSource = null;
}
}
}
public void stop(){
CameraSourcePreview localCameraSourcePreview = this.mPreview;
if (localCameraSourcePreview != null) {
localCameraSourcePreview.stop();
}
}
ScanOverlay修改
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// draw transparent rect
int cornerRadius = 0;
Paint eraser = new Paint();
eraser.setAntiAlias(true);
eraser.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
RectF rect = new RectF(left, top, dpToPx(rectWidth) + left, dpToPx(rectHeight) + top);
canvas.drawRoundRect(rect, (float) cornerRadius, (float) cornerRadius, eraser);
// draw horizontal line
Paint line = new Paint();
if(runFlag) {
line.setColor(lineColor);
line.setStrokeWidth(Float.valueOf(lineWidth));
// draw the line to product animation
if (endY >= top + dpToPx(rectHeight) + frames) {
revAnimation = true;
} else if (endY == top + frames) {
revAnimation = false;
}
// check if the line has reached to bottom
if (revAnimation) {
endY -= frames;
} else {
endY += frames;
}
canvas.drawLine(left, endY, left + dpToPx(rectWidth), endY, line);
}
invalidate();
}
public void start()
{
this.runFlag = true;
}
public void stop()
{
this.runFlag = false;
}
