2011-10-23 37 views
2

我還是比較新的android,仍然試圖找出如何將圖像保存到SQLite數據庫。正如我正在嘗試通過按鈕單擊事件來調用攝像頭以拍攝照片並將其返回到試圖將其保存到數據庫中作爲一個blob。我明白,這可能不是最好的方式,並且據說我不知道​​如何做到這一點。我最需要做的是用我的應用程序訪問攝像頭,允許它拍攝照片,並能夠將照片保存在數據庫中。到目前爲止,我見過幾個論壇,人們建議把位圖返回並將其轉換爲字節數組,然後保存。這將是很好,但我再次陷入虧損,任何幫助將不勝感激。這是我目前正在使用的代碼:Android:如何用相機拍照並將位圖轉換爲字節數組並保存到sqlite數據庫?

//---Pressing this button will call the built in Camera--- 
    Button b4 = (Button) findViewById(R.id.btn_addPhotos); 
    b4.setOnClickListener(new OnClickListener() 
    { 

     public void onClick(View arg0){ 

      Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 

      //startActivity(cameraIntent); 
      startActivityForResult(cameraIntent, CAMERA_PIC_REQUEST); 
     } 

    }); 

這裏是onActivityResult()方法:

protected void onActivityResult(int requestCode, int resultCode, Intent data){ 
    if (resultCode == Activity.RESULT_CANCELED) 
    { 
     //handles when camera was canceled... 
     Toast.makeText(this, "Camera was cancelled by user...", Toast.LENGTH_LONG).show(); 

    } else if (resultCode == Activity.RESULT_OK) 
    { 

     Bitmap imageReturned = (Bitmap) data.getExtras().get("data"); 

     db.open(); 
     boolean id = db.insertImage(AssessmentID, imageReturned, "test"); 
       db.close(); 

     //displays message, if successful... 
     displayMessage(id); 

    }; 
}; 

這裏是數據庫類的我的插入方法:這裏

//---insert image into the database--- 
    public boolean insertImage(String AssessmentID, Bitmap picture, String name)//, String sub, String parcel, String lot, String elevation, String datum) 
    { 
     boolean num = false; 
     try 
     { 
       db.execSQL("insert into storedImages values(" + AssessmentID + ", " + picture + ", " + name + ");"); 
       num = true; 
       //getting null pointer when trying to insert.... 
     }catch(SQLException e) 
     { 
      e.printStackTrace(); 
      num = false; 
     }; 

      //returns true if successful and false if not... 
     return num; 
    } 

是logcat的錯誤:

10-23 15:10:51.890: ERROR/NvOmxCameraSettingsparser(89): Param type 13 not supported 
10-23 15:10:51.890: ERROR/NvOmxCameraSettingsparser(89): Param type 49 not supported 
10-23 15:10:52.200: ERROR/ImagerODM-OV5650(89): SetParameter(): 32 not supported 
10-23 15:10:57.510: ERROR/NvOmxCamera(89): Already called release() 
10-23 15:11:08.020: ERROR/AndroidRuntime(10123): FATAL EXCEPTION: main 
10-23 15:11:08.020: ERROR/AndroidRuntime(10123): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1337, result=-1, data=Intent { act=inline-data (has extras) }} to activity {king.chad.SDE/king.chad.SDE.NewResidentialActivity}: java.lang.NullPointerException 
10-23 15:11:08.020: ERROR/AndroidRuntime(10123):  at android.app.ActivityThread.deliverResults(ActivityThread.java:2818) 
10-23 15:11:08.020: ERROR/AndroidRuntime(10123):  at android.app.ActivityThread.handleSendResult(ActivityThread.java:2861) 
10-23 15:11:08.020: ERROR/AndroidRuntime(10123):  at android.app.ActivityThread.access$1000(ActivityThread.java:122) 
10-23 15:11:08.020: ERROR/AndroidRuntime(10123):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1054) 
10-23 15:11:08.020: ERROR/AndroidRuntime(10123):  at android.os.Handler.dispatchMessage(Handler.java:99) 
10-23 15:11:08.020: ERROR/AndroidRuntime(10123):  at android.os.Looper.loop(Looper.java:132) 
10-23 15:11:08.020: ERROR/AndroidRuntime(10123):  at android.app.ActivityThread.main(ActivityThread.java:4123) 
10-23 15:11:08.020: ERROR/AndroidRuntime(10123):  at java.lang.reflect.Method.invokeNative(Native Method) 
10-23 15:11:08.020: ERROR/AndroidRuntime(10123):  at java.lang.reflect.Method.invoke(Method.java:491) 
10-23 15:11:08.020: ERROR/AndroidRuntime(10123):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 
10-23 15:11:08.020: ERROR/AndroidRuntime(10123):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) 
10-23 15:11:08.020: ERROR/AndroidRuntime(10123):  at dalvik.system.NativeStart.main(Native Method) 
10-23 15:11:08.020: ERROR/AndroidRuntime(10123): Caused by: java.lang.NullPointerException 
10-23 15:11:08.020: ERROR/AndroidRuntime(10123):  at king.chad.SDE.DBAdapter.insertImage(DBAdapter.java:406) 
10-23 15:11:08.020: ERROR/AndroidRuntime(10123):  at king.chad.SDE.NewResidentialActivity.onActivityResult(NewResidentialActivity.java:168) 
10-23 15:11:08.020: ERROR/AndroidRuntime(10123):  at android.app.Activity.dispatchActivityResult(Activity.java:4581) 
10-23 15:11:08.020: ERROR/AndroidRuntime(10123):  at android.app.ActivityThread.deliverResults(ActivityThread.java:2814) 
10-23 15:11:08.020: ERROR/AndroidRuntime(10123):  ... 11 more 

回答

2

通常不需要二進制數據保存到數據庫中。它被認爲是不好的形式,並且由於數據最終存儲在磁盤上的方式,可能會使數據庫的查詢花費很長時間。你應該做的是在數據庫中存儲圖像的文件路徑並將圖像存儲在SD卡上。

沒有爲你寫大量的代碼,這裏是一個高層次的例子。首先,用下面的sql調用創建表來存儲圖像:

CREATE TABLE images (_id INTEGER PRIMARY KEY AUTOICREMENT, file_path TEXT, name TEXT); 

當需要插入圖像時,您必須做兩件事。首先,將圖像寫入SD卡。按照instructions here來做到這一點。一旦你已經寫了出來,併爲它得到一個文件名,你只是做一個SQL查詢,像這樣:

INSERT INTO images (file_path, name) VALUES ("your file path", "name of image"); 

當你確實需要展示形象,你只是讀取FILE_PATH指定的文件你SD卡。

+0

好的,你會碰巧有這樣的例子嗎? – cking24343

+0

好的,我創建了要寫入的圖像路徑的表格。我會考慮將圖像寫入SD卡並檢索文件路徑以在今天下午晚些時候存儲,我感謝您的幫助。我會告訴你,如果這對我有用,謝謝! – cking24343

0

首先,看起來Bitmap不會覆蓋默認的toString()構造函數,因此您無法從..." + picture + "...獲取任何有意義的數據。您應該調用picture.getPixels來代替將圖片更改爲像素數組。您將需要將數據庫的圖片列更改爲BLOB類型。此外,您在插入方法中得到空指針異常,可能表明db爲空。你可以自己發佈你的DBAdapter類的第406行嗎?

+0

好的,第406行是「e.printStackTrace();」的捕獲量。另外,我可以看到你想要調用getPixels方法的意思,但我不知道該怎麼做。你知道我可以參考的一個例子嗎?對不起,如果這看起來很簡單,但我覺得我錯過了這個顯而易見的事情,只是這麼簡單,而我正在爲此而頭痛。 – cking24343

+0

異常來自該行很奇怪。無論如何,Kurtis Nusbaum發佈了一個更好的答案。 – Craigy

0

使用getPixels()從位圖檢索像素數據並將int數組作爲數據庫保存爲數據庫 (雖然我會推薦純文件)。

JavaOCR項目有機器人演示,做類似的事情: http://sourceforge.net/projects/javaocr/

相關問題