Android:如何用相机拍照并将位图转换为字节数组并保存到sqlite db?
Posted
技术标签:
【中文标题】Android:如何用相机拍照并将位图转换为字节数组并保存到sqlite db?【英文标题】:Android: how to take picture with camera and convert bitmap to byte array and save to sqlite db? 【发布时间】:2011-12-13 16:25:28 【问题描述】:我对 android 还很陌生,仍在尝试弄清楚如何将图像保存到 SQLite DB。正如我正在尝试使用按钮单击事件调用相机以拍摄照片并在返回时尝试将其作为 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() 方法:
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 ResultInfowho=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
【问题讨论】:
【参考方案1】:首先,Bitmap 似乎没有覆盖默认的toString()
构造函数,因此您无法从..." + picture + "...
获取任何有意义的数据。您应该考虑通过调用 picture.getPixels
并存储它来将图片更改为像素数组。您需要将数据库的图片列更改为 BLOB 类型。此外,您的插入方法中出现空指针异常,可能表明 db
为空。你能从你的 DBAdapter 类中单独发布第 406 行吗?
【讨论】:
好的,第 406 行是“e.printStackTrace();”的 catch 语句。此外,我可以看到您在尝试调用 getPixels 方法时所说的内容,但我不知道该怎么做。你知道我可以参考的例子吗?对不起,如果这看起来很简单,但我觉得我错过了显而易见的事情,只是一些如此简单的事情,我正在努力解决它。 异常来自该行,这很奇怪。无论如何,Kurtis Nusbaum 发布了一个更好的答案。【参考方案2】:使用 getPixels() 从位图中检索像素数据并将 int 数组保存为数据库中的 blob (虽然我会推荐纯文件)。
JavaOCR 项目有 android 演示,做类似的事情: http://sourceforge.net/projects/javaocr/
【讨论】:
【参考方案3】:您通常不会将二进制数据保存到数据库中。它被认为是错误的形式,并且由于数据最终存储在磁盘上的方式,可能会使对数据库的查询花费很长时间。您应该做的是在数据库中存储图像的文件路径并将图像存储在 sdcard 上。
无需为您编写大量代码,这里有一个高级示例。首先,使用以下 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");
当你真正需要显示图像时,你只需从你的 sdcard 中读取 file_path 指定的文件。
【讨论】:
好的,我已经为要写入的图像路径创建了表。今天下午晚些时候,我将考虑将图像写入 sdcard 并检索要存储的文件路径,感谢您对此的帮助。如果这对我有用,我会告诉你谢谢!以上是关于Android:如何用相机拍照并将位图转换为字节数组并保存到sqlite db?的主要内容,如果未能解决你的问题,请参考以下文章