为什么两个字节数组不同,如何在不更改的情况下保留原始字节数组?
我正在使用Android Camera API拍照,我正在尝试在SQLiteDatabase中存储图像的byte []数据,然后在另一个活动中检索它。 但是,当我按照相机给出的字节数组进行记录时,我得到了..
V/Byte array before db: [B@42a1e7e0
然后我将字节数组(imageData)插入数据库以及其他变量
String insertSQL = "INSERT INTO " + IMAGE_TABLE_NAME +
" (TIMESTAMP, IMAGEDATA, LAT, LON) VALUES('" + time + "','" + imageData + "','" + lat +"','" + lon +"')";
然后我从Cursor对象(图像)中检索字节数组
byte[] imData = images.getBlob(images.getColumnIndex("IMAGEDATA"));
Log.v("byte Array after db", imData + " ");
日志的结果是
V/byte Array after db: [B@42919440
在你问之前,SQLiteDatabase中只有一个图像,因为我已将其清除并再次尝试。
答案 0 :(得分:1)
如果我错了,请纠正我,我认为这是一个java基本问题。
Java是一种按值传递的语言,
您创建的byte[]
对象引用用于保留图像数据,而您用于接收的byte[]
对象引用明显不同。您正在打印哈希而不是实际的字节数组。如果你看一下字节数组,它们应该是相同的
答案 1 :(得分:1)
<强>固定强>
问题在于
String insertSQL = "INSERT INTO " + IMAGE_TABLE_NAME +
" (TIMESTAMP, IMAGEDATA, LAT, LON) VALUES('" + time + "','" + imageData + "','" + lat +"','" + lon +"')";
imageData(字节数组)不能以这种方式插入数据库。
我做了这个
dbImages.insert("images", null, createContentValues(imageData));
和函数createContentValues(imageData)
private ContentValues createContentValues(byte[] image) {
ContentValues cv = new ContentValues();
cv.put("IMAGEDATA", image);
return cv;
}
为了将来遇到此问题的任何人保留此信息,请不要使用execSQL(字符串)插入它。
答案 2 :(得分:0)
您正在打印byte []数据而不是真正的位图。你可以通过跟随函数获得真正的位图,你只需要将你的byte []值作为参数传递:
public static Bitmap convertImageByteToBitmap(byte[] byteImage) {
if (byteImage == null) {
return null;
} else {
ByteArrayInputStream imageStream = new ByteArrayInputStream(byteImage);
Bitmap imageBitmap = BitmapFactory.decodeStream(imageStream);
return imageBitmap;
}
}