web-dev-qa-db-ja.com

Android、アプリケーションでQRコードを読み取る方法

私のアプリケーションでは、Qrコードを読む必要があります。私はネットを検索し、Zingコードを見つけましたが、多くの開発者がその使用に問題があり、バグがあるようです!

顧客がデバイスにqrリーダーをインストールしていると仮定した場合、これらのアプリケーションを使用して暗黙的なインテントを介してそれらを呼び出すにはどうすればよいですか?

ユーザーがqrリーダーを持っていない場合、アプリケーションはどうなりますか?クラッシュした場合、たとえばQrDroidをダウンロードするようにユーザーに依頼し、その後それを使用できますか?

55
Hesam
_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_CANCELED){
            //handle cancel
        }
    }
}
_
74
Seshu Vinay

Zxingは、Qrコードのスキャンと生成を実行するための優れたライブラリです。次の実装では、Zxingライブラリを使用してQRコードイメージをスキャンします。build.gradleに次の依存関係を追加することを忘れないでください

compile 'me.dm7.barcodescanner:zxing:1.9'

コードスキャナーのアクティビティ:

public class QrCodeScanner extends AppCompatActivity implements ZXingScannerView.ResultHandler {
    private ZXingScannerView mScannerView;

    @Override
    public void onCreate(Bundle state) {
        super.onCreate(state);
        // Programmatically initialize the scanner view
        mScannerView = new ZXingScannerView(this);
        // Set the scanner view as the content view
        setContentView(mScannerView);
    }

    @Override
    public void onResume() {
        super.onResume();
        // Register ourselves as a handler for scan results.
        mScannerView.setResultHandler(this);
        // Start camera on resume
        mScannerView.startCamera();
    }

    @Override
    public void onPause() {
        super.onPause();
        // Stop camera on pause
        mScannerView.stopCamera();
    }

    @Override
    public void handleResult(Result rawResult) {
        // Do something with the result here
        // Prints scan results
        Logger.verbose("result", rawResult.getText());
        // Prints the scan format (qrcode, pdf417 etc.)
        Logger.verbose("result", rawResult.getBarcodeFormat().toString());
        //If you would like to resume scanning, call this method below:
        //mScannerView.resumeCameraPreview(this);
        Intent intent = new Intent();
        intent.putExtra(AppConstants.KEY_QR_CODE, rawResult.getText());
        setResult(RESULT_OK, intent);
        finish();
    }
}
18
Amardeep

ユーザーがqrリーダーを持っていない場合、アプリケーションはどうなりますか?クラッシュした場合、たとえばQrDroidをダウンロードするようにユーザーに依頼し、その後それを使用できますか?

おもしろいことに、Googleが Mobile Vision APIs を導入しました。これらはプレイサービス自体に統合されています。

Gradleファイルに次を追加します。

compile 'com.google.Android.gms:play-services-vision:11.4.0'

これから引用 QRコードチュートリアル

17
KnowIT

