วันพุธที่ 27 กุมภาพันธ์ พ.ศ. 2556

โปรแกรม Scan Barcode and QR Code (Android)

ในส่วนของโปรแกรมนี้ ผมได้อยากทำจริงๆ  แต่บังเอิญ  มีเพื่อนผมคนหนึ่งวานให้เขียนให้หน่อย
ผมก็เลย Solo จัดการให้ด้วยความเป็นคนดี 555+    ทั้งที่ไม่มีความรู้ด้าน Android เท่าไหร่  
ในบทความนี้ผมจะเอาตัวอย่างโค้ดมาให้ดูว่ามันเป็นแบบไหน  เผื่อเพื่อนคนไหนสนใจ  จะนำไปศึกษาได้ เพราะผมก็นำจากคนอื่นมาต่อยอดอีกที   เดี่ยวถ้ามีโอกาสผมจะมาอธิบายแต่ละส่วนให้ฟังนะครับ ^^
โดยตัวโปรแกรมนี้  ผมได้นำ  Library ของ zbar.jar มาใช้ด้วย เพราะถ้าจะให้เขียนมาทั้งหมด  มันก็จะเยอะไป      ก็ค่อยๆศึกษากันไปนะครับ ^^
----------------------------------------------------------------------------------------------------------

CameraPreview.java

public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
    private SurfaceHolder mHolder;
    private Camera mCamera;
    private PreviewCallback previewCallback;
    private AutoFocusCallback autoFocusCallback;

    public CameraPreview(Context context, Camera camera,
                         PreviewCallback previewCb,
                         AutoFocusCallback autoFocusCb) {
        super(context);
        mCamera = camera;
        previewCallback = previewCb;
        autoFocusCallback = autoFocusCb;

        /* 
         * Set camera to continuous focus if supported, otherwise use
         * software auto-focus. Only works for API level >=9.
         */
        /*
        Camera.Parameters parameters = camera.getParameters();
        for (String f : parameters.getSupportedFocusModes()) {
            if (f == Parameters.FOCUS_MODE_CONTINUOUS_PICTURE) {
                mCamera.setFocusMode(Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
                autoFocusCallback = null;
                break;
            }
        }
        */

        // Install a SurfaceHolder.Callback so we get notified when the
        // underlying surface is created and destroyed.
        mHolder = getHolder();
        mHolder.addCallback(this);

        // deprecated setting, but required on Android versions prior to 3.0
        mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }

    public void surfaceCreated(SurfaceHolder holder) {
        // The Surface has been created, now tell the camera where to draw the preview.
        try {
            mCamera.setPreviewDisplay(holder);
        } catch (IOException e) {
            Log.d("DBG", "Error setting camera preview: " + e.getMessage());
        }
    }

    public void surfaceDestroyed(SurfaceHolder holder) {
        // Camera preview released in activity
    }

    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        /*
         * If your preview can change or rotate, take care of those events here.
         * Make sure to stop the preview before resizing or reformatting it.
         */
        if (mHolder.getSurface() == null){
          // preview surface does not exist
          return;
        }

        // stop preview before making changes
        try {
            mCamera.stopPreview();
        } catch (Exception e){
          // ignore: tried to stop a non-existent preview
        }

        try {
            // Hard code camera surface rotation 90 degs to match Activity view in portrait
            mCamera.setDisplayOrientation(90);

            mCamera.setPreviewDisplay(mHolder);
            mCamera.setPreviewCallback(previewCallback);
            mCamera.startPreview();
            mCamera.autoFocus(autoFocusCallback);
        } catch (Exception e){
            Log.d("DBG", "Error starting camera preview: " + e.getMessage());
        }
    }
}

------------------------------------------------------------------------------------------------------------

CameraTestActivity.java

public class CameraTestActivity extends Activity
{
    private Camera mCamera;
    private CameraPreview mPreview;
    private Handler autoFocusHandler;
    private EditText et;
    public static SQLiteDatabase db;
    TextView output;
    
    EditText res ;
    TextView scanText;
    Button scanButton;
    Button view;
    Button del;
    Button back;
    Button exit;

    ImageScanner scanner;

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

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

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

        autoFocusHandler = new Handler();
        mCamera = getCameraInstance();
        res = (EditText)findViewById(R.id.editText1);
        
