Android Tutorial : Membuat ImagePicker Dari Kamera Atau File Manager di Android

android osMalam ini saya istirahat sejenak dari kegiatan rutin nangkring di depan laptop dan akhirnya saya nangkring di kampus. Yaw agak malu sih, secara saya sudah lulus. Pernah kemarin saya nangkring di kampus, kemudian ada yang nyeletuk “Mas, masih betah aja di kampus??”. Haha, saya cuma bisa senyum-senyum. Ada juga yang lebih parah bilang begini, “Mas, jangan sering-sering wifi’an di kampus, bayar inet’nya mahal. (dengan nada guyon).” Saya malah tambah ngakak, mungkin yang ngomong begitu gak tau kisah saya dulu dengan kampus *halah. Kisah seminar nasional yang harusnya dibiayai kampus dan akhirnya saya yang harus bayar dengan uang sendiri. Yaw sekarang hitung-hitung saya nikmati kompensasi uang seminar yang tidak dibayarkan sama kampus ;). Mungkin ada pihak kampus yang tidak senang dengan tulisan saya yang ini? Monggo tidak usah dibaca yaw :p.

Ngomong-ngomong soal kerjaan saya yang beberapa waktu lalu menjadi “joki skripsi”, saya sempat menemui kasus tentang membuat image picker di android. Dulu saya pernah membuatnya, hanya saja sumber gambarnya langsung dari aplikasi file manager. Dan yang kemarin, sumber gambarnya ditambahkan dari kamera. Caranya cukup sederhana, mirip dengan membuat aplikasi kamera yang action-nya memanggil API camera di android. Untuk lokasi penyimpanan dan nama filenya bisa kita sesuaikan sendiri. Yuk ahh, kita langsung aja ke langkah-langkah pembuatannya.

1. Seperti biasa, buat project android baru. Disini IDE nya saya menggunakan Eclipse ADT Bundle, dimana IDE Eclipse sudah id-bundling menjadi satu paket dengan SDK android terbaru beserta ADT-nya.

2. Buka file activity_main.xml yang ada di folder layout. Kita akan membuat sebuah Button dan sebuah ImageView. Ketikkan kode layout di bawah ini :

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="10dp"
    tools:context=".MainActivity" >

	<Button
		android:id="@+id/btn_pilih"
		android:text="Pilih Gambar"
		android:layout_width="fill_parent"
		android:layout_height="wrap_content"
		android:layout_marginTop="10dp"/>

	<ImageView
		android:id="@+id/img_set"
		android:layout_width="wrap_content"
		android:layout_height="wrap_content"
		android:layout_marginTop="10dp"/>
</RelativeLayout>

3. Selanjutnya buka file MainActivity.java, kita akan mulai melantunkan coding java disini, haha..

package dlmbg.pckg.image.picker.anroid;

import java.io.File;

import android.app.Activity;
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.os.Environment;
import android.provider.MediaStore;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

/*
* Gede Lumbung - 2013
* http://gedelumbung.com
* Simple Image Picker from SD Card and Camera
*/

public class MainActivity extends Activity {

	private Uri UrlGambar;
	private ImageView SetImageView;

	private static final int CAMERA = 1;
	private static final int FILE = 2;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        final String [] pilih			= new String [] {"Camera", "SD Card"};
		ArrayAdapter<String> arr_adapter	= new ArrayAdapter<String> (this, android.R.layout.select_dialog_item,pilih);
		AlertDialog.Builder builder		= new AlertDialog.Builder(this);

