Kanade Labo

かなで研究所

Android Studio カメラアプリ作成その15(画像ファイルに保存1)

こんにちは かなで です。

プレビューできたらそれを保存

着実に一歩ずつ進めていきます。

元ネタにしたサイトはこちら

https://developer.android.com/training/camerax/take-photo?hl=ja

ここからどんどん横道にそれていきますが、あくまで元ネタということで(笑

ではいきます。

まず最初に出てきたコードがこちらです。

val imageCapture = ImageCapture.Builder()
    .setTargetRotation(view.display.rotation)
    .build()

cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, imageCapture,
    imageAnalysis, preview)

相変わらず、どこに入れればいいのかわからないので、手探りでコピペしまくった結果、ここにしました↓

MainActivity.kt

入れたのが、こちら、「インポートできるものはインポートすべし」の精神でインポートできたのは、ImageCaptureだけでした。

次に、この部分について、学んだこととして、

ImageCaptureという関数を使っていて、そいつにsetTargetRotationという設定を入れている

という風に読んでよさそうです。

例えば…

↑これであれば、Previewという関数に「設定がない」

↑これであれば、CameraSelectorという関数に、requireLensFacingという設定をいれており、その中で「背面カメラを使う」という設定をしている という風な感じ。

↑ ImageCaptureの話に戻りますと、setTargetRotationで、回転(カメラの向き?)に関する設定を行っているようですが、viewの扱いがまだわかってなかったのと、これは設定しなくてもとりあえず進めるんじゃ?と思った結果、進めたので、コメントアウトしてみました。

        val imageCapture = ImageCapture.Builder()
            //.setTargetRotation(view.display.rotation)
            .build()

問題ビューに、問題は出ていなさそうなので、進めます。(たぶん後でなおさないといけない

次にこの2行に注目↓

        cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, imageCapture,
            imageAnalysis, preview)

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

追加したものは2行になってますが、これを1行に書き換えると…

↑こうなります。

これに同じ文字列にマーキングしてみますと

↑このようになりました。

元の記載が下、追加した記載が上。という前提で読んでいただければと思いますが…

一つずつ解決していくと…

まず「var camera =」これは、cameraProviderというもので得られた結果を「camera」という変数に格納するという事を指します。

ただ、問題ビューを見ると、この「camera」という変数はどこにも使ってないよ

という記載があることがわかります。

つまり、いまはあってもなくても一緒という風に考えます。

ただ、元ネタには入ってたという事を考え、追加分にも加えることにしました。↓

次は、「lifecycleOwner」について考えます。

元ネタには「this as LifecycleOwner」となっています。

「this as」の有無という違いがあるのと、Lifeが大文字で始まるか小文字で始まるかという違いがあります。

試しに「this as」を加えるだけにしても、問題ビューには残ったままでした。

Unresolved reference: lifecycleOwner

次に「this as」を削り「L」を大文字に変更したところ、違う問題ビューが表示されました。

Function invocation 'LifecycleOwner(…)' expected
No value passed for parameter 'function'

「this as」追加と「L」大文字の両方を変更したところ、問題は解決しました。

だいぶ似てきたと思います(笑

続けます。

残りの違いは、「imageCapture」と「imageAnalysis」の2つですが、「imageAnalysis」だけ赤字です。

少しさかのぼりますが、先ほどこんなものを登録しました。

画像に alt 属性が指定されていません。ファイル名: b04befba825beb100a5fc74f52869467.png

imageCaptureという変数を登録していますね。これによって「imageCapture」は赤字ではなくなっています。

これは「画像を保存するのに使うもの」らしいです。

じゃあ「imageAlanysis」って何?というと「画像を解析するのに使うもの」らしいです。

恐らく、笑顔度とかを解析してくれるものだと思いますが、一歩ずつ着実に行っておりまして、今はまだ「保存したいだけ」で解析は次の段階と考えています。

つまり、「imageAnalysis」は今はいらないではないかと考え、消してみても問題にはなりませんでした。(結果論)

結局、何が変わったかというと「imageCapture」が追加されただけという事になります。

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

        val cameraSelector : CameraSelector = CameraSelector.Builder()
            .requireLensFacing(CameraSelector.LENS_FACING_BACK)
            .build()
        val kanadeFinder: PreviewView = findViewById(R.id.viewFinder)
        preview.setSurfaceProvider(kanadeFinder.surfaceProvider)

        val imageCapture = ImageCapture.Builder()
            //.setTargetRotation(view.display.rotation)
            .build()

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

ここで一旦区切ります。

最後までお読みいただきありがとうございました。
気になることがあったら、コメント頂けると嬉しいです。
自主学習も兼ねて記事にするかもしれません。

-AndroidStudio