        /* 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);
        
        
        et = (EditText)findViewById(R.id.editText1);
        Button save = (Button)findViewById(R.id.button2);
        view = (Button)findViewById(R.id.button1);
        exit = (Button)findViewById(R.id.exit);
       
        save.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String name = et.getText().toString();   // รับค่าจาก txt_name

    if(name.equals("")){
    return;
    }
   
    String sql ="insert into person values(null,'"+name+"')";
    try{
    db.execSQL(sql);
    Toast.makeText(getBaseContext(), "Inset to Database is success.",Toast.LENGTH_SHORT).show();
    }catch(Exception e){
    Toast.makeText(getBaseContext(), "Error,"+e.getMessage(),Toast.LENGTH_SHORT).show();
    }finally{
    et.setText("");
    }
}
});
        
        
        view.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(CameraTestActivity.this,ShowData.class);
startActivity(intent);
}
});
        
        
        
        exit.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
           System.exit(0);
}
});
        
        
        
        
        preview.addView(mPreview);

        scanText = (TextView)findViewById(R.id.scanText);

        scanButton = (Button)findViewById(R.id.ScanButton);

        scanButton.setOnClickListener(new OnClickListener() {
                public void onClick(View v) {
                    if (barcodeScanned) {
                        barcodeScanned = false;
                        scanText.setText("Scanning...");
                        mCamera.setPreviewCallback(previewCb);
                        mCamera.startPreview();
                        previewing = true;
                        mCamera.autoFocus(autoFocusCB);
                    }
                }
            });
        
    db = openOrCreateDatabase( "test1.db", SQLiteDatabase.CREATE_IF_NECESSARY, null); // สร้าง Database ชื่อ test1.db
db.setVersion(1);
db.setLocale(Locale.getDefault());
db.setLockingEnabled(true);

try {
            final String CREATE_TABLE_CONTAIN = "CREATE TABLE IF NOT EXISTS person ("  // ถ้าไม่มี table person ให้ทำการสร้าง
                    + "_id INTEGER primary key AUTOINCREMENT,"   // ฟิลด์ _id ให้เป็น PK
                    + "name TEXT);";                  // ฟิลด์ name ชนิด Text

            db.execSQL(CREATE_TABLE_CONTAIN);
          //  Toast.makeText(getBaseContext(), "Table person is created.",Toast.LENGTH_SHORT).show();
        }
        catch (Exception e) {
        Toast.makeText(getBaseContext(), "Error,"+e.getMessage(),Toast.LENGTH_SHORT).show();
        }
    }

   
   
    
    @Override
    protected void onDestroy(){
       super.onDestroy();
       db.close();  // Close Database Connection
    }
    

public void onPause() {
        super.onPause();
        releaseCamera();
    }

    /** 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() {
        if (mCamera != null) {
            previewing = false;
            mCamera.setPreviewCallback(null);
            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);
                
                if (result != 0) {
                    previewing = false;
                    mCamera.setPreviewCallback(null);
                    mCamera.stopPreview();
                    
                    SymbolSet syms = scanner.getResults();
                    for (Symbol sym : syms) {
                        scanText.setText("barcode result " + sym.getData());
                        res.setText(sym.getData().toString());
                        barcodeScanned = true;
                    }
                }
            }
        };

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

-----------------------------------------------------------------------------------------------------------

ShowData.java


public class ShowData extends Activity{

private TextView output;
private Button del;
private Button back;

@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.showdata);
output = (TextView)findViewById(R.id.textView1);
del = (Button)findViewById(R.id.delete);
back = (Button)findViewById(R.id.back);
CameraTestActivity.db = openOrCreateDatabase( "test1.db", SQLiteDatabase.CREATE_IF_NECESSARY, null); // สร้าง Database ชื่อ test1.db
CameraTestActivity.db.setVersion(1);
CameraTestActivity.db.setLocale(Locale.getDefault());
CameraTestActivity.db.setLockingEnabled(true);

try {
            final String CREATE_TABLE_CONTAIN = "CREATE TABLE IF NOT EXISTS person ("  // ถ้าไม่มี table person ให้ทำการสร้าง
                    + "_id INTEGER primary key AUTOINCREMENT,"   // ฟิลด์ _id ให้เป็น PK
                    + "name TEXT);";                  // ฟิลด์ name ชนิด Text

            CameraTestActivity.db.execSQL(CREATE_TABLE_CONTAIN);
          //  Toast.makeText(getBaseContext(), "Table person is created.",Toast.LENGTH_SHORT).show();
        }
        catch (Exception e) {
        Toast.makeText(getBaseContext(), "Error,"+e.getMessage(),Toast.LENGTH_SHORT).show();
        }
showdata();
del.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
delete_clicked();
}
});
back.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(ShowData.this,CameraTestActivity.class);
startActivity(intent);
}
});
}
public void delete_clicked(){
    String sql = "delete from person ";
    CameraTestActivity.db.execSQL(sql);
      showdata();
    }

private void showdata() {
    output.setText("");
    SQLiteCursor cur = (SQLiteCursor)CameraTestActivity.db.rawQuery("select * from person",null);
    cur.moveToFirst();
         while (cur.isAfterLast() == false) {
          output.append(" Data : "+cur.getString(1)+"\n");
        cur.moveToNext();
         }
         cur.close();
}
}

------------------------------------------------------------------------------------------------------------

2 ความคิดเห็น:

  1. สอบถามครับ เปิดแอพแสกนไว้ แล้วพอหน้าจอดับ แล้วเปิดขึ้นมาใหม่ หน้าจอมืดครับ มันไม่ทำงานต่อ เป็นเพราะอะไรครับ

    ตอบลบ
  2. ความคิดเห็นนี้ถูกผู้เขียนลบ

    ตอบลบ