RSS

Menggunakan Native Camera

22 Jun

Halo semua, pengen buat tutorial yang agak advance lagi neh.. Jadi sekarang, gw pingin buat gimana sih cara nya menggunakan native camera di Android. Native camera itu dimana kita bisa menggunakan camera dari aplikasi kita. Pernah lihat donk misal kita mau share gambar di Facebook misalnya, kita bisa langsung take picture. Jadi ini tutorialnya,

Oke, langsung aja, jadi disini bakal bikin app sederhana, dimana akan ada tombol take picture, dan setelah kita ambil gambar pake kamera, bakal kita tampilin di sebuah ImageView.

jadi pertama-tama, kita buat dulu tampilan sederhana yang isinya Button dan ImageView:

main.xml:


<?xml version="1.0" encoding="utf-8"?>

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

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

>

<Button

android:id="@+id/btn_takePicture"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="Take Picture"

/>

<ImageView

android:id="@+id/img_picture"

android:layout_width="wrap_content"

android:layout_height="wrap_content" />

</LinearLayout>

nah, setelah itu, kita bakal bikin coding java nya.. Ehem2, jadi ini java nya bakal agak panjang, disimak aja, code nya seperti di bawah ini:

package com.daniel.nativeCamera;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import android.app.Activity;
import android.content.ContentResolver;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

public class main extends Activity {
    /** Called when the activity is first created. */
    private Button take;
    private ImageView image;
    private Uri mImageCaptureUri;
    private Bitmap bitmap;

	@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        take = (Button) findViewById(R.id.btn_takePicture);
        image = (ImageView) findViewById(R.id.img_picture);