Android studio、以下のプロセスを使用してQRコードを作成および読み取りできます&image look as bellw enter image description here

  1. Android studio emptyプロジェクトを作成します
  2. App.gradleにライブラリを追加

    compile 'com.google.zxing:core:3.2.1'
    compile 'com.journeyapps:zxing-Android-embedded:3.2.0@aar'
    
  3. Activity.main xmlでは、以下を使用します。

     <?xml version="1.0" encoding="utf-8"?>
     <LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
     xmlns:app="http://schemas.Android.com/apk/res-auto"
     xmlns:tools="http://schemas.Android.com/tools"
     Android:layout_width="match_parent"
     Android:layout_height="match_parent"
     tools:context="com.example.enamul.qrcode.MainActivity">
    
    <LinearLayout
      Android:layout_width="match_parent"
      Android:layout_height="match_parent"
      Android:layout_margin="20dp"
      Android:orientation="vertical">
    
    
    <EditText
        Android:id="@+id/editText"
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:gravity="center"
        Android:hint="Enter Text Here" />
    
    <Button
        Android:id="@+id/button"
        Android:layout_width="fill_parent"
        Android:layout_height="50dp"
        Android:layout_below="@+id/editText"
        Android:text="Click Here TO generate qr code"
        Android:textAllCaps="false"
        Android:textSize="16sp" />
    
    
    <Button
        Android:id="@+id/btnScan"
        Android:layout_width="fill_parent"
        Android:layout_height="50dp"
        Android:layout_below="@+id/editText"
        Android:text="Scan Your QR Code"
        Android:textAllCaps="false"
        Android:textSize="16sp" />
    
    <TextView
        Android:id="@+id/tv_qr_readTxt"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content" />
    
    
    <ImageView
        Android:id="@+id/imageView"
        Android:layout_width="match_parent"
        Android:layout_height="200dp"
        Android:layout_below="@+id/button"
        Android:src="@Android:drawable/ic_dialog_email" />
    
    
    </LinearLayout>
    
    </LinearLayout>
    
  4. MainActivityでは、以下のコードを使用できます

    public class MainActivity extends AppCompatActivity {
      ImageView imageView;
      Button button;
      Button btnScan;
      EditText editText;
      String EditTextValue ;
      Thread thread ;
      public final static int QRcodeWidth = 350 ;
      Bitmap bitmap ;
    
      TextView tv_qr_readTxt;
    
     @Override
     protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
    
        imageView = (ImageView)findViewById(R.id.imageView);
        editText = (EditText)findViewById(R.id.editText);
        button = (Button)findViewById(R.id.button);
        btnScan = (Button)findViewById(R.id.btnScan);
         tv_qr_readTxt = (TextView) findViewById(R.id.tv_qr_readTxt);
    
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
    
    
    
            if(!editText.getText().toString().isEmpty()){
                EditTextValue = editText.getText().toString();
    
                try {
                    bitmap = TextToImageEncode(EditTextValue);
    
                    imageView.setImageBitmap(bitmap);
    
                } catch (WriterException e) {
                    e.printStackTrace();
                }
            }
            else{
                editText.requestFocus();
                Toast.makeText(MainActivity.this, "Please Enter Your Scanned Test" , Toast.LENGTH_LONG).show();
            }
    
          }
      });
    
    
    btnScan.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
    
            IntentIntegrator integrator = new IntentIntegrator(MainActivity.this);
            integrator.setDesiredBarcodeFormats(IntentIntegrator.ALL_CODE_TYPES);
            integrator.setPrompt("Scan");
            integrator.setCameraId(0);
            integrator.setBeepEnabled(false);
            integrator.setBarcodeImageEnabled(false);
            integrator.initiateScan();
    
         }
       });
        }
    
    
     Bitmap TextToImageEncode(String Value) throws WriterException {
       BitMatrix bitMatrix;
        try {
        bitMatrix = new MultiFormatWriter().encode(
                Value,
                BarcodeFormat.DATA_MATRIX.QR_CODE,
                QRcodeWidth, QRcodeWidth, null
        );
    
        } catch (IllegalArgumentException Illegalargumentexception) {
    
         return null;
       }
      int bitMatrixWidth = bitMatrix.getWidth();
    
      int bitMatrixHeight = bitMatrix.getHeight();
    
      int[] pixels = new int[bitMatrixWidth * bitMatrixHeight];
    
      for (int y = 0; y < bitMatrixHeight; y++) {
          int offset = y * bitMatrixWidth;
    
         for (int x = 0; x < bitMatrixWidth; x++) {
    
             pixels[offset + x] = bitMatrix.get(x, y) ?
                    getResources().getColor(R.color.QRCodeBlackColor):getResources().getColor(R.color.QRCodeWhiteColor);
          }
        }
        Bitmap bitmap = Bitmap.createBitmap(bitMatrixWidth, bitMatrixHeight, Bitmap.Config.ARGB_4444);
    
       bitmap.setPixels(pixels, 0, 350, 0, 0, bitMatrixWidth, bitMatrixHeight);
       return bitmap;
    }
    
    
    
    
      @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.e("Scan*******", "Cancelled scan");
    
         } else {
            Log.e("Scan", "Scanned");
    
            tv_qr_readTxt.setText(result.getContents());
            Toast.makeText(this, "Scanned: " + result.getContents(), Toast.LENGTH_LONG).show();
         }
      } else {
          // This is important, otherwise the result will not be passed to the fragment
        super.onActivityResult(requestCode, resultCode, data);
         }
       }
     }
    
  5. GitHubから完全なソースコードをダウンロードできます。 GitHubリンク: https://github.com/enamul95/QRCode

7
Enamul Haque

簡単なサンプルチュートリアルを作成しました。これを読んで、アプリケーションで使用できます。

http://ribinsandroidhelper.blogspot.in/2013/03/qr-code-reading-on-your-application.html

このリンクから、qrcodeライブラリプロジェクトをダウンロードしてワークスペースにインポートし、プロジェクトにライブラリを追加できます。

