Anda di halaman 1dari 8

API Camera

Framework Android mencakup dukungan untuk berbagai kamera dan fitur kamera yang
tersedia di perangkat, yang memungkinkan Anda untuk mengambil gambar dan video di
aplikasi. Dokumen ini membahas pendekatan cepat dan sederhana untuk pengambilan gambar
dan video, serta menguraikan pendekatan lanjutan untuk menciptakan pengalaman kamera
kustom bagi pengguna Anda.

Pertimbangan
Sebelum mengaktifkan aplikasi untuk menggunakan kamera pada perangkat Android, Anda
harus mempertimbangkan beberapa pertanyaan tentang bagaimana aplikasi Anda bermaksud
menggunakan fitur hardware ini.
• Persyaratan Kamera - Apakah penggunaan kamera begitu penting untuk aplikasi Anda
sehingga tidak ingin aplikasi Anda diinstal pada perangkat yang tidak memiliki kamera?
Jika demikian, Anda harus mendeklarasikan persyaratan kamera dalam manifes Anda.
• Gambar Cepat atau Kamera Kustom - Bagaimana aplikasi Anda menggunakan kamera?
Apakah Anda hanya tertarik untuk mengambil gambar cepat atau klip video, atau apakah
aplikasi Anda akan menyediakan cara baru untuk menggunakan kamera? Untuk
mendapatkan klip atau jepretan cepat, pertimbangkan Menggunakan Aplikasi Kamera
yang Ada. Untuk mengembangkan fitur kamera kustom, lihat bagian Membuat Aplikasi
Kamera.
• Persyaratan Layanan Latar Depan - Kapan aplikasi Anda berinteraksi dengan kamera?
Di Android 9 (API level 28) dan yang lebih baru, aplikasi yang berjalan di latar belakang
tidak dapat mengakses kamera. Karena itu, Anda harus menggunakan kamera saat
aplikasi berada di latar depan atau sebagai bagian dari layanan latar depan layanan latar
depan.
• Penyimpanan - Apakah gambar atau video yang dihasilkan aplikasi Anda dimaksudkan
hanya dapat dilihat oleh aplikasi Anda, atau dibagikan sehingga aplikasi lain seperti
Galeri atau media dan aplikasi sosial lainnya dapat menggunakannya? Apakah Anda
ingin gambar dan video tersedia bahkan jika aplikasi Anda dihapus? Lihat Menyimpan
File Media untuk mengetahui cara menerapkan opsi ini.

Dasar-dasar
Framework Android mendukung pengambilan gambar dan video melalui
android.hardware.camera2 API atau Intentkamera. Berikut adalah class yang relevan:
android.hardware.camera2
Paket ini adalah API utama untuk mengontrol kamera perangkat. Dapat digunakan untuk
mengambil gambar atau video saat membuat aplikasi kamera.
Camera
Class ini adalah API lebih lama yang tidak digunakan lagi untuk mengontrol kamera perangkat.
SurfaceView
Class ini digunakan untuk menyajikan pratinjau kamera langsung kepada pengguna.
MediaRecorder
Class ini digunakan untuk merekam video dari kamera.
Intent
Jenis tindakan intent MediaStore.ACTION_IMAGE_CAPTURE atau
MediaStore.ACTION_VIDEO_CAPTURE dapat digunakan untuk mengambil gambar atau
video tanpa langsung menggunakan objek Camera.

Membuat aplikasi kamera


Beberapa developer mungkin memerlukan antarmuka pengguna kamera yang disesuaikan
dengan tampilan aplikasi mereka atau menyediakan fitur khusus. Menulis kode pengambilan
gambar Anda sendiri dapat memberikan pengalaman yang lebih menarik bagi pengguna Anda.

