Android Studio カメラアプリ作成その9(カメラ表示4)
こんにちは かなで です。
続きです!
参考サイト
https://developer.android.com/training/camerax/preview?hl=ja

こちらの部分です。参考サイトからすると、これが最後です。
どこに入れるの!?(ほんと…なんでわかるんですか…

たぶんここで合ってます(笑
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ですが、今追加したことで赤字でなくなりました。

問題ビューを見ると

こんだけありました。
一つずつ解決していきます。
といっても、上のUnresolved~は、インポートでいけそうです。


ちょっと長くなってきたので、import部分とそれ以外部分で画像を分けます。


赤字は「previewView」だけですね。
でここなんですが、以下記事でこんなことを言ってたのを覚えてますでしょうか。

こちらの記事で、previewViewをviewFinderに変えてますが、今残ってる赤字部分がこれと紐づけされている部分のようなので、こちらを変更します。


はい。赤字じゃなくな…なくなってませんね(汗
失礼しました。
これだけじゃ治らないんでした(汗
というわけで何をするかというと、
val viewFinder: PreviewView = findViewById(R.id.viewFinder)
こちらの1行を追加します。

と、今書いて気づいたのですが、ここ↓も違う文字列でも大丈夫でした。

一旦言いたいことを整理しますと、
元々の公式サイトをもとに作成した場合、以下のようになるはずでした。


「previewview」という文字列が散りばめられてて、とっても理解しにくかったんですが、同じ文字列だけど違う用途だと気付いて改変したのがこちらです。


同じ色でくくっている者同士はリンクしてますが、違う色同士はリンクしてなくて、別にどんな名前でも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)
}
}
あと残ってる問題ビューはこちら

----------------------------------------------------------------
上2行は、varよりvalの方がいいよと言ってるみたいです。

varは読み取り専用 valは書き換え可能 と理解しました。
varでいいんでしょうが、問題ビューを減らすためだけにvalに変えます。

「変えます」といっても、もちろん手作業じゃなく、クイックフィックスからですよ。
----------------------------------------------------------------


これは、cameraという変数を作ったのに、どこでも使ってないじゃん?という意味のようです。
プレビューまでには使いませんでしたが、きっとこの先使うことがあるんでしょう。
クリックフィックスすると消すことができますが、後で困りそうなので残しておきます。
----------------------------------------------------------------


あ~そうでしたそうでしたprivateでした。(よくわかりませんが、Android Studioがそういうんでそうでしょう)
クイックフィックス後

----------------------------------------------------------------


クイックフィックスするとこうなりました↓

「get」の文字がなくなりましたね。すいませんこの違いは分かってません。
----------------------------------------------------------------

そんなわけで問題ビューもいい感じになりました。


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)
}
}

公式さんによれば、これでビルドするとプレビューがアプリに表示され、意図したとおりに動作するらしいです。
そんなうまくはいかないんですけどね!
次回へ続く。
最後までお読みいただきありがとうございました。
気になることがあったら、コメント頂けると嬉しいです。
自主学習も兼ねて記事にするかもしれません。