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.
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
<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>
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;
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);
}
});
@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();
}
alertDialog.setButton(AlertDialog.BUTTON_POSITIVE, "ALLOW",
new DialogInterface.OnClickListener() {
alertDialog.setButton(AlertDialog.BUTTON_POSITIVE, "SETTINGS",
new DialogInterface.OnClickListener() {
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();
}