Kanade Labo

かなで研究所

Android Studio カメラアプリ作成その7(カメラ表示2)

こんにちは かなで です。

早速ですが、続きを書いていきます。

前回は「activity_main.xml」を編集しましたが、今回は主に「MainActivity.kt」です。

よろしくお願いします。

参考サイト

https://developer.android.com/training/camerax/preview?hl=ja

この部分から始めます。

CameraProvider リクエストする。

これもやはりどこに書けばいいのかよくわかりませんよね?よね?

こちらです「app/java/net.kanalabo.cam/MainActivity」

net.kanalabo.camのところは、作った時の情報によって変わります。

こちらを開くと以下のようになります。

これが実際にコードですが、まず、この矢印の先を見てください。

+となってますよね。この状態の場合は、コードが隠れている状態ですので、この+をクリックしてみてください。

package net.kanalabo.cam

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }
}

このようにimportが複数表示されました。

後々説明に使うので、ここは開いておいてください。

先ほどの追加すべきコードですが2つに分けます。

そしてこれらを以下の場所に「一旦」書き込みます。

一つずついきます。まずは①から

import androidx.camera.lifecycle.ProcessCameraProvider
import com.google.common.util.concurrent.ListenableFuture

入れてみました。

全体的に灰色になってるのと、一部赤文字がありますね。

灰色は「せっかくインポートしたけど、使ってないよ」というものみたいです。

②で使うものなので、まだ使ってないということで灰色になってるんですね。

赤文字は置いといて、②を加えてみます。

②(赤枠)を追加しました。

青枠の部分の灰色文字がなくなったことがわかると思います。

次に、黄緑枠と赤枠を比べてみてください。

まずは1行目を見ると「class MainActivity : AppCompatActivity() {」で全く同じですよね。

これは黄緑枠と赤枠が重複して記載されているという事になります。

イメージとしては「メインはどれですか?」と聞かれた場合、プログラムはどっちがメインかわからないということになります。

なのでどうするかというと…最初にあった黄緑枠をコメントアウトさせます。

具体的には、このように、各行の頭に「//」を入れます。

これを入れると「この行は無視するよ」ということになります。

消せばいいのですが、後で使うので、あえて残しておきます(笑

次に、赤字を解決したいと思います。

Unresolved reference: lifecycle
Unresolved reference: ProcessCameraProvider
Overriding method should call 'super.onCreate'
Unresolved reference: ProcessCameraProvider

問題ビューを見ると 4つの問題があります。

これまでの流れでわかってきたのですが、「4つあるから4個の解決策を行う必要があるか」

というとそうではなく、「何か1つの解決策を行うと、問題が複数減る」ということもあり得るのです。

わかりますかね(汗

問題ビューを上から解決するのが正解かというとそうでもないのです。

うまく説明できなくてすいませんが、やることとしては

まず、全部の赤字の「クイックフィックスの表示」を確認します。

Unresolved reference: lifecycle をクイックフィックスすると「参照名の変更」とだけ表示されました。

じゃあこれは1つの選択肢しかないのかというと…

もう一度同じように押すと、今度は2つの選択肢になりました。

今のところ、なんでこの選択肢が変更されるのかはよくわかってません…

とりあえず全部開いておきます。

全部開いてみました。

ここでまた結果論ですが、選択肢の中に「Add depondency on~」がある場合、これが正解のようです。(プレビューするまではこれで困らなかっただけ。

そしてよく見ると、4つの問題のうち、Overから始まるもの以外は、全部「Add depondency on androidx.camera-lifecycle and import」という記載でした。

つまりこれを実行すると…

問題が1つになりました!

package net.kanalabo.cam

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.camera.lifecycle.ProcessCameraProvider
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?) {
        cameraProviderFuture = ProcessCameraProvider.getInstance(this)
    }
}

そしてソースコードを見ても、赤字はなくなりましたね。

残りの1つを解決しましょう。

結果的には上の「Add super call」を選択しました。

すると…

class MainActivity : AppCompatActivity() {
    private lateinit var cameraProviderFuture : ListenableFuture<ProcessCameraProvider>
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        cameraProviderFuture = ProcessCameraProvider.getInstance(this)
    }
}

赤枠の文言が追加されました。

そして、これはコメントアウトした青色枠の文言と同じですね。

つまり最初は入ってたけど、これまでのやり取りで、コメントアウトしてしまってたけど、問題ビューから操作で、復活した。という流れになります。

最初から入ってたものなんで、あるのが正解だろうということで、これで続けます。

あっ、問題ビューは0個になりました。

ひと段落したところで、ここでちょっと余談に入ります。

最初の画像ですが、仮にこちらを 「MainActivity.kt」 に丸ごと張り付けていたらどうなったでしょう?

張り付けてみました。

問題ビューはこんな感じです。

先ほど、「Add depondency on ~」があったら、それが正解と書きましたが、上記のように「インポート」という文字があったらそれも正解です。(プレビューするまでではこの考えでうまくいっただけ

ということで、赤字を解決します。

赤字がなくなって

問題ビューには、緑警告のみとなりました。

ここで 「activity_main.xml」 を開いてみます。

なんと赤字が復活しています。

ここで問題ビューから解決しようとすると、

新しいファイル「MainActivity.java」が作成され、中になんか記述が増えてしまいました。

赤字は消えてるし、問題ビューも問題ないように見えますが、これは不正解

やってしまったことのイメージとしては

①「activity_main.xml」と「MainActivity.kt」が関連付けられていた。

② 「MainActivity.kt」 を書き換えたときに関連付けが外れてしまった。

③ 「activity_main.xml」 で問題ビューから解決させた結果、
  「MainActivity.java」を作成し、
  「activity_main.xml」と「MainActivity.java」が関連付けられてしまった。

つまり本来あるべき①の状態から逸脱してしまったということになります。

これの正しい解決としては 「MainActivity.kt」 側のこちら↓を行うことです。

ファイルのパッケージを'net.kanalabo.cam'に変更

その結果、「package net.kanalabo.cam」が追加され、どちらの問題ビューも問題なしとなり、赤字も消えました。

ここで、余談に入る前のコードと、余談で行った結果のコードを並べてみます。

余談の入る前のコード

余談での結果コード

実は、importの順番が違うのと、コメントアウト行の違いがあるだけで、他は全く同じコードになりました。

公式に乗ってる「これをかけ」と書いてあった記述↓

import androidx.camera.lifecycle.ProcessCameraProvider
import com.google.common.util.concurrent.ListenableFuture

class MainActivity : AppCompatActivity() {
    private lateinit var cameraProviderFuture : ListenableFuture<ProcessCameraProvider>
    override fun onCreate(savedInstanceState: Bundle?) {
        cameraProviderFuture = ProcessCameraProvider.getInstance(this)
    }
}

実際に記述が必要であったもの↓

package net.kanalabo.cam

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.camera.lifecycle.ProcessCameraProvider
import com.google.common.util.concurrent.ListenableFuture

class MainActivity : AppCompatActivity() {
    private lateinit var cameraProviderFuture : ListenableFuture<ProcessCameraProvider>
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        cameraProviderFuture = ProcessCameraProvider.getInstance(this)
    }
}

この違い、知ってる人なら当然なんでしょうが、自分が行きつくまでには長かったです(汗

まだまだ続きますが、いったんここで区切ります。

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

-AndroidStudio