ひさびさにAndroid Jetpackのページを見ていたら、
CameraXなるものがあったので試してみたときの備忘録。
CameraXとは?
公式ドキュメントの説明はこんな感じ。
CameraX は、カメラアプリの開発を簡単に行うための Jetpack サポート ライブラリです。ほとんどの Android デバイスで機能する、使いやすく一貫性のある API サーフェスを提供するほか、Android 5.0(API レベル 21)への下位互換性も備えています。
CameraX は camera2 の機能を利用する一方で、ライフサイクルに対応した、シンプルなユースケース ベースのアプローチを使用します。また、デバイスの互換性に関する問題が解消されるため、コードベースにデバイス固有のコードを含める必要がありません。これらの機能により、カメラ機能をアプリに追加する際に作成する必要があるコードの量を減らすことができます。
カメラ関係は、Camera APIやcamera2があったけど、Callbackが多くかなり大変。。
サンプルを見ると、かなり簡単に使えるのっぽいので、良さげな感じ。
使ってみる
公式のチュートリアルがあるので、そちらを参考にやってみた。
build.gradleの設定
設定する箇所は2つ。
- compileOptionsでJavaVersion.VERSION_1_8を指定
- dependenciesにライブラリを追加
// build.gradle android { compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } } dependencies { // CameraX core library using camera2 implementation implementation "androidx.camera:camera-camera2:1.0.0-rc01" // CameraX Lifecycle Library implementation "androidx.camera:camera-lifecycle:1.0.0-rc01" // CameraX View class implementation "androidx.camera:camera-view:1.0.0-alpha20" }
AndroidManifext.xmlの設定
カメラを使うので、以下を追加しておく。
<uses-feature android:name="android.hardware.camera.any" /> <uses-permission android:name="android.permission.CAMERA" />
activity_main.xmlの設定
ActivityのレイアウトXMLはこんな感じ。
プレビュー用のPreviewView
が提供されているので、それを使う。
<!-- activity_main.xml --> <?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <androidx.camera.view.PreviewView android:id="@+id/viewFinder" android:layout_width="match_parent" android:layout_height="match_parent" /> </androidx.constraintlayout.widget.ConstraintLayout>
MainActivity
カメラ画像のプレビューを表示するのはこんな感じ。すごく簡単。。(´ω`)
※RuntimePermission系の処理は省略。
public class MainActiivty extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); startCamera(); } private void startCamera() { ListenableFuture<ProcessCameraProvider> cameraProviderFuture = ProcessCameraProvider.getInstance(this); cameraProviderFuture.addListener(() -> { try { // Used to bind the lifecycle of cameras to the lifecycle owner ProcessCameraProvider cameraProvider = cameraProviderFuture.get(); // Preview PreviewView previewView = findViewById(R.id.viewFinder); Preview preview = new Preview.Builder().build(); preview.setSurfaceProvider(previewView.getSurfaceProvider()); // Select back camera as a default CameraSelector cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA; // Unbind use cases before rebinding cameraProvider.unbindAll(); // Bind use cases to camera cameraProvider.bindToLifecycle(this, cameraSelector, preview); } catch (ExecutionException | InterruptedException e) { Log.e(TAG, e.getLocalizedMessage(), e); } }, ContextCompat.getMainExecutor(this)); } }
これでカメラの画像が表示される(´ω`)
プレビューするだけでも、数段のコールバックが必要だったのに。。(´ω`)
キャプチャとか画像解析の機能もあるので、かなり簡単になってる印象。
いろいろ試してみたい(´ω`)
以上!!