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)
相変わらず、どこに入れればいいのかわからないので、手探りでコピペしまくった結果、ここにしました↓
入れたのが、こちら、「インポートできるものはインポートすべし」の精神でインポートできたのは、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」だけ赤字です。
少しさかのぼりますが、先ほどこんなものを登録しました。
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) }
ここで一旦区切ります。
最後までお読みいただきありがとうございました。
気になることがあったら、コメント頂けると嬉しいです。
自主学習も兼ねて記事にするかもしれません。