Android:如何使用相机拍照,将位图转换为字节数组并保存到sqlite db?

Android:如何使用相机拍照,将位图转换为字节数组并保存到sqlite db?,android,sqlite,bitmap,camera,save-image,Android,Sqlite,Bitmap,Camera,Save Image,我对android还是一个新手,仍然在尝试如何将图像保存到SQLite数据库。照现在的样子,我试图通过一个按钮点击事件调用相机来拍摄照片,并在返回时尝试将其作为一个blob保存到数据库中。我明白这可能不是最好的方法,尽管如此,我还是不知道该怎么做。我最终需要做的是使用我的应用程序访问相机,允许它拍照,并能够将照片保存在数据库中。到目前为止,我在一些论坛上看到过,有人建议将返回的位图转换成字节数组,然后保存它。那很好,但我又一次不知所措,任何帮助都将不胜感激。以下是我当前使用的代码: //---P

我对android还是一个新手,仍然在尝试如何将图像保存到SQLite数据库。照现在的样子,我试图通过一个按钮点击事件调用相机来拍摄照片,并在返回时尝试将其作为一个blob保存到数据库中。我明白这可能不是最好的方法,尽管如此,我还是不知道该怎么做。我最终需要做的是使用我的应用程序访问相机,允许它拍照,并能够将照片保存在数据库中。到目前为止,我在一些论坛上看到过,有人建议将返回的位图转换成字节数组,然后保存它。那很好,但我又一次不知所措,任何帮助都将不胜感激。以下是我当前使用的代码:

//---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()方法:

以下是数据库类的插入方法:

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

首先,它似乎不会覆盖默认的
toString()
构造函数,因此您无法从
..+picture+..
获取任何有意义的数据。您应该通过调用
picture.getPixels
并将其存储,将图片更改为像素数组。您需要将数据库的picture列更改为BLOB类型。另外,您在insert方法中得到一个null指针异常,这可能表明
db
为null。您能自己发布DBAdapter类中的第406行吗?

使用getPixels()从位图中检索像素数据,并将int数组保存为数据库中的blob (尽管我建议使用普通文件)

JavaOCR项目有android演示,做了类似的事情:

通常不会将二进制数据保存到数据库中。这被认为是一种糟糕的形式,而且由于数据最终存储在磁盘上的方式,对数据库的查询可能需要很长时间。您应该在数据库中存储图像的文件路径,并将图像存储在SD卡上

在不编写大量代码的情况下,下面是一个高级示例。首先,使用以下sql调用创建表以存储图像:

CREATE TABLE images (_id INTEGER PRIMARY KEY AUTOICREMENT, file_path TEXT, name TEXT);
当需要插入图像时,您必须做两件事。首先,将图像写入SD卡。按照下面的步骤去做。写出来并获得文件名后,只需执行如下sql查询:

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

当您实际需要显示图像时,只需从SD卡中读取文件路径指定的文件。

Ok,第406行是catch语句的“e.printStackTrace();”。另外,我可以看到您对尝试调用getPixels方法的看法,但我不确定如何做到这一点。你知道我可以参考的一个例子吗?很抱歉,如果这看起来很简单,但我觉得我错过了这件事上显而易见的东西,就是这么简单的事情,我正在努力克服它。这很奇怪,例外来自这一行。无论如何,Kurtis Nusbaum发布了一个更好的答案。好的,我已经为要写入的图像路径创建了表。今天下午晚些时候,我将研究将图像写入SD卡并检索要存储的文件路径,非常感谢您在这方面的帮助。我会让你知道这对我是否有效谢谢!
INSERT INTO images (file_path, name) VALUES ("your file path", "name of image");