Android Studio カメラアプリ作成その9(カメラ表示4)
こんにちは かなで です。
続きです!
参考サイト
https://developer.android.com/training/camerax/preview?hl=ja
![](https://kanalabo.net/wp-content/uploads/2021/10/2e4d5c595ceeeb1939e3b152e441b885.png)
こちらの部分です。参考サイトからすると、これが最後です。
どこに入れるの!?(ほんと…なんでわかるんですか…
![](https://kanalabo.net/wp-content/uploads/2021/10/39e4b9b261f171724ae98702dc3546c5.png)
たぶんここで合ってます(笑
package net.kanalabo.cam import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import androidx.camera.lifecycle.ProcessCameraProvider import androidx.core.content.ContextCompat import com.google.common.util.concurrent.ListenableFuture //class MainActivity : AppCompatActivity() { // override fun onCreate(savedInstanceState: Bundle?) { // super.onCreate(savedInstanceState) // setContentView(R.layout.activity_main) // } //} class MainActivity : AppCompatActivity() { private lateinit var cameraProviderFuture : ListenableFuture<ProcessCameraProvider> override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) cameraProviderFuture = ProcessCameraProvider.getInstance(this) cameraProviderFuture.addListener({ val cameraProvider = cameraProviderFuture.get() bindPreview(cameraProvider) }, ContextCompat.getMainExecutor(this)) } 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) } }
まず、前回赤字だったbindePreviewですが、今追加したことで赤字でなくなりました。
![](https://kanalabo.net/wp-content/uploads/2021/10/fc0a4874a6adef7603ae68829c98d274.png)
問題ビューを見ると
![](https://kanalabo.net/wp-content/uploads/2021/10/ab4acf6f92adc0cc46b06a8786ceaf5d.png)
こんだけありました。
一つずつ解決していきます。
といっても、上のUnresolved~は、インポートでいけそうです。
![](https://kanalabo.net/wp-content/uploads/2021/10/da393afba37330b5ec1eb551c8671c3f.png)
![](https://kanalabo.net/wp-content/uploads/2021/10/8efb21e90e1fc36dace1b7c86327191c.png)
ちょっと長くなってきたので、import部分とそれ以外部分で画像を分けます。
![](https://kanalabo.net/wp-content/uploads/2021/10/ae55e1dcecd8651b30e6021bdccefd04.png)
![](https://kanalabo.net/wp-content/uploads/2021/10/82dd8e291847d53cff1a87adaa8dc899.png)
赤字は「previewView」だけですね。
でここなんですが、以下記事でこんなことを言ってたのを覚えてますでしょうか。
![](https://kanalabo.net/wp-content/uploads/2021/10/6091d4f2fdb87a873848ecc3d056d3df.png)
こちらの記事で、previewViewをviewFinderに変えてますが、今残ってる赤字部分がこれと紐づけされている部分のようなので、こちらを変更します。
![](https://kanalabo.net/wp-content/uploads/2021/10/53c75ad6a0c2053ad9c052769d78d69d.png)
![](https://kanalabo.net/wp-content/uploads/2021/10/d080faf9a30c880f303dfdf106dd4a45.png)
はい。赤字じゃなくな…なくなってませんね(汗
失礼しました。
これだけじゃ治らないんでした(汗
というわけで何をするかというと、
val viewFinder: PreviewView = findViewById(R.id.viewFinder)
こちらの1行を追加します。
![](https://kanalabo.net/wp-content/uploads/2021/10/6ab3d0696a5cd2526cf32dd6437ed956.png)
と、今書いて気づいたのですが、ここ↓も違う文字列でも大丈夫でした。
![](https://kanalabo.net/wp-content/uploads/2021/10/eeac7f5438d8819741fb8cb746af457f.png)
一旦言いたいことを整理しますと、
元々の公式サイトをもとに作成した場合、以下のようになるはずでした。
![](https://kanalabo.net/wp-content/uploads/2021/10/8d428cdc416bc2607f8d69a7c072ba4f.png)
![](https://kanalabo.net/wp-content/uploads/2021/10/a20e8669f3396c371af907834cdaf8da.png)
「previewview」という文字列が散りばめられてて、とっても理解しにくかったんですが、同じ文字列だけど違う用途だと気付いて改変したのがこちらです。
![](https://kanalabo.net/wp-content/uploads/2021/10/be72d5dcf4b9013c6dfb717ef0b6b7b5.png)
![](https://kanalabo.net/wp-content/uploads/2021/10/4426f524262cb0e98bfb2d1a81cb789b.png)
同じ色でくくっている者同士はリンクしてますが、違う色同士はリンクしてなくて、別にどんな名前でもOKだったんです。
これを踏まえて理解すると、
赤枠のPreviewViewは、そういう最初から決められた「関数」。プレビューをするために必要な関数でした。
青枠は、カメラプレビューを映す先のオブジェクトを表してたんですね。activity.main側でviewFinderという名前を決めて、MainActivity側で、viewFinderを探して、それに映すよ みたいな。そんな風にとらえました。
黄緑枠は、findeViewByIdで取得したviewFinderの画面をPreviewViewでプレビュー状態にして、それをkanadeFinderに格納して、次の行でそのkanadeFinderを使って…ん~書いててもよくわかりませんでした(汗 そんな感じです。
えっと…強行します。
先にやればよかったですが、「PreviewView」はクイックフィックスでインポートができたので、インポートは正解というルールに則りインポートします。
package net.kanalabo.cam 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() { // override fun onCreate(savedInstanceState: Bundle?) { // super.onCreate(savedInstanceState) // setContentView(R.layout.activity_main) // } //} class MainActivity : AppCompatActivity() { private lateinit var cameraProviderFuture : ListenableFuture<ProcessCameraProvider> override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) cameraProviderFuture = ProcessCameraProvider.getInstance(this) cameraProviderFuture.addListener({ val cameraProvider = cameraProviderFuture.get() bindPreview(cameraProvider) }, ContextCompat.getMainExecutor(this)) } fun bindPreview(cameraProvider : ProcessCameraProvider) { var preview : Preview = Preview.Builder() .build() var cameraSelector : CameraSelector = CameraSelector.Builder() .requireLensFacing(CameraSelector.LENS_FACING_BACK) .build() val kanadeFinder: PreviewView = findViewById(R.id.viewFinder) preview.setSurfaceProvider(kanadeFinder.getSurfaceProvider()) var camera = cameraProvider.bindToLifecycle(this as LifecycleOwner, cameraSelector, preview) } }
あと残ってる問題ビューはこちら
![](https://kanalabo.net/wp-content/uploads/2021/10/fa1942fb13b402928f0d2549090c8f5b.png)
----------------------------------------------------------------
上2行は、varよりvalの方がいいよと言ってるみたいです。
![](https://kanalabo.net/wp-content/uploads/2021/10/225996dcce50a0dc10c1c3df6fdc1c35.png)
varは読み取り専用 valは書き換え可能 と理解しました。
varでいいんでしょうが、問題ビューを減らすためだけにvalに変えます。
![](https://kanalabo.net/wp-content/uploads/2021/10/011a9a621370f7f825ae8d5976c88079.png)
「変えます」といっても、もちろん手作業じゃなく、クイックフィックスからですよ。
----------------------------------------------------------------
![](https://kanalabo.net/wp-content/uploads/2021/10/e076200e79ed02fd795a16149f81e164.png)
![](https://kanalabo.net/wp-content/uploads/2021/10/b0bbdc521d8887515d78edbc0f97201c.png)
これは、cameraという変数を作ったのに、どこでも使ってないじゃん?という意味のようです。
プレビューまでには使いませんでしたが、きっとこの先使うことがあるんでしょう。
クリックフィックスすると消すことができますが、後で困りそうなので残しておきます。
----------------------------------------------------------------
![](https://kanalabo.net/wp-content/uploads/2021/10/f204e904f080a28a261be3f06fcef59b.png)
![](https://kanalabo.net/wp-content/uploads/2021/10/077b25dbcfe1c1a13867082542d36384.png)
あ~そうでしたそうでしたprivateでした。(よくわかりませんが、Android Studioがそういうんでそうでしょう)
クイックフィックス後
![](https://kanalabo.net/wp-content/uploads/2021/10/0eafa9af2b0a7b33834ff3148446fd1d.png)
----------------------------------------------------------------
![](https://kanalabo.net/wp-content/uploads/2021/10/53c553585fe2e86f58b8caca2c8b248d.png)
![](https://kanalabo.net/wp-content/uploads/2021/10/98cd78b65d9107ce5b94edba58b14c70.png)
クイックフィックスするとこうなりました↓
![](https://kanalabo.net/wp-content/uploads/2021/10/108cfc3031bbd28ed32f9f89c6f0951d.png)
「get」の文字がなくなりましたね。すいませんこの違いは分かってません。
----------------------------------------------------------------
![](https://kanalabo.net/wp-content/uploads/2021/10/fbea95c363a4cbabb936b2412c76fbad.png)
そんなわけで問題ビューもいい感じになりました。
![](https://kanalabo.net/wp-content/uploads/2021/10/530534c6890e29160f0fbaf48ff4afea.png)
![](https://kanalabo.net/wp-content/uploads/2021/10/2014be081729437fca37af5d0b1c5d71.png)
package net.kanalabo.cam 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() { // override fun onCreate(savedInstanceState: Bundle?) { // super.onCreate(savedInstanceState) // setContentView(R.layout.activity_main) // } //} class MainActivity : AppCompatActivity() { private lateinit var cameraProviderFuture : ListenableFuture<ProcessCameraProvider> override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) cameraProviderFuture = ProcessCameraProvider.getInstance(this) cameraProviderFuture.addListener({ val cameraProvider = cameraProviderFuture.get() bindPreview(cameraProvider) }, ContextCompat.getMainExecutor(this)) } 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) var camera = cameraProvider.bindToLifecycle(this as LifecycleOwner, cameraSelector, preview) } }
![](https://kanalabo.net/wp-content/uploads/2021/10/19767cbfcfe08da823f9abf080b40527.png)
公式さんによれば、これでビルドするとプレビューがアプリに表示され、意図したとおりに動作するらしいです。
そんなうまくはいかないんですけどね!
次回へ続く。
最後までお読みいただきありがとうございました。
気になることがあったら、コメント頂けると嬉しいです。
自主学習も兼ねて記事にするかもしれません。