Capture Image From Camera and Select Image From Gallery of Android Phone Using Android Studio

Introduction

This article explains how to open the gallery in your phone and display the selected images, capture a photo from the camera and save it to the gallery of your Android phone.

First the user will need to choose if he/she wants to select an image from the gallery or wants to capture an image from the camera. Then depending on the option chosen by the user,  we will either open the gallery or capture an image. 

Step 1:

Open "AndroidManifest" and add the following code to it: 

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

    package="com.chhavi.uploadingandviewimage"

    android:versionCode="1"

    android:versionName="1.0" >

 

  <uses-permission android:name="android.permission.CAMERA" />

  <uses-feature android:name="android.hardware.camera" />

  <uses-feature android:name="android.hardware.camera.autofocus" />

  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

 

  <uses-sdk

      android:minSdkVersion="7"

      android:targetSdkVersion="16" />

 

  <application

      android:allowBackup="true"

      android:icon="@drawable/ic_launcher"

      android:label="@string/app_name"

      android:theme="@style/AppTheme" >

    <activity

        android:name="com.chhavi.uploadingandviewimage.MainActivity"

        android:label="@string/app_name" >

      <intent-filter>

        <action android:name="android.intent.action.MAIN" />

 

        <category android:name="android.intent.category.LAUNCHER" />

      </intent-filter>

    </activity>

  </application>

</manifest> 

Note the permission "WRITE_EXTERNAL_STORAGE" is to save the image captured to the gallery. "CAMERA" permissions enables use of the camera of your Android phone.

Step 2:

Open "activity_main" and add the following code to it:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

              xmlns:tools="http://schemas.android.com/tools"

              android:id="@+id/LinearLayout1"

              android:layout_width="match_parent"

              android:layout_height="match_parent"

              android:orientation="vertical"

              android:padding="10dp" >

 

  <LinearLayout

          android:layout_width="match_parent"

          android:layout_height="wrap_content"

          android:gravity="center"

          android:padding="5dp" >

 

    <Button

            android:id="@+id/btnSelectPhoto"

            android:layout_width="match_parent"

            android:layout_height="wrap_content"

            android:text="Select Photo" />

 

  </LinearLayout>

 

  <LinearLayout

          android:layout_width="match_parent"

          android:layout_height="match_parent"

          android:orientation="vertical"

          android:padding="10dp" >

 

    <ImageView

            android:id="@+id/viewImage"

            android:layout_width="match_parent"

            android:layout_height="wrap_content"

            android:src="@drawable/camera" />

 

  </LinearLayout>

 

</LinearLayout> 

The layout looks like:

im1.jpg

 Later the selected image will be displayed in the ImageView.

Step 3:

Open "MainActivity" and add the following code to it: 

package com.chhavi.uploadingandviewimage;

 

import android.app.AlertDialog;

import android.content.DialogInterface;

import android.content.Intent;

import android.database.Cursor;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.net.Uri;

import android.os.Bundle;

import android.app.Activity;

import android.os.Environment;

import android.provider.MediaStore;

import android.util.Log;

import android.view.Menu;

import android.view.View;

import android.widget.Button;

import android.widget.ImageView;

import java.io.File;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.OutputStream;

 

public class MainActivity extends Activity {

 

    ImageView viewImage;

    Button b;

 

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        b=(Button)findViewById(R.id.btnSelectPhoto);

        viewImage=(ImageView)findViewById(R.id.viewImage);

        b.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View v) {

                selectImage();

            }

        });

    }

 

    @Override

    public boolean onCreateOptionsMenu(Menu menu) {

        // Inflate the menu; this adds options to the action bar if it is present.

        getMenuInflater().inflate(R.menu.main, menu);

        return true;

    }

 

      private void selectImage() {

 

        final CharSequence[] options = { "Take Photo", "Choose from Gallery","Cancel" };

 

        AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);

        builder.setTitle("Add Photo!");

        builder.setItems(options, new DialogInterface.OnClickListener() {

            @Override

            public void onClick(DialogInterface dialog, int item) {

                if (options[item].equals("Take Photo"))

                {

                    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

                    File f = new File(android.os.Environment.getExternalStorageDirectory(), "temp.jpg");

                    intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f));

                    startActivityForResult(intent, 1);

                }

                else if (options[item].equals("Choose from Gallery"))

                {

                    Intent intent = new   Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);

                    startActivityForResult(intent, 2);

 

                }

                else if (options[item].equals("Cancel")) {

                    dialog.dismiss();

                }

            }

        });

        builder.show();

    }

 

    @Override

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

        super.onActivityResult(requestCode, resultCode, data);

        if (resultCode == RESULT_OK) {

            if (requestCode == 1) {

                File f = new File(Environment.getExternalStorageDirectory().toString());

                for (File temp : f.listFiles()) {

                    if (temp.getName().equals("temp.jpg")) {

                        f = temp;

                        break;

                    }

                }

                try {

                    Bitmap bitmap;

                    BitmapFactory.Options bitmapOptions = new BitmapFactory.Options();

 

                    bitmap = BitmapFactory.decodeFile(f.getAbsolutePath(),

                            bitmapOptions); 

                   

                    viewImage.setImageBitmap(bitmap);

 

                    String path = android.os.Environment

                            .getExternalStorageDirectory()

                            + File.separator

                            + "Phoenix" + File.separator + "default";

                    f.delete();

                    OutputStream outFile = null;

                    File file = new File(path, String.valueOf(System.currentTimeMillis()) + ".jpg");

                    try {

                        outFile = new FileOutputStream(file);

                        bitmap.compress(Bitmap.CompressFormat.JPEG, 85, outFile);

                        outFile.flush();

                        outFile.close();

                    } catch (FileNotFoundException e) {

                        e.printStackTrace();

                    } catch (IOException e) {

                        e.printStackTrace();

                    } catch (Exception e) {

                        e.printStackTrace();

                    }

                } catch (Exception e) {

                    e.printStackTrace();

                }

            } else if (requestCode == 2) {

 

                Uri selectedImage = data.getData();

                String[] filePath = { MediaStore.Images.Media.DATA };

                Cursor c = getContentResolver().query(selectedImage,filePath, null, null, null);

                c.moveToFirst();

                int columnIndex = c.getColumnIndex(filePath[0]);

                String picturePath = c.getString(columnIndex);

                c.close();

                Bitmap thumbnail = (BitmapFactory.decodeFile(picturePath));

                Log.w("path of image from gallery......******************.........", picturePath+"");

                viewImage.setImageBitmap(thumbnail);

            }

        }

    }   

}

 

In the code above, "AlertDialog" will create a pop-up dialog box that will ask the user to choose "Take Photo", in other words capture an image from the camera or "Choose from Gallery" or "Cancel". Note that in both "Choose from Gallery" and "Take Photo", you can add any code in "startActivityForResult".

Output snapshots:

Run the application on an Android phone.

The first screen looks like:

im2f.png

Clicking on the button "Select Photo" you will get the alert dialog box like:

im3f.png

Selecting "Take photo" will open your camera.

im4f.png

After clicking the photo, you can discard it or save it by selecting the tick mark:

im5f.png

Finally the image clicked will be displayed in the ImageView.

im8f.png

Selecting "Choose from Gallery" will open your gallery (note that the image captured earlier has been added to the phone gallery).

im6f.jpg

Selecting an image from these albums will be displayed in the ImageView like:

im7f.png

 Thank you... Enjoy coding :)