Akses Kamera Ponsel Android

By | August 30, 2021
94 Views

— Belajar Android – Hampir setiap ponsel android saat ini sudah mempunyai kamera dan bahkan sampai 3 kamera sekaligus. Nah kali ini kita akan belajar Akses Kamera Ponsel Android dan menampilkan hasilnya di Image View. Tutorial ini dibagi menjadi 2 yaitu akses kamera untuk menampilkan thumbnails dan menyimpan gambar pada galery.

Mulai dari AndroidManifest.xml

Akses Kamera Ponsel Android membutuhkan sebuah permission, sehingga kita perlu tambahkan kode berikut di AndroidManifest.xml

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

Main Activity

Akses Kamera Ponsel Android  yang akan kita buat sederhan saja yaitu hanya terdiri dari 1 Activity dengan layout/activity_main.xml sebagai berikut

isi kode xml sebagai berikut

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
        <Button
            android:id="@+id/ambil"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="ambil"/>
        <ImageView
            android:id="@+id/gambar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>
    </LinearLayout>
</LinearLayout>

Button kita akan gunakan untuk action listener ketika diklik oleh user

Button ambil_gambar = (Button) findViewById(R.id.ambil);
        ambil_gambar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
                startActivityForResult(intent, TAKE_PICTURE);
            }
        });

Kalian bisa melihat bahwa kita menggunakan Intent berupa IMAGE_CAPTURE serta melakukan input argument TAKE_PICTURE sebagai flag. Ketika user klik maka method startActivityForResult akan dipanggil

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(this.TAKE_PICTURE == requestCode && resultCode == RESULT_OK){
        Bitmap bitmap = (Bitmap) data.getExtras().get("data");
        ImageView img = (ImageView) findViewById(R.id.gambar);
        img.setImageBitmap(bitmap);
    }
}

Kode lengkapnya MainActivity.java yaitu

public class MainActivity extends AppCompatActivity  {
    private final int TAKE_PICTURE = 1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button ambil_gambar = (Button) findViewById(R.id.ambil);
        ambil_gambar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
                startActivityForResult(intent, TAKE_PICTURE);
            }
        });
    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(this.TAKE_PICTURE == requestCode && resultCode == RESULT_OK){
            Bitmap bitmap = (Bitmap) data.getExtras().get("data");
            ImageView img = (ImageView) findViewById(R.id.gambar);
            img.setImageBitmap(bitmap);
        }
    }
    @Override protected void onResume() {
        super.onResume();
    }
    @Override protected void onPause() {
        super.onPause();
    }
    @Override protected void onDestroy() {
        super.onDestroy();
    }
}

hasil di run Akses Kamera Ponsel Android sebagai berikut

 

Mungkin kalian terheran, koq gambarnya kecil! yup emang betul itu adalah thumbnail Mengapa demikian? karena raw image ukurannya besar sehingga tidak efektif bila langsung ditampilkan dalam  memory RAM sehingga perlu disimpan dalam sebuah file! jadi harap maklum saj

get the full-sized image

Merujuk tutorial pada google developer take photos from camera https://developer.android.com/training/camera/photobasics mungkin akan sedikit membingungkan bagi pemula, tapi intinya adalah untuk mendapatkan full size image bukan thumbnail maka gambar tersebut harus ditulis/disimpan dalam bentuk file temporary. Jadi tambahkan permission berikut

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

Juga tambahkan kode berikut tepat dibawah setContentView(R.layout.activity_main) agar aplikasi nantinya menampilkan kotak dialog untuk minta ijin akses write storage

//TODO ask for permission of camera upon first launch of application
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (checkSelfPermission(Manifest.permission.CAMERA) == PackageManager.PERMISSION_DENIED ||
                    checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)  == PackageManager.PERMISSION_DENIED){
                String[] permission = {Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE};
                requestPermissions(permission, 111);
            }
        }

