Zxingを使用してQRコードの生成、スキャンを実現

7821 ワード

CSDNから転載
Android
ここでは、基本コードと使用ルールをまとめます.
まず、github-Zxingの公式ライブラリのアドレスgithub-zxing-android-embeddedは、非常に使いやすいandroidツールです.
1.インポート方法
android studioを使用する場合はgradleファイルに以下を追加します.
compile 'com.google.zxing:core:3.2.1'

  

compile group: 'com.google.zxing', name: 'core', version: '3.2.1'

みんなに1つのウェブサイトをあげてこの中で使うことができるMavenライブラリを検索することができます
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 ||           
}

QRコードを生成するにはどうすればいいですか?
次の方法では、文字列を入力し、表示に使用できるQRコードの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を使うメリットが明らかになったのではないでしょうか.その後のスキャンと生成機能については,別々に議論しない.
スキャン方法
スキャンを使用する場合は、システムのサービスを利用し、現在のMainActivityからCustomScanActivityにジャンプします.
スキャンのスタイルは完全にカスタマイズできます
関連コードは次のとおりです.
MainActivity:
//              ,                    ,             
//                 
public void customScan(){
        new IntentIntegrator(this)
        .setOrientationLocked(false)
        .setCaptureActivity(CustomScanActivity.class) //       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,"    ",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と、2つのポーズのbuttonが追加されています
対応するlayoutファイル



    

java文件 其中有使用 ButterKnife

public class CustomScanActivity extends AppCompatActivity implements DecoratedBarcodeView.TorchListener{ //       
    //              ,              ,  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);

        //          ,       
        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);
    }

    //        
    @OnClick(R.id.btn_switch)
    public void swichLight(){
        if(isLightOn){
            mDBV.setTorchOff();
        }else{
            mDBV.setTorchOn();
        }
    }
}


コアコードは実は少なくて、比較的に掌握しやすいです