        take.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				File file = null;
				try {
					file = new File(Environment.getExternalStorageDirectory(),String.valueOf(System.currentTimeMillis())+".jpg");
				} catch (Exception e) {
					// TODO: handle exception
				}
				mImageCaptureUri = Uri.fromFile(file);
		    	Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
		    	i.putExtra(MediaStore.EXTRA_OUTPUT, mImageCaptureUri);
		    	startActivityForResult(i, 1);
			}
		});
    }

	@Override
	public void onActivityResult(int requestCode, int resultCode, Intent returnIntent)
	{
		super.onActivityResult(requestCode, resultCode, returnIntent);
		switch(requestCode)
		{
		case 1:
    		Uri selectedImage = null;
    		//selectedImage = data.getData();
   			//bitmap = (Bitmap)data.getExtras().get("data");
   			selectedImage = mImageCaptureUri;
   		    ContentResolver cr = getContentResolver();
    		try {
    			bitmap = android.provider.MediaStore.Images.Media.getBitmap(cr, selectedImage);
    		} catch (FileNotFoundException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (Exception e) {
    			// TODO: handle exception
    			e.printStackTrace();
    		}
    				//Uri selectedImage = mImageCaptureUri

    		if(bitmap == null){
    			Toast.makeText(main.this, "Image error, please try again", Toast.LENGTH_LONG).show();
    			break;
    		}

    		ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    		bitmap.compress(Bitmap.CompressFormat.JPEG, 80, bytes);
    		String nuFile = "new_"+System.currentTimeMillis()+".jpg";
    		File files = new File(Environment.getExternalStorageDirectory()+File.separator+nuFile);
    		try {
    			files.createNewFile();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		if (files.exists()) {
    			FileOutputStream fo = null;
    			try {
    				fo = new FileOutputStream(files);
    			} catch (FileNotFoundException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    	    	try {
    				fo.write(bytes.toByteArray());
    			} catch (IOException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		}
    		String pn = files.toString();
        	//setFilePath(pn);
        	Toast.makeText(main.this, "path:"+pn, Toast.LENGTH_LONG).show();
        	Drawable picture = new BitmapDrawable(pn);
        			//img.setImageDrawable(image);
	    	image.setVisibility(ImageView.VISIBLE);
	    	image.setImageDrawable(picture);
        	bitmap.recycle();
    	break;
		}
	}
}

nah, gw jelasin, jadi di onClick nya button, kita akan memanggil Intent untuk memanggil camera. Jadi pertama-tama kita buat file kosong terlebih dahulu yang nantinya akan menjadi file Image. Lalu di kasus ini, file nya bakal gw beri nama sesuai TimeMillis alias penanda waktu dalam milisecond. Kenapa begitu? Karena dengan begitu nama file akan jadi berbeda setiap kali kita mengambil foto, ini akan diperlukan apabila kita menggunakan ini dalam aplikasi yang akan kita publish nantinya. setelah itu kita passing path nya agar camera melakukan save picture pada path yang telah kita tentukan tadi.

Humm, sampe sini harusnya masih mudah.. hahaha

Oke, lalu, kita buat fungsi untuk Override onActivityResult. Jadi onActivityResult ini adalah fungsi yang akan dijalankan saat ada Intent kembalian dari Activity lain. Tadi di fungsi sebelumnya, kita memanggil fungsi startActivityForResult, nah, jika activity yang kita panggil (dalam hal ini camera) telah selesai, maka ia akan memberikan result dan kembali ke Activity ini. Pada saat itulah fungsi onActivityResult ini akan dijalankan.

Di dalamnya kita akan mengecek requestCode dengan fungsi switch. requestCode ini akan sesuai dengan yang kita kirimkan pada saat startActivityForResult tadi. karena kita tadi memanggil startActivityForResult(i, 1), maka hasil requestCode akan menghasilkan 1 juga, requestCode ini berguna bila kita melakukan navigasi ke banyak page nantinya.

Oke, sekarang kita pindah ke coding dalam case 1:,, jadi gw jelasin berdasar pengertian gw dulu ya, kalo ada yang ga ngerti ntar silakan comment aja..^^
Jadi pertama kita ambil dulu bitmap dari file nya pakai fungsi bitmap = android.provider.MediaStore.Images.Media.getBitmap(cr, selectedImage); setelah itu kita cek apakah bitmap tersebut kosong atau tidak. Ini diperlukan untuk mengecek apakah user mengambil foto atau tidak (menekan tombol back atau cancel).

setelah itu, kita akan kompress bitmapnya.. Kompress ini diperlukan untuk kedepannya agar ukuran bitmap menjadi kecil sehingga mudah untuk dikirim. sintax untuk kompress nya adalah bitmap.compress(Bitmap.CompressFormat.JPEG, 80, bytes); angka 80 ini adalah presentasi kualitas dari aslinya, jadi max adalah 100, dan semakin kecil nilai berarti semakin jelek dan ukuran file semakin kecil. Setelah itu kita buat file baru, dengan nama “new_time millisecond”, sintax nya adalah files = new File(Environment.getExternalStorageDirectory()+File.separator+nuFile);

Nah uda de, setelah itu baru Bitmap yang baru tadi kita convert menjadi Drawable, trus kita tampilin di ImageView yang uda kita buat tadi.. Beres deh.. ^^

Huff, mungkin emang agak berat, tapi silakan mencoba untuk dimengerti.. hehe. Sekian dulu ya tutorialnya,
Terima Kasih..

Advertisements
 
8 Comments

Posted by on June 22, 2011 in Tutorial Advance

 

Tags: ,

8 responses to “Menggunakan Native Camera

  1. Amri Shodiq

    July 2, 2011 at 4:25 am

    Ini kok di saya gak jalan ya di simulator mas? Padahal touch path: sebenarnya udah muncul mas. Tapi image view-nya tetep gak nampil.

     
  2. toni

    July 11, 2011 at 4:18 am

    mantap, thx pak daniel

     
  3. awang

    July 12, 2011 at 10:23 am

    Om kenapa saya coba aplikasi tersebut ketika di click button ambil gambar ko malah…keluar pesan :
    sorry :
    the application Camera process.com.android.camera) has stopped unexpectelly.
    Please try again.

     
    • Daniel Hace

      July 12, 2011 at 10:34 am

      Terimakasih awang..
      Itu kamu mencoba aplikasi nya di emulator atau di ponsel??
      Kalau di emulator memang tidak bisa, untuk aplikasi ini harus dicoba di ponsel.
      trus coba tambahkan di manifest:

      pada dalam tag tapi diluar tag ..
      ^^

       
  4. doctor

    July 13, 2011 at 9:52 pm

    malem mas, mw nanya ni. klo foto nya mw di upload ke facebook gimana ya? saya udah ada script facebooknya, tapi belom ada script buat upload foto yang udah tampil di imageview buaat di upload ke facebook. mohon bantuannya mas.

     
  5. doctor

    July 15, 2011 at 1:34 am

    oh begitu ya mas. saya coba dulu mas.hehe.
    thanks banget ni mas.

     

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

 
%d bloggers like this: