-1

I am new to android programming so hopefully someone can be off help. Been having issues with attempting to add an image from Gallery or Camera to my SQLite database. I stumbled across someone's GitHub who had a CameraGallerySqliteDemo Found here

I tried to amend the code for my needs but have been unable to add an image to my gallery table.

Below is the class I am using to add images to the database.

public class add_gallery extends AppCompatActivity {

    Button addImage;
    ArrayList<Gall> imageArry = new ArrayList<Gall>();
    GalleryImageAdapter imageAdapter;
    private static final int CAMERA_REQUEST = 1;
    private static final int PICK_FROM_GALLERY = 2;
    ListView dataList;
    //maybe change to image title later
    byte[] imageName;
    int imageId;
    Bitmap theImage;
    DatabaseHelper myDb;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.add_gallery);
        dataList = (ListView) findViewById(R.id.list);
        /**
         * create DatabaseHelper object
         */
        myDb = new DatabaseHelper(this);
        /**
         * Reading and getting all records from database
         */
        List<Gall> images = myDb.getAllGallery();
        for (Gall cn : images) {
            String log = "ID:" + cn.getID() + " Image: " + cn.getImage()
                    + " ,Title: " + cn.getTitle()
                    + " ,Caption: " + cn.getCaption();

            // Writing Galls to log
            Log.d("Result: ", log);
            // add images data in arrayList
            imageArry.add(cn);

        }
        /**
         * Set Data base Item into listview
         */
        imageAdapter = new GalleryImageAdapter(this, R.layout.gallery_list,
                imageArry);
        dataList.setAdapter(imageAdapter);
        /**
         * go to next activity for detail image
         */
        dataList.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View v,
                                    final int position, long id) {
                imageName = imageArry.get(position).getImage();
                imageId = imageArry.get(position).getID();

                Log.d("Before Send:****", imageName + "-" + imageId);
                // convert byte to bitmap
                ByteArrayInputStream imageStream = new ByteArrayInputStream(
                        imageName);
                theImage = BitmapFactory.decodeStream(imageStream);
                Intent intent = new Intent(add_gallery.this,
                        DisplayImageActivity.class);
                intent.putExtra("imageid", imageId);
                intent.putExtra("imagename", theImage);
                startActivity(intent);

            }
        });
        /**
         * open dialog for choose camera/gallery
         */

        final String[] option = new String[] { "Take from Camera",
                "Select from Gallery" };
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                android.R.layout.select_dialog_item, option);
        AlertDialog.Builder builder = new AlertDialog.Builder(this);

        builder.setTitle("Select Option");
        builder.setAdapter(adapter, new DialogInterface.OnClickListener() {

            public void onClick(DialogInterface dialog, int which) {
                // TODO Auto-generated method stub
                Log.e("Selected Item", String.valueOf(which));
                if (which == 0) {
                    callCamera();
                }
                if (which == 1) {
                    callGallery();
                }

            }
        });
        final AlertDialog dialog = builder.create();

        addImage = (Button) findViewById(R.id.btnAdd);

        addImage.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                dialog.show();
            }
        });
    }

    /**
     * On activity result
     */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode != RESULT_OK)
            return;

        switch (requestCode) {
            case CAMERA_REQUEST:

                Bundle extras = data.getExtras();

                if (extras != null) {
                    Bitmap yourImage = extras.getParcelable("data");
                    // convert bitmap to byte
                    ByteArrayOutputStream stream = new ByteArrayOutputStream();
                    yourImage.compress(Bitmap.CompressFormat.PNG, 100, stream);
                    byte imageInByte[] = stream.toByteArray();
                    Log.e("output before conversion", imageInByte.toString());
                    // Inserting Galls
                    Log.d("Insert: ", "Inserting ..");
                    myDb.addGallery(new Gall("Android", imageInByte));
                    Intent i = new Intent(add_gallery.this,
                            add_gallery.class);
                    startActivity(i);
                    finish();

                }
                break;
            case PICK_FROM_GALLERY:
                Bundle extras2 = data.getExtras();

                if (extras2 != null) {
                    Bitmap yourImage = extras2.getParcelable("data");
                    // convert bitmap to byte
                    ByteArrayOutputStream stream = new ByteArrayOutputStream();
                    yourImage.compress(Bitmap.CompressFormat.PNG, 100, stream);
                    byte imageInByte[] = stream.toByteArray();
                    Log.e("output before conversion", imageInByte.toString());
                    // Inserting Galls
                    Log.d("Insert: ", "Inserting ..");
                    myDb.addGallery(new Gall("Android", imageInByte));
                    Intent i = new Intent(add_gallery.this,
                            add_gallery.class);
                    startActivity(i);
                    finish();
                }

                break;
        }
    }

    /**
     * open camera method
     */
    public void callCamera() {
        Intent cameraIntent = new Intent(
                android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
        cameraIntent.putExtra("crop", "true");
        cameraIntent.putExtra("aspectX", 0);
        cameraIntent.putExtra("aspectY", 0);
        cameraIntent.putExtra("outputX", 200);
        cameraIntent.putExtra("outputY", 150);
        startActivityForResult(cameraIntent, CAMERA_REQUEST);

    }

    /**
     * open gallery method
     */

    public void callGallery() {
        Intent intent = new Intent();
        intent.setType("image/*");
        intent.setAction(Intent.ACTION_GET_CONTENT);
        intent.putExtra("crop", "true");
        intent.putExtra("aspectX", 0);
        intent.putExtra("aspectY", 0);
        intent.putExtra("outputX", 200);
        intent.putExtra("outputY", 150);
        intent.putExtra("return-data", true);
        startActivityForResult(
                Intent.createChooser(intent, "Complete action using"),
                PICK_FROM_GALLERY);

    }
}

Below is the method I call to add an Image to the Gallery, addGallery

public// Adding new image to gallery
    void addGallery(Gall gallery) {
        SQLiteDatabase db = this.getWritableDatabase();

        ContentValues values = new ContentValues();
        values.put(IMAGE, gallery._image);
        values.put(TITLE, gallery._title);
        values.put(CAPTION, gallery._caption);

        // Inserting Row
        db.insert(GALLERY_TABLE, null, values);
        db.close(); // Closing database connection
    }

Below is the Gall class

public class Gall {

    // private variables
    int _id;
    byte[] _image;
    String _title;
    String _caption;

    // Empty constructor
    public Gall() {

    }

    // constructor
    public Gall(int keyId, byte[] image, String title, String caption) {
        this._id = keyId;
        this._image = image;
        this._title = title;
        this._caption = caption;

    }
    public Gall(byte[] image, String title, String caption) {
        this._image = image;
        this._title = title;
        this._caption = caption;

    }
    public Gall(int keyId) {
        this._id = keyId;

    }

    // getting ID
    public int getID() {
        return this._id;
    }

    // setting id
    public void setID(int keyId) {
        this._id = keyId;
    }

    // getting image
    public byte[] getImage() {
        return this._image;
    }

    // setting image
    public void setImage(byte[] image) {
        this._image = image;
    }

    // getting
    public String getTitle() {
        return this._title;
    }

    // setting title
    public void setTitle(String title) {
        this._title = title;
    }

    // getting caption
    public String getCaption() {
        return this._title;
    }

    // setting caption
    public void setCaption(String caption) {
        this._title = caption;
    }

Perhaps a trained eye can spot where I am going wrong, I not receiving any errors, just that the image is not being added to database table. Any help would be greatly appreciated.

mcclosa
  • 943
  • 7
  • 29
  • 59

2 Answers2

0

Store image as byte array in the db. Please check the example here. This might help you.

Raghu Nagaraju
  • 3,278
  • 1
  • 18
  • 25
  • My apologies, I am very new to this, a lot of what I have already done has gone over my head but I assumed that this line of code was storing the image as a byte array `ByteArrayOutputStream stream = new ByteArrayOutputStream();` In your example, are you referencing creating the Utility class? – mcclosa Apr 07 '16 at 03:18
0

You should save your images in a folder and save their paths in you db . If you want your images to be protected and don't wanna show them in gallery as well then there are some ways like using .nomedia files or you can save your images in private folder which will not be accessible to any other app rather than yours.

Adeel Turk
  • 897
  • 8
  • 23