このコードをアクティビティにコピーします

 Intent intent = new Intent("com.google.zxing.client.Android.SCAN");
 startActivityForResult(intent, 0);

 public void onActivityResult(int requestCode, int resultCode, Intent intent) {
     if (requestCode == 0) {
         if (resultCode == RESULT_OK) {
             String contents = intent.getStringExtra("SCAN_RESULT");
             String format = intent.getStringExtra("SCAN_RESULT_FORMAT");
             Toast.makeText(this, contents,Toast.LENGTH_LONG).show();
             // Handle successful scan
         } else if (resultCode == RESULT_CANCELED) {
             //Handle cancel
         }
     }
}
6
Ribin Haridas

ZXingのようなQRライブラリを使用します... QrDroidは非常にバグが多いため、非常に良い経験がありました。外部リーダーを使用する必要がある場合は、Googleゴーグルなどの標準的なリーダーを使用してください。

2
ᆼᆺᆼ

簡単なQRコードライブラリ

簡単なAndroid Easy QR Code Library。非常に簡単に使用できます。このライブラリを使用するには、次の手順に従ってください。

Gradleの場合:

手順1.リポジトリの最後にあるルートbuild.gradleに追加します。

allprojects {
    repositories {
        ...
        maven { url 'https://jitpack.io' }
    }
}

ステップ2.依存関係を追加します。

dependencies {
        compile 'com.github.mrasif:easyqrlibrary:v1.0.0'
}

Mavenの場合:

手順1. JitPackリポジトリをビルドファイルに追加します。

<repositories>
    <repository>
        <id>jitpack.io</id>
        <url>https://jitpack.io</url>
    </repository>
</repositories>

ステップ2.依存関係を追加します。

<dependency>
    <groupId>com.github.mrasif</groupId>
    <artifactId>easyqrlibrary</artifactId>
    <version>v1.0.0</version>
</dependency>

SBTの場合:

手順1. JitPackリポジトリをbuild.sbtファイルに追加します。

resolvers += "jitpack" at "https://jitpack.io"

ステップ2.依存関係を追加します。

libraryDependencies += "com.github.mrasif" % "easyqrlibrary" % "v1.0.0"

ライニンゲンの場合:

手順1.リポジトリの最後にあるproject.cljに追加します。

:repositories [["jitpack" "https://jitpack.io"]]

ステップ2.依存関係を追加します。

:dependencies [[com.github.mrasif/easyqrlibrary "v1.0.0"]]

これをレイアウトxmlファイルに追加します。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:padding="20dp"
    tools:context=".MainActivity"
    Android:orientation="vertical">

    <TextView
        Android:id="@+id/tvData"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:gravity="center"
        Android:text="No QR Data"/>
    <Button
        Android:id="@+id/btnQRScan"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="QR Scan"/>

</LinearLayout>

これをアクティビティに追加しますJava files:

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    TextView tvData;
    Button btnQRScan;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tvData=findViewById(R.id.tvData);
        btnQRScan=findViewById(R.id.btnQRScan);

        btnQRScan.setOnClickListener(this);
    }

    @Override
    public void onClick(View view){
        switch (view.getId()){
            case R.id.btnQRScan: {
                Intent intent=new Intent(MainActivity.this, QRScanner.class);
                startActivityForResult(intent, EasyQR.QR_SCANNER_REQUEST);
            } break;
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode){
            case EasyQR.QR_SCANNER_REQUEST: {
                if (resultCode==RESULT_OK){
                    tvData.setText(data.getStringExtra(EasyQR.DATA));
                }
            } break;
        }
    }
}

カスタマイズされたスキャナー画面では、スキャナーのアクティビティを開始するときにこれらの行を追加するだけです。

Intent intent=new Intent(MainActivity.this, QRScanner.class);
intent.putExtra(EasyQR.IS_TOOLBAR_SHOW,true);
intent.putExtra(EasyQR.TOOLBAR_DRAWABLE_ID,R.drawable.ic_audiotrack_dark);
intent.putExtra(EasyQR.TOOLBAR_TEXT,"My QR");
intent.putExtra(EasyQR.TOOLBAR_BACKGROUND_COLOR,"#0588EE");
intent.putExtra(EasyQR.TOOLBAR_TEXT_COLOR,"#FFFFFF");
intent.putExtra(EasyQR.BACKGROUND_COLOR,"#000000");
intent.putExtra(EasyQR.CAMERA_MARGIN_LEFT,50);
intent.putExtra(EasyQR.CAMERA_MARGIN_TOP,50);
intent.putExtra(EasyQR.CAMERA_MARGIN_RIGHT,50);
intent.putExtra(EasyQR.CAMERA_MARGIN_BOTTOM,50);
startActivityForResult(intent, EasyQR.QR_SCANNER_REQUEST);

できました。参照リンク: https://mrasif.github.io/easyqrlibrary