동영상 녹화

이 과정에서는 기존 카메라 애플리케이션을 사용하여 동영상을 캡처하는 방법에 관해 설명합니다.

애플리케이션에서 실행되는 작업 중에서 동영상 통합이 차지하는 비중은 매우 적습니다. 캠코더를 새로 만들지 않고 간단하게 동영상을 촬영할 수 있습니다. 다행히 대부분의 Android 지원 기기에는 이미 동영상을 녹화하는 카메라 애플리케이션이 있습니다. 이 과정에서는 카메라 애플리케이션을 사용하여 동영상을 녹화하는 방법을 알아봅니다.

다음 관련 리소스를 참조하세요.

카메라 기능 요청

애플리케이션이 카메라를 필요로 하는지 알리려면 다음과 같이 manifest 파일에 <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를 시작하는 호출 및 포커스가 활동에 반환될 때 동영상을 처리하는 코드 일부입니다.

다음은 동영상을 캡처하는 인텐트를 호출하는 함수입니다.

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

자바

    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 카메라 애플리케이션은 onActivityResult()에 전달된 Intent에 저장소의 동영상 위치를 가리키는 Uri로 동영상을 반환합니다. 다음 코드는 이 동영상을 가져와서 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)
        }
    }
    

자바

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