kalau tidak ditambahkan begitu, maka aplikasi kalian harus disetting manual di android setting ponsel untuk mengijinkan menulis file atau jika tidak maka Akses Kamera Ponsel Android akan ditolak dan mengirimkan sebuah message error berikut

java.lang.SecurityException: Permission Denial: writing com.android.providers.media.MediaProvider uri content://media/external/images/media from pid=26947, uid=10174 requires android.permission.WRITE_EXTERNAL_STORAGE, or grantUriPermission()

 

Kita buat Button satu lagi, untuk membedakan nya edit saja layoutnya menjadi berikut

 

<Button
    android:id="@+id/ambil2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:layout_alignParentBottom="true"
    android:text="ambil2"/>

Berhubung Intent Implicit (camera) secara default tidak bisa berkomunikasi lewat bundle, maka kita buat global variabel beserta flag untuk membedakan dengan yang sebelumnya

private final int TAKE_PICTURE2 = 2;
private Uri IMAGE_URI;

Kemudian buat method untuk memangil camera serta inisiasiasi IMAGE_URI, kalian bisa baca comment dibawah ini beserta penjelasannya

private void openCamera() {
    ContentValues values = new ContentValues();
    values.put(MediaStore.Images.Media.TITLE, "New Picture");
    values.put(MediaStore.Images.Media.DESCRIPTION, "From the Camera");
    IMAGE_URI = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
    Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

    //kasih tahu ke intent bahwa akan ambil gambar dengan kualitas tinggi dan harus disimpan dalam sebuah file
    //https://stackoverflow.com/questions/41841732/camera-intent-not-adding-extra
    /*
    The caller may pass an extra EXTRA_OUTPUT to control where this image will be written.
    If the EXTRA_OUTPUT is not present, then a small sized image is returned as a Bitmap object in the extra field.
    This is useful for applications that only need a small image.
    If the EXTRA_OUTPUT is present, then the full-sized image will be written to the Uri value of EXTRA_OUTPUT.
     */
    cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, IMAGE_URI);
    //System.out.println("MULKAN CAMERA:"+MediaStore.EXTRA_OUTPUT+image_uri.getPath());
    startActivityForResult(cameraIntent, TAKE_PICTURE2);
}

IMAGE_URI akan bersifat global dan hanya berisi URL /PATH temporary file, untuk mendapatkan Bitmapnya, kita akan buat method berikut

private Bitmap uriToBitmap(Uri selectedFileUri) {
    try {
        ParcelFileDescriptor parcelFileDescriptor =
                getContentResolver().openFileDescriptor(selectedFileUri, "r");
        FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor();
        Bitmap image = BitmapFactory.decodeFileDescriptor(fileDescriptor);

        parcelFileDescriptor.close();
        return image;
    } catch (IOException e) {
        e.printStackTrace();
    }
    return  null;
}

Tambahkan button dan action listenernya agar Akses Kamera Ponsel Android diaktifkan oleh openCamera()

Button ambil_gambar2 = (Button) findViewById(R.id.ambil2);
        ambil_gambar2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                openCamera();
            }
        });

Kita tambahkan berikut pada method startActivityForResult() agar Akses Kamera Ponsel Android secara otomatis picture tersebut disimpan di galery ponsel

if (requestCode == TAKE_PICTURE2 && resultCode == RESULT_OK){
    Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
    File f = new File(IMAGE_URI.getPath());
    Uri contentUri = Uri.fromFile(f);
    mediaScanIntent.setData(contentUri);
    this.sendBroadcast(mediaScanIntent);
    Bitmap bitmap = uriToBitmap(IMAGE_URI);
    ImageView img = (ImageView) findViewById(R.id.gambar);
    img.setImageBitmap(bitmap);
}

Kita langsung coba saja, maka gambar tersebut utuh dengan ukuran yang cukup besar yaitu 2.3 MB

 

gambar diatas akan tersimpan secara otomatis di gallery picture. Gimana menurut kalian mengenai tutorial Akses Kamera Ponsel Android! sangat mudah bukan

Leave a Reply

Your email address will not be published.




Enter Captcha Here :