2011-10-23 9 views
2

私はまだかなり新しいアンドロイドで、イメージをSQLite DBに保存する方法を見つけようとしています。私は写真を撮るためにボタンのクリックイベントでカメラを呼び出し、それをblobとしてデータベースに保存しようとしています。私はこれが最善の方法ではないかもしれないと理解しており、それが言われていると私はこれをどうやってやるのか迷っています。私が最終的に必要とするのは、自分のアプリでカメラにアクセスし、写真を撮ることを許可し、写真をデータベースに保存できるようにすることです。私はいくつかのフォーラムを見てきましたが、人々はビットマップを返すよう提案し、バイト配列に変換して保存しました。それはうまくいくだろうが、もう一度私は迷っている。どんな助けも大いに評価されるだろう。ここで私が現在使用していたコードされていますAndroid:カメラで写真を撮り、ビットマップをバイト配列に変換してsqlite dbに保存する方法は?

//---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メソッドです:

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

ここれますログキャストのエラー:

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

JavaOCRプロジェクトは、類似した何かを、Androidのデモを持っています。それは悪いフォームと考えられ、データがディスクに格納される方法のために、データベースへのクエリを実際に長くすることができます。あなたがするべきことは、あなたのデータベースの画像へのファイルパスを保存し、その画像をsdcardに保存することです。

大量のコードを記述することなく、ここには例があります。それはあなたが二つのことをしなければならない画像を挿入するには時間が来ると

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

:まず、以下のSQL呼び出しで画像を保存するために、あなたのテーブルを作成します。まず、イメージをSDカードに書き出します。それにはinstructions hereに従ってください。あなたはそれを書かれており、そのためのファイル名を得たら、ちょうどそうのようなSQLクエリを実行します。

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

あなたが実際に画像を表示する必要があるときはいつでも、あなたは自分からFILE_PATHで指定されたファイルを読み込みますSDカード。

+0

よろしいですか、この例がありますか? – cking24343

+0

私は、書き込むイメージパスのテーブルを作成しました。私はsdcardにイメージを書き出し、今晩の後半に保存するためのファイルパスを取得することを検討します。私はあなたの助けに感謝します。私はこのことが私のために働くかどうかをあなたに教えてくれます。 – cking24343

0

まず、BitmapはデフォルトのtoString()コンストラクタをオーバーライドしないため、意味のあるデータは..." + picture + "...から取得できません。 picture.getPixelsを呼び出し、その代わりに画像をピクセルの配列に変更する方法を検討する必要があります。データベースのピクチャ列をBLOB型に変更する必要があります。また、挿入メソッドでNULLポインタ例外が発生している可能性があります。dbがnullである可能性があります。 DBAdapterクラスから行406を単独で投稿できますか?

+0

OK、406行目は "e.printStackTrace();"です。のキャッチstatmentの。また、getPixelsメソッドを呼び出そうとしていることについてあなたが何を言っているのか見ることができますが、私はそれを行う方法がわかりません。私が参照できる例を知っていますか?申し訳ありませんが、これはシンプルに見えますが、私はこれについて明白なことを逃しているように感じます。 – cking24343

+0

例外はその行から来ているのはかなり奇妙です。とにかく、Kurtis Nusbaumによって良い答えが掲載されました。 – Craigy

0

getPixels()を使用してビットマップからピクセルデータを取得し、データベース内のBLOBとしてint配列を に保存します(ただし、プレーンファイルをお勧めします)。あなたは、一般的にデータベースにバイナリデータを保存しない http://sourceforge.net/projects/javaocr/

関連する問題