본문 바로가기
안드로이드 자바

[Android][Java] 카메라X 프리뷰 보여주기

by teamnova 2024. 1. 21.
728x90

1.CameraX 라이브러리 추가

dependencies {

    ...
    implementation 'androidx.camera:camera-core:1.0.0-rc04'
    implementation 'androidx.camera:camera-camera2:1.0.0-rc04' 
    implementation 'androidx.camera:camera-lifecycle:1.0.0-rc04' 
    implementation 'androidx.camera:camera-view:1.0.0-alpha23' 
}


2. activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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=".MainActivity">

    <androidx.camera.view.PreviewView
        android:id="@+id/previewView"
        android:layout_width="300dp"
        android:layout_height="300dp"
        android:layout_marginTop="10dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.497"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"></androidx.camera.view.PreviewView>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:orientation="horizontal"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/previewView">

        <Button
            android:id="@+id/startButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="Start" />

        <Button
            android:id="@+id/stopButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:layout_weight="1"
            android:text="Stop" />
    </LinearLayout>

</androidx.constraintlayout.widget.ConstraintLayout>


3. 카메라 권한추가

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.testnote">

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

    <application
      ...
    </application>

</manifest>


4.  MainActivity

import android.content.pm.PackageManager;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.camera.core.AspectRatio;
import androidx.camera.core.CameraSelector;
import androidx.camera.core.Preview;
import androidx.camera.lifecycle.ProcessCameraProvider;
import androidx.camera.view.PreviewView;
import androidx.core.app.ActivityCompat;
import java.util.concurrent.ExecutionException;


public class MainActivity extends AppCompatActivity {
    // 카메라 미리보기를 위한 뷰와 버튼 정의
    PreviewView previewView;
    Button startButton;
    Button stopButton;
    String TAG = "MainActivity";
    ProcessCameraProvider processCameraProvider;
    int lensFacing = CameraSelector.LENS_FACING_BACK; // 후면 카메라 사용

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main); // 메인 레이아웃 설정

        // 뷰 연결
        previewView = findViewById(R.id.previewView);
        startButton = findViewById(R.id.startButton);
        stopButton = findViewById(R.id.stopButton);

        // 카메라 권한 요청
        ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.CAMERA}, 1);

        // 카메라 프로바이더 초기화
        try {
            processCameraProvider = ProcessCameraProvider.getInstance(this).get();
        }
        catch (ExecutionException e) {
            e.printStackTrace();
        }
        catch (InterruptedException e) {
            e.printStackTrace();
        }

        // 시작 버튼 리스너: 카메라 미리보기 바인딩
        startButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (ActivityCompat.checkSelfPermission(MainActivity.this, android.Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {
                    bindPreview(); // 미리보기 시작
                }
            }
        });

        // 정지 버튼 리스너: 카메라 언바인딩
        stopButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                processCameraProvider.unbindAll(); // 미리보기 정지
            }
        });
    }

    // 카메라 미리보기 바인딩 메소드
    void bindPreview() {
        previewView.setScaleType(PreviewView.ScaleType.FIT_CENTER); // 미리보기 설정
        CameraSelector cameraSelector = new CameraSelector.Builder()
                .requireLensFacing(lensFacing) // 카메라 선택
                .build();
        Preview preview = new Preview.Builder()
                .setTargetAspectRatio(AspectRatio.RATIO_4_3) // 비율 설정
                .build();
        preview.setSurfaceProvider(previewView.getSurfaceProvider());

        processCameraProvider.bindToLifecycle(this, cameraSelector, preview); // 라이프사이클에 바인딩
    }

    @Override
    protected void onPause() {
        super.onPause();
        processCameraProvider.unbindAll(); // 앱 일시정지 시 카메라 언바인딩
    }
}