ผมก็เลย 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 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();
}
}
------------------------------------------------------------------------------------------------------------
สอบถามครับ เปิดแอพแสกนไว้ แล้วพอหน้าจอดับ แล้วเปิดขึ้นมาใหม่ หน้าจอมืดครับ มันไม่ทำงานต่อ เป็นเพราะอะไรครับ
ตอบลบความคิดเห็นนี้ถูกผู้เขียนลบ
ตอบลบ