カメラで撮影したバーコードをアプリケーションに認識させたい。 Android SDK?
次のようなもの: バーコードスキャナー
SDKには組み込まれていませんが、 Zxingライブラリ を使用できます。それは無料で、オープンソースで、Apacheライセンスです。
2016年の推奨事項では、 バーコードAPI を使用します。これもオフラインで機能します。
Google Play Services v7.8の 最新リリース を使用すると、新しいMobile Vision APIにアクセスできます。これはおそらく、現在バーコードスキャンを実装する最も便利な方法であり、 オフラインでも動作します です。
Barcode APIは、デバイス上であらゆる方向のリアルタイムでバーコードを検出します。また、複数のバーコードを一度に検出できます。
次のバーコード形式を読み取ります。
- 1Dバーコード:EAN-13、EAN-8、UPC-A、UPC-E、Code-39、Code-93、Code-128、ITF、Codabar
- 2Dバーコード:QRコード、データマトリックス、PDF-417、AZTEC
次のサポートされている形式のQRコード、データマトリックス、PDF-417、およびAztec値を自動的に解析します。
- URL
- 連絡先情報(VCARDなど)
- カレンダーイベント
- Eメール
- 電話
- SMS
- ISBN
- Wi-Fi
- ジオロケーション(緯度と経度)
- AAMVA運転免許証/ ID
サンプルコードを次に示します。私のアプリはZXingバーコードスキャナーを使用しています。
次の2つのクラスが必要です: IntentIntegrator および IntentResult
スキャナー(OnClickListener、OnMenuItemSelected ...など)、「PRODUCT_MODE」を呼び出します。標準の1Dバーコードをスキャンします(さらに追加できます)。
IntentIntegrator.initiateScan(this,
"Warning",
"ZXing Barcode Scanner is not installed, download?",
"Yes", "No",
"PRODUCT_MODE");
結果としてバーコードを取得:
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
switch (requestCode) {
case IntentIntegrator.REQUEST_CODE:
if (resultCode == Activity.RESULT_OK) {
IntentResult intentResult =
IntentIntegrator.parseActivityResult(requestCode, resultCode, intent);
if (intentResult != null) {
String contents = intentResult.getContents();
String format = intentResult.getFormatName();
this.elemQuery.setText(contents);
this.resume = false;
Log.d("SEARCH_EAN", "OK, EAN: " + contents + ", FORMAT: " + format);
} else {
Log.e("SEARCH_EAN", "IntentResult je NULL!");
}
} else if (resultCode == Activity.RESULT_CANCELED) {
Log.e("SEARCH_EAN", "CANCEL");
}
}
}
contentsはバーコード番号を保持します
カメラAPIを使用したサンプルコードを次に示します。
import Android.support.v7.app.AppCompatActivity;
import Android.os.Bundle;
import Android.util.Log;
import Android.util.SparseArray;
import Android.view.SurfaceHolder;
import Android.view.SurfaceView;
import Android.view.View;
import Android.widget.Button;
import Android.widget.TextView;
import Java.io.IOException;
import com.google.Android.gms.vision.CameraSource;
import com.google.Android.gms.vision.Detector;
import com.google.Android.gms.vision.Frame;
import com.google.Android.gms.vision.barcode.Barcode;
import com.google.Android.gms.vision.barcode.BarcodeDetector;
public class MainActivity extends AppCompatActivity {
TextView barcodeInfo;
SurfaceView cameraView;
CameraSource cameraSource;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
cameraView = (SurfaceView) findViewById(R.id.camera_view);
barcodeInfo = (TextView) findViewById(R.id.txtContent);
BarcodeDetector barcodeDetector =
new BarcodeDetector.Builder(this)
.setBarcodeFormats(Barcode.CODE_128)//QR_CODE)
.build();
cameraSource = new CameraSource
.Builder(this, barcodeDetector)
.setRequestedPreviewSize(640, 480)
.build();
cameraView.getHolder().addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
try {
cameraSource.start(cameraView.getHolder());
} catch (IOException ie) {
Log.e("CAMERA SOURCE", ie.getMessage());
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
cameraSource.stop();
}
});
barcodeDetector.setProcessor(new Detector.Processor<Barcode>() {
@Override
public void release() {
}
@Override
public void receiveDetections(Detector.Detections<Barcode> detections) {
final SparseArray<Barcode> barcodes = detections.getDetectedItems();
if (barcodes.size() != 0) {
barcodeInfo.post(new Runnable() { // Use the post method of the TextView
public void run() {
barcodeInfo.setText( // Update the TextView
barcodes.valueAt(0).displayValue
);
}
});
}
}
});
}
}
activity_main.xml
<?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"
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.example.gateway.cameraapibarcode.MainActivity">
<LinearLayout
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:orientation="vertical">
<SurfaceView
Android:layout_width="640px"
Android:layout_height="480px"
Android:layout_centerVertical="true"
Android:layout_alignParentLeft="true"
Android:id="@+id/camera_view"/>
<TextView
Android:text=" code reader"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:id="@+id/txtContent"/>
<Button
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="Process"
Android:id="@+id/button"
Android:layout_alignParentTop="true"
Android:layout_alignParentStart="true" />
<ImageView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:id="@+id/imgview"/>
</LinearLayout>
</RelativeLayout>
build.gradle(モジュール:アプリ)
add compile 'com.google.Android.gms:play-services:7.8。+'依存関係で
barcodefragmentlib を使用することもできます。これはzxingの拡張機能ですが、バーコードスキャンをフラグメントライブラリとして提供するため、非常に簡単に統合できます。
ライブラリを使用するためのサポート ドキュメント
モジュールアプリ:
implementation 'com.google.zxing:core:3.2.1'
implementation 'com.journeyapps:zxing-Android-embedded:3.2.0@aar'
AndroidManifest.xml
<uses-permission Android:name="Android.permission.CAMERA" />
<uses-feature Android:name="Android.hardware.camera" />
<uses-feature Android:name="Android.hardware.camera.autofocus"/>
MainActivity.Java
public class MainActivity extends AppCompatActivity {
Button BarCode;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
BarCode = findViewById(R.id.button_barcode);
final Activity activity = this;
BarCode.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
IntentIntegrator intentIntegrator = new IntentIntegrator(activity);
intentIntegrator.setDesiredBarcodeFormats(intentIntegrator.ALL_CODE_TYPES);
intentIntegrator.setBeepEnabled(false);
intentIntegrator.setCameraId(0);
intentIntegrator.setPrompt("SCAN");
intentIntegrator.setBarcodeImageEnabled(false);
intentIntegrator.initiateScan();
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
IntentResult Result = IntentIntegrator.parseActivityResult(requestCode , resultCode ,data);
if(Result != null){
if(Result.getContents() == null){
Log.d("MainActivity" , "cancelled scan");
Toast.makeText(this, "cancelled", Toast.LENGTH_SHORT).show();
}
else {
Log.d("MainActivity" , "Scanned");
Toast.makeText(this,"Scanned -> " + Result.getContents(), Toast.LENGTH_SHORT).show();
}
}
else {
super.onActivityResult(requestCode , resultCode , data);
}
}
}
Google Firebase ML KitのバーコードスキャンAPIを使用すると、ほとんどの標準バーコード形式を使用してエンコードされたデータを読み取ることができます。
https://firebase.google.com/docs/ml-kit/read-barcodes?authuser=
このリンクをたどると、バーコードを効率的に読み取ることができます。
バーコードスキャン機能の構築には2つの部分があります。1つはカメラを使用してバーコード画像をキャプチャし、2つ目は画像からバーコード値を抽出します。
カメラアプリを使用してバーコードイメージをアプリからキャプチャし、Firebase Machine Learning KitバーコードスキャンAPIを使用してバーコード値を抽出できます。
以下にアプリの例を示します https://www.zoftino.com/Android-barcode-scanning-example