バーコードをスキャンする方法について チュートリアル を見つけました。しかし、私のアプリケーションでは、QRコードをスキャンする必要があります。 AndroidでQRコードをスキャンするにはどうすればよいですか?
_try {
Intent intent = new Intent("com.google.zxing.client.Android.SCAN");
intent.putExtra("SCAN_MODE", "QR_CODE_MODE"); // "PRODUCT_MODE for bar codes
startActivityForResult(intent, 0);
} catch (Exception e) {
Uri marketUri = Uri.parse("market://details?id=com.google.zxing.client.Android");
Intent marketIntent = new Intent(Intent.ACTION_VIEW,marketUri);
startActivity(marketIntent);
}
_
およびonActivityResult():
内
_@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 0) {
if (resultCode == RESULT_OK) {
String contents = data.getStringExtra("SCAN_RESULT");
}
if(resultCode == RESULT_CANCELLED){
//handle cancel
}
}
}
_
現在の推奨事項は、 Android Barcode 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
Codelabをチェックしてください- Mobile Vision APIを使用したバーコード検出 。
zxing
でQRコードを簡単にスキャンできます。gradleに次の依存関係を追加します
compile 'com.journeyapps:zxing-Android-embedded:3.1.0@aar'
compile 'com.google.zxing:core:3.2.0'
次に、Activity
またはFragment
で
IntentIntegrator scanIntegrator = new IntentIntegrator(context);
scanIntegrator.setPrompt("Scan");
scanIntegrator.setBeepEnabled(true);
//The following line if you want QR code
scanIntegrator.setDesiredBarcodeFormats(IntentIntegrator.QR_CODE_TYPES);
scanIntegrator.setCaptureActivity(CaptureActivityAnyOrientation.class);
scanIntegrator.setOrientationLocked(true);
scanIntegrator.setBarcodeImageEnabled(true);
scanIntegrator.initiateScan();
そして、結果をonActivityResult
にキャプチャします
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
IntentResult scanningResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
if (scanningResult != null) {
if (scanningResult.getContents() != null) {
scanContent = scanningResult.getContents().toString();
scanFormat = scanningResult.getFormatName().toString();
}
Toast.makeText(this,scanContent+" type:"+scanFormat,Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(this,"Nothing scanned",Toast.LENGTH_SHORT).show();
}
}
これを見てください サンプルプロジェクト 、それがあなたを助けることを願っています。
1つの方法は、AppCompatActivityおよびZXingScannerView.ResultHandlerインターフェイスを使用することです。
import Android.annotation.SuppressLint;
import Android.content.Context;
import Android.content.Intent;
import Android.hardware.Camera;
import Android.hardware.camera2.CameraAccessException;
import Android.hardware.camera2.CameraCharacteristics;
import Android.hardware.camera2.CameraManager;
import Android.os.Build;
import Android.os.Bundle;
import Android.support.v7.app.AppCompatActivity;
import Android.view.View;
import Android.widget.Button;
import Android.widget.RelativeLayout;;
import com.Android.volley.VolleyError;
import com.example.team.merchant.functional.Request;
import com.example.team.merchant.functional.ResponseListener;
import com.google.zxing.Result;
import me.dm7.barcodescanner.zxing.ZXingScannerView;
/**
* Created by Prakhar on 5/16/2016.
*/
public class MerchantScannerActivity extends AppCompatActivity implements ZXingScannerView.ResultHandler {
private ZXingScannerView mScannerView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
RelativeLayout relativeLayout = new RelativeLayout(this);
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(60, 60);
params.setMargins(0, 50, 50, 0);
params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, RelativeLayout.TRUE);
Button switchCamera = new Button(this); //declare a button in layout for camera change option
switchCamera.setLayoutParams(params);
switchCamera.setBackgroundResource(R.drawable.switch_camera);
relativeLayout.addView(switchCamera);
final int i = getFrontCameraId();
if (i == -1) {
switchCamera.setVisibility(View.GONE);
}
mScannerView = new ZXingScannerView(this); // Programmatically initialize the scanner view
relativeLayout.addView(mScannerView);
setContentView(relativeLayout);
final int[] id = {0};
switchCamera.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mScannerView.stopCamera();
if (id[0] % 2 == 0) {
mScannerView.startCamera(i);
} else {
mScannerView.startCamera();
}
id[0]++;
}
});
mScannerView.setResultHandler(this);// Register ourselves as a handler for scan results.
mScannerView.startCamera(); // Start camera
}
@SuppressLint("NewApi")
int getFrontCameraId() {
if (Build.VERSION.SDK_INT < 22) {
Camera.CameraInfo ci = new Camera.CameraInfo();
for (int i = 0; i < Camera.getNumberOfCameras(); i++) {
Camera.getCameraInfo(i, ci);
if (ci.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) return i;
}
} else {
try {
CameraManager cManager = (CameraManager) getApplicationContext()
.getSystemService(Context.CAMERA_SERVICE);
String[] cameraId = cManager.getCameraIdList();
for (int j = 0; j < cameraId.length; j++) {
CameraCharacteristics characteristics = cManager.getCameraCharacteristics(cameraId[j]);
int cOrientation = characteristics.get(CameraCharacteristics.LENS_FACING);
if (cOrientation == CameraCharacteristics.LENS_FACING_FRONT)
return Integer.parseInt(cameraId[j]);
}
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
return -1; // No front-facing camera found
}
@Override
public void onPause() {
super.onPause();
mScannerView.stopCamera(); // Stop camera on pause
}
@Override
public void handleResult(Result rawResult) {
// rawResult.getText()
// handle your result here
// handle exceptions here
}
}
その他は、それに応じてフラグメントで使用できます。
import Android.Manifest;
import Android.os.Build;
import Android.os.Bundle;
import Android.support.v4.app.ActivityCompat;
import Android.support.v4.app.Fragment;
import Android.support.v4.app.FragmentTransaction;
import Android.support.v4.content.ContextCompat;
import Android.support.v7.app.AlertDialog;
import Android.view.LayoutInflater;
import Android.view.View;
import Android.view.ViewGroup;
import com.google.zxing.ResultPoint;
import com.journeyapps.barcodescanner.BarcodeCallback;
import com.journeyapps.barcodescanner.BarcodeResult;
import com.journeyapps.barcodescanner.CompoundBarcodeView;
/**
* Created by Prakhar on 3/8/2016.
*/
public class PayWithQrCodeScannerFragment extends Fragment {
private static final int PERMISSION_REQUEST_CAMERA = 23;
public static CompoundBarcodeView barcodeScannerView;
public static BarcodeCallback callback;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.paywithqrcodescannerfragment, container, false);
barcodeScannerView = (CompoundBarcodeView) view.findViewById(R.id.zxing_barcode_scanner);
callback = new BarcodeCallback() {
@Override
public void barcodeResult(BarcodeResult result) {
// handle result and exceptions here
}
return view;
}
/**
* Check if the device's camera has a Flashlight.
*
* @return true if there is Flashlight, otherwise false.
*/
private boolean hasFlash() {
return getActivity().getApplicationContext().getPackageManager()
.hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);
}
@Override
public void onResume() {
super.onResume();
if (Android.os.Build.VERSION.SDK_INT < 23) {
barcodeScannerView.resume();
}
}
@Override
public void onPause() {
super.onPause();
if (Android.os.Build.VERSION.SDK_INT < 23) {
barcodeScannerView.pause();
}
}
}
スキャナーをプレースホルダーするためにレイアウトXMLファイルで書かれた以下を使用してください
<com.journeyapps.barcodescanner.CompoundBarcodeView
Android:id="@+id/zxing_barcode_scanner"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
app:zxing_preview_scaling_strategy="centerCrop"
app:zxing_use_texture_view="false" />
Build.gradle
compile 'com.journeyapps:zxing-Android-embedded:3.2.0@aar'
compile 'com.google.zxing:core:3.2.1'
これがQRコードをスキャンするfunction
です。
_public void scanQR(View v)
{
try
{
Intent intent = new Intent(ACTION_SCAN);
intent.putExtra("SCAN_MODE", "QR_CODE_MODE");
startActivityForResult(intent, 0);
}
catch (ActivityNotFoundException anfe)
{
showDialog(ActivityUserDetails.this, "No Scanner Found",
"Download a scanner code activity?", "Yes", "No").show();
}
}
_
上記のコードスニペットでは、catch
ブロックからshowDialog()
メソッドを呼び出しました。これにより、GooglePlayから「BarcodeScanner」アプリのインストールを要求するためのAlertDialog
が表示されます。以下に、showDialog
メソッドのコードを示します。
_private static AlertDialog showDialog(final Activity act,
CharSequence title, CharSequence message, CharSequence buttonYes,
CharSequence buttonNo)
{
AlertDialog.Builder downloadDialog = new AlertDialog.Builder(act);
downloadDialog.setTitle(title);
downloadDialog.setMessage(message);
downloadDialog.setPositiveButton(buttonYes,
new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialogInterface, int i)
{
Uri uri = Uri.parse("market://search?q=pname:"
+ "com.google.zxing.client.Android");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
try
{
act.startActivity(intent);
}
catch (ActivityNotFoundException anfe)
{
}
}
});
downloadDialog.setNegativeButton(buttonNo,
new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialogInterface, int i)
{
}
});
return downloadDialog.show();
}
_
Button
クリックイベントでこの関数を使用しました。したがって、Button
のコードを以下に示します(xmlファイル)。
_ <Button
Android:id="@+id/button_wr_scan"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:layout_margin="5dp"
Android:background="@drawable/button_shadow"
Android:onClick="scanQR"
Android:paddingRight="4dp"
Android:paddingTop="4dp"
Android:text="ScanQR" />
_
[〜#〜] note [〜#〜]:この機能を使用するための前提条件は、デバイスに「バーコードスキャナー」アプリがプリインストールされている必要があることです。
それが役に立てば幸い。
ありがとう:)
私のやり方は barcodescanner
を使うことです。バーコードとQRコードのスキャンには zxing
を使用します。ライブラリのバージョン1.9
はzxing v3.2.1
を利用します。これはzxing
のラッパーであるため、使用法は簡単です。
これを行うためには:
Gradleに依存関係を追加する
compile 'me.dm7.barcodescanner:zxing:1.9'
マニフェストにカメラの許可を追加する
<uses-permission Android:name="Android.permission.CAMERA"/>
スキャンを処理するアクティビティを作成します
マニフェスト:
<activity
Android:name=".view.component.ScannerActivity"
Android:label="@string/app_name"
Android:screenOrientation="portrait"
Android:theme="@style/AppThemeTransparent"/>
styles.xml:
<style name="AppThemeTransparent" parent="@style/Theme.AppCompat.Light">
<item name="windowNoTitle">true</item>
<item name="windowActionBar">false</item>
<item name="colorPrimary">@color/colorPrimary</item>
<item name="Android:windowFullscreen">true</item>
<item name="Android:windowContentOverlay">@null</item>
</style>
スキャナーアクティビティを作成します:
import Android.app.Activity;
import Android.content.Intent;
import Android.os.Bundle;
import Android.util.Log;
import Android.view.WindowManager;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.Result;
import Java.util.ArrayList;
import Java.util.Collection;
import Java.util.List;
import me.dm7.barcodescanner.zxing.ZXingScannerView;
public class ScannerActivity extends Activity implements ZXingScannerView.ResultHandler {
public static final String EXCLUDED_FORMAT = "ExcludedFormat";
private static final String TAG = ScannerActivity.class.getSimpleName();
private ZXingScannerView mScannerView;
@Override
public void onCreate(Bundle state) {
setStatusBarTranslucent(true);
super.onCreate(state);
mScannerView = new ZXingScannerView(this);
setContentView(mScannerView);
}
protected void setStatusBarTranslucent(boolean makeTranslucent) {
if (makeTranslucent) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
} else {
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
}
@Override
public void onResume() {
super.onResume();
mScannerView.setResultHandler(this);
mScannerView.startCamera();
}
@Override
public void onPause() {
super.onPause();
mScannerView.stopCamera();
}
@Override
public void handleResult(Result rawResult) {
String result = rawResult.getText();
BarcodeFormat format = rawResult.getBarcodeFormat();
Log.v(TAG, "Scanned code: " + rawResult.getText());
Log.v(TAG, "Scanend code type: " + rawResult.getBarcodeFormat().toString());
//Return error
if (result == null) {
setResult(RESULT_CANCELED, returnErrorCode(result, format));
finish();
}
if (result.isEmpty()) {
setResult(RESULT_CANCELED, returnErrorCode(result, format));
finish();
}
//Return correct code
setResult(RESULT_OK, returnCorrectCode(result, format));
finish();
}
private Intent returnErrorCode(String result, BarcodeFormat format) {
Intent returnIntent = new Intent();
returnIntent.putExtra(ScannerConstants.ERROR_INFO, getResources().getString(R.string.scanner_error_message));
return returnIntent;
}
private Intent returnCorrectCode(String result, BarcodeFormat format) {
Intent returnIntent = new Intent();
returnIntent.putExtra(ScannerConstants.SCAN_RESULT, result);
if (format.equals(BarcodeFormat.QR_CODE)) {
returnIntent.putExtra(ScannerConstants.SCAN_RESULT_TYPE, ScannerConstants.QR_SCAN);
} else {
returnIntent.putExtra(ScannerConstants.SCAN_RESULT_TYPE, ScannerConstants.BAR_SCAN);
}
return returnIntent;
}
public void excludeFormats(BarcodeFormat item) {
Collection<BarcodeFormat> defaultFormats = mScannerView.getFormats();
List<BarcodeFormat> formats = new ArrayList<>();
for (BarcodeFormat format : defaultFormats) {
if (!format.equals(item)) {
formats.add(format);
}
}
mScannerView.setFormats(formats);
}
public interface ScannerConstants {
public static final String SCAN_MODES = "SCAN_MODES";
public static final String SCAN_RESULT = "SCAN_RESULT";
public static final String SCAN_RESULT_TYPE = "SCAN_RESULT_TYPE";
public static final String ERROR_INFO = "ERROR_INFO";
public static final int BAR_SCAN = 0;
public static final int QR_SCAN = 1;
}
}
API 23以降のデバイスでは、アプリケーションにカメラの使用許可が付与されていることを確認してください。
Activity
を通常のように開き、結果を期待します。
Intent intent = new Intent(AddEquipmentActivity.this, ScannerActivity.class);
startActivityForResult(intent, SCAN_SERIAL_REQUEST);
Eclipseでzxing 3.2.1をセットアップするためのステップバイステップ