動画を撮影する

このレッスンでは、既存のカメラアプリを使用して動画を撮影する方法について説明します。

アプリには実行すべきジョブがあり、動画の統合はそのごく一部にすぎません。動画の撮影は最小限の操作で行えるようにし、カムコーダーを作り変えずに済むようにします。幸い、ほとんどの Android デバイスには、動画を撮影するためのカメラアプリがあらかじめインストールされています。このレッスンでは動画の撮影を行います。

以下の関連リソースをご覧ください。

カメラ機能をリクエストする

アプリにカメラが必要なことを示すには、マニフェスト ファイルに <uses-feature> タグを追加します。

    <manifest ... >
        <uses-feature android:name="android.hardware.camera"
                      android:required="true" />
        ...
    </manifest>
    

アプリでカメラを使用するものの、アプリが動作するうえでカメラが必要ない場合は、android:requiredfalse に設定します。そうすることで、カメラを搭載していないデバイスでも Google Play でアプリをダウンロードできるようになります。次に、hasSystemFeature(PackageManager.FEATURE_CAMERA) を呼び出して、実行時にカメラを使用できるかどうかを確認する必要があります。カメラを使用できない場合は、カメラ機能を無効にする必要があります。

カメラアプリで動画を撮影する

Android でアクションを他のアプリに委任するには、実行内容を記述した Intent を呼び出します。このプロセスは、Intent 自体、外部の Activity を開始するための呼び出し、フォーカスがアクティビティに戻ったときに動画を処理するためのコード、という 3 つの部分で構成されます。

以下に、インテントを呼び出して動画を撮影する関数を示します。

Kotlin

    const val REQUEST_VIDEO_CAPTURE = 1

    private fun dispatchTakeVideoIntent() {
        Intent(MediaStore.ACTION_VIDEO_CAPTURE).also { takeVideoIntent ->
            takeVideoIntent.resolveActivity(packageManager)?.also {
                startActivityForResult(takeVideoIntent, REQUEST_VIDEO_CAPTURE)
            }
        }
    }
    

Java

    static final int REQUEST_VIDEO_CAPTURE = 1;

    private void dispatchTakeVideoIntent() {
        Intent takeVideoIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
        if (takeVideoIntent.resolveActivity(getPackageManager()) != null) {
            startActivityForResult(takeVideoIntent, REQUEST_VIDEO_CAPTURE);
        }
    }
    

startActivityForResult() メソッドは、インテントを処理可能な最初のアクティビティ コンポーネントを返す resolveActivity() を呼び出す条件によって保護されています。アプリで処理できないインテントを使用して startActivityForResult() を呼び出すと、アプリがクラッシュするため、このチェックは重要です。結果が null でない限り、インテントを安全に使用できます。

動画を見る

Android カメラアプリは、ストレージ内の動画の場所を指す Uri として onActivityResult() に提供された Intent で動画を返します。次のコードでは、その動画を取得して VideoView に表示しています。

Kotlin

    override fun onActivityResult(requestCode: Int, resultCode: Int, intent: Intent) {
        if (requestCode == REQUEST_VIDEO_CAPTURE && resultCode == RESULT_OK) {
            val videoUri: Uri = intent.data
            videoView.setVideoURI(videoUri)
        }
    }
    

Java

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
        if (requestCode == REQUEST_VIDEO_CAPTURE && resultCode == RESULT_OK) {
            Uri videoUri = intent.getData();
            videoView.setVideoURI(videoUri);
        }
    }