5

プロジェクトに QR スキャナーが必要です。この作業には ZBar を使用します。主に、ZBar git example で与えられたサンプル コードに非常に小さな変更を加えて、作業を行いました。スキャンした結果をブラウザー (URL の場合) またはダイアログ (通常の情報) に表示する必要があります。

ブラウザでqrコードをスキャンした後にURLを表示しようとする場合を除いて、以下のコードでうまく機能します。ブラウザーからアプリに戻ると、カメラのビューポートが黒くなり、非アクティブのままになります。別のqrコードをスキャンするためにカメラをアクティブに戻そうとしましたが、失敗しました。onResume() 関数でカメラを再度開いてみましたが、エラーが発生し、アプリを強制的に終了しました。その問題について私を助けてください。

    package com.myapp;
    import net.sourceforge.zbar.Config;
    import net.sourceforge.zbar.Image;
    import net.sourceforge.zbar.ImageScanner;
    import net.sourceforge.zbar.Symbol;
    import net.sourceforge.zbar.SymbolSet;
    import android.app.Activity;
    import android.app.AlertDialog;
    import android.content.DialogInterface;
    import android.content.Intent;
    import android.content.pm.ActivityInfo;
    import android.hardware.Camera;
    import android.hardware.Camera.AutoFocusCallback;
    import android.hardware.Camera.PreviewCallback;
    import android.hardware.Camera.Size;
    import android.net.Uri;
    import android.os.Bundle;
    import android.os.Handler;
    import android.webkit.URLUtil;
    import android.widget.FrameLayout;

    import com.myapp.CameraPreview;
    /* Import ZBar Class files */

    public class QRScannerActivity extends Activity
    {
        private Camera mCamera;
        private CameraPreview mPreview;
        private Handler autoFocusHandler;

        ImageScanner scanner;

        private boolean barcodeScanned = false;
        private boolean previewing = true;

        static {
            System.loadLibrary("iconv");
        } 

        @Override
        protected void onCreate(Bundle savedInstanceState) {

            super.onCreate(savedInstanceState);

            setContentView(R.layout.qr_scanner_main);

            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

            autoFocusHandler = new Handler();
            mCamera = getCameraInstance();

            /* Instance barcode scanner */
            scanner = new ImageScanner();
            scanner.setConfig(0, Config.X_DENSITY, 3);
            scanner.setConfig(0, Config.Y_DENSITY, 3);

            mPreview = new CameraPreview(this, mCamera, previewCb, autoFocusCB);
            FrameLayout preview = (FrameLayout)findViewById(R.id.cameraPreview);
            preview.addView(mPreview);
        }

        @Override
        protected void onPause() {
            super.onPause();
            releaseCamera();
            //finish();
        }

        /** A safe way to get an instance of the Camera object. */
        public static Camera getCameraInstance(){
            Camera c = null;
            try {
                c = Camera.open();
            } catch (Exception e){
            }
            return c;
        }

        private void releaseCamera() {
            //Toast.makeText(QRScannerActivity.this, "Paused State", Toast.LENGTH_SHORT).show();
            if (mCamera != null) {
                previewing = false;
                mCamera.setPreviewCallback(null);
                mPreview.getHolder().removeCallback(mPreview);
                mCamera.release();
                mCamera = null;
            }

        }

        private Runnable doAutoFocus = new Runnable() {
                public void run() {
                    if (previewing)
                        mCamera.autoFocus(autoFocusCB);
                }
            };

        PreviewCallback previewCb = new PreviewCallback() {
                public void onPreviewFrame(byte[] data, Camera camera) {
                    Camera.Parameters parameters = camera.getParameters();
                    Size size = parameters.getPreviewSize();

                    Image barcode = new Image(size.width, size.height, "Y800");
                    barcode.setData(data);

                    int result = scanner.scanImage(barcode);
                    String QRScannerResult;

                    if (result != 0) {
                        previewing = false;
                        mCamera.setPreviewCallback(null);
                        mCamera.stopPreview();

                        SymbolSet syms = scanner.getResults();
                        for (Symbol sym : syms) {
                            QRScannerResult = sym.getData();
                            showResultAction(QRScannerResult);
                            barcodeScanned = true;

                        }
                    }
                }
            };

        // Mimic continuous auto-focusing
        AutoFocusCallback autoFocusCB = new AutoFocusCallback() {
                public void onAutoFocus(boolean success, Camera camera) {
                    autoFocusHandler.postDelayed(doAutoFocus, 1000);
                }
            };

        private void showResultAction(String QRScannerResult){
                if (URLUtil.isValidUrl(QRScannerResult)) {

                    if (barcodeScanned) {
                        barcodeScanned = false;
                        mCamera.setPreviewCallback(previewCb);
                        mCamera.startPreview();
                        previewing = true;
                        mCamera.autoFocus(autoFocusCB);
                    }

                    Intent i = new Intent(Intent.ACTION_VIEW);
                    i.setData(Uri.parse(QRScannerResult));
                    startActivity(i);

                    }else {
                        new AlertDialog.Builder(this)
                        .setTitle("QR Data")
                        .setMessage(QRScannerResult)
                        .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int which) { 
                                if (barcodeScanned) {
                                    barcodeScanned = false;
                                    mCamera.setPreviewCallback(previewCb);
                                    mCamera.startPreview();
                                    previewing = true;
                                    mCamera.autoFocus(autoFocusCB);
                                }
                            }
                         })
                         .show();
                    }

        }
    }

前もって感謝します。サキブ

4

1 に答える 1