I am confused about how to do this.
For the database, I use:
public void insertImage(byte[] bytes) { ContentValues cv = new ContentValues(); cv.put("imageblob", bytes); Log.e("inserted", "inserted"); dbHelper.getWritableDatabase().insert("Image", "imageblob", cv); } public byte[] getImage(Cursor c) { return (c.getBlob(1)); }
Database Assistant:
... public static final String KEY_COMMENTS = "comments"; public static final String KEY_IMAGE = "imageblob"; private static final String SCRIPT_CREATE_DATABASE = "create table " + DATABASE_TABLE + " (" + KEY_ROWID + " integer primary key autoincrement, " + KEY_TITLE + " text not null, ......+KEY_COMMENTS+" text not null,"+KEY_IMAGE+" imageblob BLOB);";
MyItems:
public class myItems { .... String comments; byte[] imageblob; public byte[] getImage() { return imageblob; } public void setImage(byte[] imageblob) { this.imageblob = imageblob; }
Now I have a list in MainActivity. From another ShowList action, I have a button with which you can take a picture:
case R.id.photobtn: Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(cameraIntent, CAMERA_REQUEST); break;
In onActivityResult:
protected void onActivityResult(int requestCode, int resultCode, Intent data) { if(resultCode == CAMERA_REQUEST){ Bitmap photo = (Bitmap) data.getExtras().get("data"); imageView.setImageBitmap(photo); ByteArrayOutputStream stream = new ByteArrayOutputStream(); photo.compress(Bitmap.CompressFormat.PNG, 100, stream); byte[] byteArray = stream.toByteArray(); sqlHandler.insertImage(byteArray); }
My adapter:
The public class myAdapter extends BaseAdapter {
... public myAdapter(Context context, ArrayList<myItems> list) { this.context = context; this.setItems(list); } @Override public View getView(int position, View convertView, ViewGroup arg2) { myItems theItems = getItems().get(position); if (convertView == null) { LayoutInflater inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = inflater.inflate(R.layout.showadapterlist, null); } ... TextView Comments = (TextView) convertView.findViewById(R.id.text_comments); Comments.setText(theItems.getComments()); ImageView myImage=(ImageView) convertView.findViewById(R.id.myimage); myImage.setImageBitmap(getImageFromBLOB(theItems.getImage())); return convertView; } public static Bitmap getImageFromBLOB(byte[] mBlob) { byte[] bb = mBlob; return BitmapFactory.decodeByteArray(bb, 0, bb.length); } public ArrayList<myItems> getItems() { return items; } public void setItems(ArrayList<myItems> items) { this.items = items; }
My problems:
1) The list is in MainActivity.The snapshot is taken from ShowList activity.In ShowList activity I have:
case R.id.OKbtn: String mycomments = comments.getText().toString(); byte[] myimageblob=null; String query = "INSERT INTO MEMOR(title,...comments,imageblob)" + " values (..+ mytitle + "....+mycomments + "','" +myimageblob+ "')" sqlHandler.executeQuery(query); Intent k=new Intent(this,MainActivity.class); setResult(RESULT_OK,k); finish();
How do I handle the value of "imageblob"?
2) In MainActivity (where is the list view) I have:
... myItems theItems = new myItems(); theItems.setID(c1.getString(c1.getColumnIndex("_id"))); theItems.setTitle(c1.getString(c1.getColumnIndex("title"))); ... theItems.setComments(c1.getString(c1.getColumnIndex("comments"))); byte[] blob=c1.getBlob(c1.getColumnIndex("imageblob")); ByteArrayInputStream inputStream = new ByteArrayInputStream(blob); Bitmap bitmap = BitmapFactory.decodeStream(inputStream); myList.add(theItems);
How should I handle imageblob?
Right now, when I run my application, it crashes with "IllegalStateException" in the line
"byte [] blob = c1.getBlob (c1.getColumnIndex (" imageblob "));"
. If I try c1.setImage, this will not work.
------------------ NEW ---------------------------- --- ------------------- In one action:
case R.id.photobtn: Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(cameraIntent, CAMERA_REQUEST); break; protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(requestCode == CAMERA_REQUEST){ if (resultCode==RESULT_OK){ Bitmap photo = (Bitmap) data.getExtras().get("data"); imageView.setImageBitmap(photo); ByteArrayOutputStream stream = new ByteArrayOutputStream(); photo.compress(Bitmap.CompressFormat.PNG, 100, stream); blobvalue = stream.toByteArray(); Bundle extras = new Bundle(); Intent k=new Intent(this,MainActivity.class); extras.putParcelable("Bitmap", photo); k.putExtras(extras); } } if (resultCode == RESULT_CANCELED) { } }
In the adapter:
public View getView(int position, View convertView, ViewGroup arg2) { myItems theItems = getItems().get(position); if (convertView == null) { LayoutInflater inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = inflater.inflate(R.layout.showadapterlist, null); } ImageView myImage=(ImageView) convertView.findViewById(R.id.myimage); final Bitmap image; if(theItems.getImagemyItems() != null) { byte []temp = theItems.getImagemyItems(); image = BitmapFactory.decodeByteArray(temp, 0, temp.length); myImage.setImageBitmap(image); } else { image = BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_launcher); myImage.setImageBitmap(image); }
In myItems:
public class myItems { String id; ... byte[] imageblob; public String getID() { return id; } .... }