Langkah umum untuk membuat antarmuka kamera kustom bagi aplikasi Anda adalah sebagai
berikut:
• Mendeteksi dan Mengakses Kamera - Buat kode untuk meminta akses dan memeriksa
keberadaan kamera.
• Membuat Class Pratinjau - Buat class pratinjau kamera yang memperluas SurfaceView
dan mengimplementasikan antarmuka SurfaceHolder. Class ini mempratinjau gambar
langsung dari kamera.
• Membuat Tata Letak Pratinjau - Setelah memiliki class pratinjau kamera, buat tata letak
tampilan yang menggabungkan pratinjau dan kontrol antarmuka pengguna yang Anda
inginkan.
• Menyiapkan listener untuk Pengambilan - Hubungkan listener untuk kontrol antarmuka
Anda guna memulai pengambilan gambar atau video sebagai respons terhadap tindakan
pengguna, seperti menekan tombol.
• Mengambil dan Menyimpan File - Siapkan kode untuk mengambil gambar atau video
dan menyimpan hasilnya.
• Merilis Kamera - Setelah menggunakan kamera, aplikasi Anda harus merilisnya dengan
benar untuk digunakan oleh aplikasi lain.
CAMERA
Step 1 : Buat Activity Baru dengan nama CameraActivity Pada Project yang telah ada

Step 2 : Desain Layout activity_camera.xml


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
tools:context="CameraActivity" >

<ImageView
android:id="@+id/imagecamera"
android:layout_width="wrap_content"
android:layout_height="300dp"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_marginTop="10dp"
android:layout_marginStart="10dp"
android:layout_marginLeft="10dp"
android:layout_marginEnd="10dp"
android:layout_marginRight="10dp"
app:srcCompat="@android:drawable/ic_menu_camera" />

<Button
android:id="@+id/btncamera"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_above="@+id/btnView"
android:layout_below="@+id/imagecamera"
android:layout_marginTop="10dp"
android:background="@color/colorPrimary"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:text="Capture" />

<Button
android:id="@+id/btngaleri"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/btncamera"
android:layout_marginLeft="10dp"
android:layout_marginTop="10dp"
android:layout_marginRight="10dp"
android:background="@color/colorPrimary"
android:text="Galeri" />
</RelativeLayout>

Step 3 : Tambah izin menggunakan camera di AndroidManifest.xml


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

Step 4 : Code untuk CameraActivity.java


package com.dipanegara.erfan_152233;

import android.Manifest;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.provider.Settings;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import java.io.FileNotFoundException;
import java.io.InputStream;

public class CameraActivity extends AppCompatActivity {


public static final int MY_PERMISSIONS_REQUEST_CAMERA = 100;
public static final int MY_PERMISSIONS_REQUEST_GALERI = 200;
public static final String ALLOW_KEY = "ALLOWED";
public static final String CAMERA_PREF = "camera_pref";
ImageView imagecamera;
Button btncapture,btngaleri;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_camera);

imagecamera = findViewById(R.id.imagecamera);
btncapture = findViewById(R.id.btncamera);
btngaleri = findViewById(R.id.btngaleri);

btncapture.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
//intent khusus untuk menangkap foto lewat kamera
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, MY_PERMISSIONS_REQUEST_CAMERA);
}
});
btngaleri.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
//intent khusus untuk menangkap dari galery
Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
photoPickerIntent.setType("image/*");
startActivityForResult(photoPickerIntent,
MY_PERMISSIONS_REQUEST_GALERI);
}
});

//Izin Mengakses Camera


