미리보기 구현

앱에 미리보기를 추가하려면 PreviewView를 사용합니다. 자르고, 크기를 조정하고, 회전하여 적절히 표시할 수 있는 View입니다.

카메라가 활성화되면 이미지 미리보기가 PreviewView 내부 영역으로 스트리밍됩니다.

PreviewView 사용

PreviewView를 사용하여 CameraX 미리보기를 구현하려면 다음 단계를 따르세요. 단계에 관한 설명은 다음 섹션에 있습니다.

  1. 선택사항으로 CameraXConfig.Provider를 구성합니다.
  2. PreviewView를 레이아웃에 추가합니다.
  3. ProcessCameraProvider를 요청합니다.
  4. View를 만들 때 ProcessCameraProvider를 확인합니다.
  5. 카메라를 선택하고 수명 주기 및 사용 사례를 결합합니다.

PreviewView를 사용하는 데는 몇 가지 제한사항이 있습니다. PreviewView를 사용하는 경우 다음 작업을 할 수 없습니다.

  • SurfaceTexture를 만들어서 TextureViewPreview.SurfaceProvider에서 설정
  • TextureView에서 SurfaceTexture를 검색하여 Preview.SurfaceProvider에서 설정
  • SurfaceView에서 Surface를 가져와서 Preview.SurfaceProvider에서 설정

이러한 작업을 할 경우 PreviewPreviewView로 프레임을 스트리밍하는 것을 중지합니다.

[선택사항] CameraXConfig.Provider 구성

CameraX가 초기화되는 시점을 세밀하게 제어하려면 Application 클래스에서 CameraXConfig.Provider 인터페이스를 구현하면 됩니다. 대부분의 앱에는 이 같은 수준의 제어가 필요하지 않습니다.

Kotlin

import androidx.camera.camera2.Camera2Config
import androidx.camera.core.CameraXConfig

public class MyCameraXApplication : Application(),  CameraXConfig.Provider {
  override fun getCameraXConfig(): CameraXConfig {
    return Camera2Config.defaultConfig()
  }
}

자바

import androidx.camera.camera2.Camera2Config;
import androidx.camera.core.CameraXConfig;

public class MyCameraXApplication extends Application implements CameraXConfig.Provider {
    @NonNull
    @Override
    public CameraXConfig getCameraXConfig() {
        return Camera2Config.defaultConfig();
    }
}

PreviewView를 레이아웃에 추가

다음 샘플은 레이아웃의 PreviewView를 보여줍니다.

<FrameLayout
    android:id="@+id/container">
        <androidx.camera.view.PreviewView
            android:id="@+id/previewView" />
</FrameLayout>

CameraProvider 요청

다음 코드는 CameraProvider를 요청하는 방법을 보여줍니다.

Kotlin

import androidx.camera.lifecycle.ProcessCameraProvider
import com.google.common.util.concurrent.ListenableFuture

class MainActivity : AppCompatActivity() {
    private lateinit var cameraProviderFuture : ListenableFuture<ProcessCameraProvider>
    override fun onCreate(savedInstanceState: Bundle?) {
        cameraProviderFuture = ProcessCameraProvider.getInstance(this)
    }
}

자바

import androidx.camera.lifecycle.ProcessCameraProvider
import com.google.common.util.concurrent.ListenableFuture

public class MainActivity extends AppCompatActivity {
    private ListenableFuture<ProcessCameraProvider> cameraProviderFuture;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        cameraProviderFuture = ProcessCameraProvider.getInstance(this);
    }
}

CameraProvider 사용 가능 여부 확인

CameraProvider를 요청한 후에는 뷰를 만들 때 초기화에 성공했는지 확인합니다. 다음 코드는 이 작업의 진행 방법을 보여줍니다.

Kotlin

cameraProviderFuture.addListener(Runnable {
    val cameraProvider = cameraProviderFuture.get()
    bindPreview(cameraProvider)
}, ContextCompat.getMainExecutor(this))

자바

cameraProviderFuture.addListener(() -> {
    try {
        ProcessCameraProvider cameraProvider = cameraProviderFuture.get();
        bindPreview(cameraProvider);
    } catch (ExecutionException | InterruptedException e) {
        // No errors need to be handled for this Future.
        // This should never be reached.
    }
}, ContextCompat.getMainExecutor(this));

샘플에서 사용된 bindPreview 함수의 예는 다음 섹션에 제공된 코드를 참고하세요.

카메라 선택 및 수명 주기와 사용 사례 결합

CameraProvider를 만들고 확인한 후에는 다음 작업을 실행합니다.

  1. Preview를 만듭니다.
  2. 원하는 카메라 LensFacing 옵션을 지정합니다.
  3. 선택한 카메라와 사용 사례를 수명 주기에 결합합니다.
  4. PreviewPreviewView에 연결합니다.

다음 코드의 예제를 참조하세요.

Kotlin

fun bindPreview(cameraProvider : ProcessCameraProvider) {
    var preview : Preview = Preview.Builder()
            .build()

    var cameraSelector : CameraSelector = CameraSelector.Builder()
          .requireLensFacing(CameraSelector.LENS_FACING_BACK)
          .build()

    preview.setSurfaceProvider(previewView.getSurfaceProvider())

    var camera = cameraProvider.bindToLifecycle(this as LifecycleOwner, cameraSelector, preview)
}

자바

void bindPreview(@NonNull ProcessCameraProvider cameraProvider) {
    Preview preview = new Preview.Builder()
            .build();

    CameraSelector cameraSelector = new CameraSelector.Builder()
            .requireLensFacing(CameraSelector.LENS_FACING_BACK)
            .build();

    preview.setSurfaceProvider(previewView.getSurfaceProvider());

    Camera camera = cameraProvider.bindToLifecycle((LifecycleOwner)this, cameraSelector, preview);
}

이제 카메라 미리보기를 구현했습니다. 앱을 빌드하고 미리보기가 예상대로 앱에 표시되고 작동하는지 확인합니다.

추가 리소스

CameraX에 관해 자세히 알아보려면 다음 추가 리소스를 참조하세요.

Codelab

  • CameraX 시작하기
  • 코드 샘플

  • 공식 CameraX 샘플 앱