		builder.setTitle("Pilih Gambar");
		builder.setAdapter( arr_adapter, new DialogInterface.OnClickListener()
		{
			public void onClick( DialogInterface dialog, int pilihan )
			{
				if (pilihan == 0)
				{
					Intent intent 	 = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
					File file		 = new File(Environment.getExternalStorageDirectory(),
							   			"image_picker/img_" + String.valueOf(System.currentTimeMillis()) + ".jpg");
					UrlGambar = Uri.fromFile(file);

					try {
						intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, UrlGambar);
						intent.putExtra("return-data", true);

						startActivityForResult(intent, CAMERA);
					} catch (Exception e) {
						e.printStackTrace();
					}

					dialog.cancel();
				}
				else if(pilihan == 1)
				{
					Intent intent = new Intent();

	                intent.setType("image/*");
	                intent.setAction(Intent.ACTION_GET_CONTENT);

	                startActivityForResult(Intent.createChooser(intent, "Pilih Aplikasi"), FILE);
				}
			}
		} );

		final AlertDialog dialog = builder.create();

		SetImageView = (ImageView) findViewById(R.id.img_set);

		Button tmb_pilih = (Button) findViewById(R.id.btn_pilih);
		tmb_pilih.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				dialog.show();
			}
		});
    }

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

		Bitmap bitmap 	= null;
		String path		= "";

		if (requestCode == FILE)
		{
			UrlGambar = data.getData();
			path = getRealPath(UrlGambar);

			if (path == null)
			{
				path = UrlGambar.getPath();
			}
			else
			{
				bitmap 	= BitmapFactory.decodeFile(path);
			}
		}
		else
		{
			path	= UrlGambar.getPath();
			bitmap  = BitmapFactory.decodeFile(path);
		}

		Toast.makeText(this, path,Toast.LENGTH_SHORT).show();
		SetImageView.setImageBitmap(bitmap);
	}

    public String getRealPath(Uri contentUri)
    {
        String path = null;
        String[] images_data = { MediaStore.Images.Media.DATA };
        Cursor cursor = getContentResolver().query(contentUri, images_data, null, null, null);
        if(cursor.moveToFirst())
        {
           int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
           path = cursor.getString(column_index);
        }
        cursor.close();
        return path;
    }
}

Disini skenarionya, ketika kita melakukkan tapping pada tombol, maka akan muncul sebuah dialogbox yang berisikan 2 pilihan yaitu mengambil data dengan sumber dari kamera atau SD Card. Jika memilih kamera, maka akan memanggil Intent untuk API Camera. Setelah kita mengambil gambar, maka gambar akan disimpan di direktori yang sudah kita tentukan pada kode di atas. Secara otomatis aplikasi akan membuatkan folder jika folder belum ada di dalam SD Card/memory. Dengan menggunakan fungsi onActivityResult(), akan dipanggil lokasi/path dari gambar yang baru saja disimpan.

Begitu juga jika memilih sumber gambar dari SD Card, path/lokasi yang dikembalikan langsung berupa alamat dari gambar tersebut. Jadi sumber gambar yang dipasang di ImageView adalah alamat gambar asli dari yang dipilih tadi.

4. Nah, berhubung aplikasi sering force close karena berubahnya orientasi layar (yang dari saat pengambilan gambar menggunakan mode landascape dan setelah selesai mengambil gambar kembali ke mode portrait), maka saya mengakalinya dengan mengatur activity pada AndroidManifest.xml hanya bisa dijalankan dalam mode portrait 😀

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="dlmbg.pckg.image.picker.anroid"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="16" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="dlmbg.pckg.image.picker.anroid.MainActivity"
            android:label="@string/app_name"
            android:configChanges="orientation"
            android:screenOrientation="portrait" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

Saya mencobanya langsung pada hape android saya, dan hasilnya seperti di bawah ini :

OK deh, sekian dulu postingan iseng saya malam ini. Mungkin di lain waktu saya akan menambahkan fitur cropping untuk gambarnya. Semoga bisa bermanfaat untuk rekan yang sedang mencari refrensi tentang Image Picker di android.

[to_like]Download Aplikasi[/to_like]

6 comments

  1. Dhani Reply

    Makasiii bli gede..
    Pas banget nii buat program butuh yang kayak gini..

    Ajarin buat ngedit foto yang udah di pick dong.. 😀

  2. indra Reply

    kak gimana cara belajar programing biar cepat ngerti
    khusunsnya dalam pembuatan aplikasi android ini
    tolong kasih tau basic basic nya dong kak

  3. septian Reply

    mas aku bisa contact2.. pengen bantuannya buat bikin aplikasi android.. mohon balasannya via email ya nuhun

  4. fahmi Reply

    wah bagus banget gan sudah saya coba gan tapi untuk save belum bisa ya gan?

  5. Arie Reply

    Kok ga bisa min? Udah saya ketik ulang dan saya perhatikan dengan detail instruksi admin. Saat mengambil gambar dari galery ga muncul apa apa pada program. Apa saya yang salah tapi mohon bantuannya, trims sebelumnya telah berbagi informasi