Android Studio カメラアプリ作成その15(画像ファイルに保存1)
こんにちは かなで です。
プレビューできたらそれを保存
着実に一歩ずつ進めていきます。
元ネタにしたサイトはこちら
https://developer.android.com/training/camerax/take-photo?hl=ja
ここからどんどん横道にそれていきますが、あくまで元ネタということで(笑
ではいきます。
![](https://kanalabo.net/wp-content/uploads/2021/10/b5901e7f2584ee6b80f4d8ee704d9a55.png)
まず最初に出てきたコードがこちらです。
val imageCapture = ImageCapture.Builder() .setTargetRotation(view.display.rotation) .build() cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, imageCapture, imageAnalysis, preview)
相変わらず、どこに入れればいいのかわからないので、手探りでコピペしまくった結果、ここにしました↓
![](https://kanalabo.net/wp-content/uploads/2021/10/a64d60e8385f3bebf67089f089d63f45.png)
![](https://kanalabo.net/wp-content/uploads/2021/10/4e81bed40d6e8b9f15024c22702c20c4.png)
入れたのが、こちら、「インポートできるものはインポートすべし」の精神でインポートできたのは、ImageCaptureだけでした。
![](https://kanalabo.net/wp-content/uploads/2021/10/d4388e6449151b612abf1980de2c5173.png)
次に、この部分について、学んだこととして、
ImageCaptureという関数を使っていて、そいつにsetTargetRotationという設定を入れている
という風に読んでよさそうです。
例えば…
![](https://kanalabo.net/wp-content/uploads/2021/10/008476845eebfcf28e98d0d918340888.png)
↑これであれば、Previewという関数に「設定がない」
![](https://kanalabo.net/wp-content/uploads/2021/10/f5a0b4e1bac893e8d0a243d1b3bfe9fd.png)
↑これであれば、CameraSelectorという関数に、requireLensFacingという設定をいれており、その中で「背面カメラを使う」という設定をしている という風な感じ。
![](https://kanalabo.net/wp-content/uploads/2021/10/747714c3bd2953492edcd3890bee4b4d.png)
↑ ImageCaptureの話に戻りますと、setTargetRotationで、回転(カメラの向き?)に関する設定を行っているようですが、viewの扱いがまだわかってなかったのと、これは設定しなくてもとりあえず進めるんじゃ?と思った結果、進めたので、コメントアウトしてみました。
![](https://kanalabo.net/wp-content/uploads/2021/10/b04befba825beb100a5fc74f52869467.png)
val imageCapture = ImageCapture.Builder() //.setTargetRotation(view.display.rotation) .build()
問題ビューに、問題は出ていなさそうなので、進めます。(たぶん後でなおさないといけない
次にこの2行に注目↓
![](https://kanalabo.net/wp-content/uploads/2021/10/612f5704f8e4f0b3bb130395147a4ff0.png)
cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, imageCapture, imageAnalysis, preview) var camera = cameraProvider.bindToLifecycle(this as LifecycleOwner, cameraSelector, preview)
追加したものは2行になってますが、これを1行に書き換えると…
![](https://kanalabo.net/wp-content/uploads/2021/10/439c0c1305c56943c01e0a30b613eaaa.png)
↑こうなります。
これに同じ文字列にマーキングしてみますと
![](https://kanalabo.net/wp-content/uploads/2021/10/1b7200430838eebc0a4e177fc7d298ed.png)
↑このようになりました。
元の記載が下、追加した記載が上。という前提で読んでいただければと思いますが…
一つずつ解決していくと…
まず「var camera =」これは、cameraProviderというもので得られた結果を「camera」という変数に格納するという事を指します。
ただ、問題ビューを見ると、この「camera」という変数はどこにも使ってないよ
![](https://kanalabo.net/wp-content/uploads/2021/10/3056f8b58efd783f9fac4e658a755eb7.png)
という記載があることがわかります。
つまり、いまはあってもなくても一緒という風に考えます。
ただ、元ネタには入ってたという事を考え、追加分にも加えることにしました。↓
![](https://kanalabo.net/wp-content/uploads/2021/10/8e8c2f2f034ece7135d8310c7a2dc85f.png)
次は、「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」大文字の両方を変更したところ、問題は解決しました。
![](https://kanalabo.net/wp-content/uploads/2021/10/0a9878de80d742f1feea19accc5bdc2f.png)
だいぶ似てきたと思います(笑
続けます。
残りの違いは、「imageCapture」と「imageAnalysis」の2つですが、「imageAnalysis」だけ赤字です。
少しさかのぼりますが、先ほどこんなものを登録しました。
![画像に alt 属性が指定されていません。ファイル名: b04befba825beb100a5fc74f52869467.png](https://kanalabo.net/wp-content/uploads/2021/10/b04befba825beb100a5fc74f52869467.png)
imageCaptureという変数を登録していますね。これによって「imageCapture」は赤字ではなくなっています。
これは「画像を保存するのに使うもの」らしいです。
じゃあ「imageAlanysis」って何?というと「画像を解析するのに使うもの」らしいです。
恐らく、笑顔度とかを解析してくれるものだと思いますが、一歩ずつ着実に行っておりまして、今はまだ「保存したいだけ」で解析は次の段階と考えています。
つまり、「imageAnalysis」は今はいらないではないかと考え、消してみても問題にはなりませんでした。(結果論)
![](https://kanalabo.net/wp-content/uploads/2021/10/ac3c5963b2eddd63bea262ed833daa2d.png)
結局、何が変わったかというと「imageCapture」が追加されただけという事になります。
![](https://kanalabo.net/wp-content/uploads/2021/10/9b101e9a3d38e697d5a7011df1e90b83.png)
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) }
ここで一旦区切ります。
最後までお読みいただきありがとうございました。
気になることがあったら、コメント頂けると嬉しいです。
自主学習も兼ねて記事にするかもしれません。