AndroidのカメラサポートライブラリのCameraXを使ってみました

Androidのカメラ制御は
カメラが対応している解像度の取得や
プレビュー解像度の設定、画面回転など
いくつか面倒なステップを踏む必要がありますが
それらを吸収してくれる公式ライブラリがCameraXです。

ライブラリの使用方法はGoogleのCameraXのドキュメントに記載されていますが、
実際に動かしてみたコードを以下に記載します。
MainActivityにカメラプレビューを表示するだけの機能を持つアプリです。

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.camera.core.CameraSelector
import androidx.camera.core.Preview
import androidx.camera.lifecycle.ProcessCameraProvider
import androidx.camera.view.PreviewView
import androidx.core.content.ContextCompat
import androidx.lifecycle.LifecycleOwner
import com.google.common.util.concurrent.ListenableFuture

class MainActivity : AppCompatActivity() {
    private lateinit var cameraProviderFuture: ListenableFuture<ProcessCameraProvider>
    private lateinit var previewView : PreviewView
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // PreviewView
        previewView = findViewById(R.id.cameraPreview)

        // CameraProvider リクエスト
        cameraProviderFuture = ProcessCameraProvider.getInstance(this)

        // タスクを実行するエグゼキューター
        val executor = ContextCompat.getMainExecutor(this)

        // リスナー用タスク
        val listenerRunnable = Runnable {
            // ListenableFutureからCameraProviderを取得
            val cameraProvider = cameraProviderFuture.get()
            // ライフサイクルにバインド -カメラの指定とプレビューの設定も行う
            bindToLifecycle(cameraProvider)
        }

        // CameraProvider リクエスト のリスナーをセット
        cameraProviderFuture.addListener(listenerRunnable, executor)
    }

    private fun bindToLifecycle(cameraProvider: ProcessCameraProvider)
    {
        // Previewを作成
        val preview : Preview = Preview.Builder().build()
        // 背面カメラを選択
        val cameraSelector : CameraSelector = CameraSelector.Builder()
            .requireLensFacing(CameraSelector.LENS_FACING_BACK)
            .build()
        // Previewとレイアウト上のPreviewViewを接続
        preview.setSurfaceProvider(previewView.surfaceProvider)

        // CameraProvider をライフサイクルにバインド
        val camera = cameraProvider.bindToLifecycle(this as LifecycleOwner, cameraSelector, preview)
    }
}

Kotlinで書いているのもありますが、
ライブラリを使用しない時と比べて、ぐっと必要なコード量が減っています。

画像の撮影や、画像分析もライブラリに含まれているようです。

水曜担当:Tanaka



アプリ関連ニュース

お問い合わせはこちら

お問い合わせ・ご相談はお電話、またはお問い合わせフォームよりお受け付けいたしております。

tel. 06-6454-8833(平日 10:00~17:00)

お問い合わせフォーム