if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) !=
PackageManager.PERMISSION_GRANTED) {
if (getFromPref(this, ALLOW_KEY)) {
showSettingsAlert();
} else if
(ContextCompat.checkSelfPermission(this,Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) {
if
(ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.CAMER
A)) {
showAlert();
} else {
// No explanation needed, we can request the permission.
ActivityCompat.requestPermissions(this,new
String[]{Manifest.permission.CAMERA},MY_PERMISSIONS_REQUEST_CAMERA);
}
}
}
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case(MY_PERMISSIONS_REQUEST_CAMERA) :
if(resultCode == Activity.RESULT_OK)
{
// result code sama, save gambar ke bitmap
Bitmap bitmap;
bitmap = (Bitmap) data.getExtras().get("data");
imagecamera.setImageBitmap(bitmap);
}
break;
case(MY_PERMISSIONS_REQUEST_GALERI) :
if(resultCode == Activity.RESULT_OK)
{
try {
final Uri imageUri = data.getData();
final InputStream imageStream =
getContentResolver().openInputStream(imageUri);
final Bitmap selectedImage =
BitmapFactory.decodeStream(imageStream);
imagecamera.setImageBitmap(selectedImage);
} catch (FileNotFoundException e) {
e.printStackTrace();
Toast.makeText(getApplicationContext(), "Something went
wrong", Toast.LENGTH_LONG).show();
}
}
break;
}
}
public static void saveToPreferences(Context context, String key, Boolean
allowed) {
SharedPreferences myPrefs = context.getSharedPreferences(CAMERA_PREF,
Context.MODE_PRIVATE);
SharedPreferences.Editor prefsEditor = myPrefs.edit();
prefsEditor.putBoolean(key, allowed);
prefsEditor.commit();
}

public static Boolean getFromPref(Context context, String key) {


SharedPreferences myPrefs = context.getSharedPreferences(CAMERA_PREF,
Context.MODE_PRIVATE);
return (myPrefs.getBoolean(key, false));
}

private void showAlert() {


AlertDialog alertDialog = new
AlertDialog.Builder(CameraActivity.this).create();
alertDialog.setTitle("Alert");
alertDialog.setMessage("App needs to access the Camera.");

alertDialog.setButton(AlertDialog.BUTTON_NEGATIVE, "DONT ALLOW",


new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
finish();
}
});

alertDialog.setButton(AlertDialog.BUTTON_POSITIVE, "ALLOW",
new DialogInterface.OnClickListener() {

public void onClick(DialogInterface dialog, int which) {


dialog.dismiss();
ActivityCompat.requestPermissions(CameraActivity.this,
new String[]{Manifest.permission.CAMERA},
MY_PERMISSIONS_REQUEST_CAMERA);
}
});
alertDialog.show();
}

private void showSettingsAlert() {


AlertDialog alertDialog = new
AlertDialog.Builder(CameraActivity.this).create();
alertDialog.setTitle("Alert");
alertDialog.setMessage("App needs to access the Camera.");

alertDialog.setButton(AlertDialog.BUTTON_NEGATIVE, "DONT ALLOW",


new DialogInterface.OnClickListener() {

public void onClick(DialogInterface dialog, int which) {


dialog.dismiss();
//finish();
}
});

alertDialog.setButton(AlertDialog.BUTTON_POSITIVE, "SETTINGS",
new DialogInterface.OnClickListener() {

public void onClick(DialogInterface dialog, int which) {


dialog.dismiss();
startInstalledAppDetailsActivity(CameraActivity.this);
}
});

alertDialog.show();
}

@Override
public void onRequestPermissionsResult(int requestCode, String permissions[],
int[] grantResults) {
switch (requestCode) {
case MY_PERMISSIONS_REQUEST_CAMERA: {
for (int i = 0, len = permissions.length; i < len; i++) {
String permission = permissions[i];

if (grantResults[i] == PackageManager.PERMISSION_DENIED) {
boolean showRationale =

ActivityCompat.shouldShowRequestPermissionRationale(this, permission);

if (showRationale) {
showAlert();
} else if (!showRationale) {
saveToPreferences(CameraActivity.this,ALLOW_KEY, true);
}
}
}
}
}
}

@Override
protected void onResume() {
super.onResume();
}

public static void startInstalledAppDetailsActivity(final CameraActivity


context) {
if (context == null) {
return;
}

final Intent i = new Intent();


i.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
i.addCategory(Intent.CATEGORY_DEFAULT);
i.setData(Uri.parse("package:" + context.getPackageName()));
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
i.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
context.startActivity(i);
}
}
Hasil :

Capture image Using Camera :

Select image form Galery :

Anda mungkin juga menyukai