Android Studio カメラアプリ作成その12(カメラ表示7)
こんにちは かなで です。
前回までのお話。
カメラが映った!(偽物だけどね)
前回映った映像をアニメーションGIFにしてみました。
ちょっと荒いですが、少しグネ~っと動いてるのがわかりますか?
実はこの映像はAndroid Studioが準備した「カメラで写せと言われたらこれを使う」という設定がされているためです。
なので、これが表示されているということは、アプリとしては、ちゃんと「カメラプレビュー」ができていることになります。
ただ、言ってるように実際のカメラ映像ではないですね。
一応これを簡単に変更できたので、ここで紹介させていただきます。
まず、最初にエミュレータを落とします。
自分はいつも、電源ボタンを長押しして、「Power off」を選択しています。(たぶんちゃんとした方法があるんでしょうが)
次に、ツールからAVD Managerを開いて、
開いた「Android Virtual Device Manager」から、使用しているエミュレータの逆三角を押して、「Edit」を選びます。
「Virtual Device Configuration」が開いたら「Show Advanced Settings」を押します。
そして、Camera→Back→VirtualSceneとなっているのを「Webcam0」に変更します。
VirturlSceneが先ほどの家の中っぽい画像のことで、
Webcam0がPCについてるカメラの事ですね。PCによっては名前が変わるんだと思います。
ちなみにBackじゃなくてFrontはどうなの?というところですが、
val cameraSelector : CameraSelector = CameraSelector.Builder() .requireLensFacing(CameraSelector.LENS_FACING_BACK) .build()
この「LENS_FACING_BACK」という部分で背面カメラ(Back)のことを指すという設定になってるようです。
※ここでいう背面ってのは「Android」の背面のことであって、「PC」の背面じゃないので間違わないように
では設定が終わりましたので、再生ボタンで起動してみます。
どうでしょう。手近にあったキティちゃんにご登場いただきました(笑
ちゃんとカメラ映像が映ってますね!
やっとのことで、「カメラ映像を表示する」という目的を達成することが出来ました。
画面サイズが小さいの話とか、横向きに移っちゃってるところとかは、これからまた調べていきたいと思います。
それではここまでのコードをまとめて書いておきます
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> <FrameLayout android:layout_width="729dp" android:layout_height="194dp" tools:layout_editor_absoluteX="1dp" tools:layout_editor_absoluteY="1dp" tools:ignore="MissingConstraints"> <androidx.camera.view.PreviewView android:id="@+id/viewFinder" android:layout_width="729dp" android:layout_height="194dp"/> </FrameLayout> </androidx.constraintlayout.widget.ConstraintLayout>
MainActivity.kt
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 import androidx.camera.camera2.Camera2Config //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) setContentView(R.layout.activity_main) 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) } }
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="net.kanalabo.cam"> <uses-permission android:name="android.permission.CAMERA" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.Cam"> <activity android:name=".MainActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
次回はカメラサイズをぴったりフィットさせたいですね。
最後までお読みいただきありがとうございました。
気になることがあったら、コメント頂けると嬉しいです。
自主学習も兼ねて記事にするかもしれません。