This lesson explains how to capture video using existing camera applications.
Your application has a job to do, and integrating videos is only a small part of it. You want to take videos with minimal fuss, and not reinvent the camcorder. Happily, most Android-powered devices already have a camera application that records video. In this lesson, you make it do this for you.
Request Camera Permission
To advertise that your application depends on having a camera, put a
<uses-feature>
tag in the manifest file:<manifest ... > <uses-feature android:name="android.hardware.camera" android:required="true" /> ...</manifest>
If your application uses, but does not require a camera in order to function, set
android:required
to false
. In doing so, Google Play will allow devices without a camera to download your application. It's then your responsibility to check for the availability of the camera at runtime by callinghasSystemFeature(PackageManager.FEATURE_CAMERA)
. If a camera is not available, you should then disable your camera features.Record a Video with a Camera App
The Android way of delegating actions to other applications is to invoke an
Intent
that describes what you want done. This process involves three pieces: The Intent
itself, a call to start the external Activity
, and some code to handle the video when focus returns to your activity.
Here's a function that invokes an intent to capture video.
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); } }
Notice that the
startActivityForResult()
method is protected by a condition that calls resolveActivity()
, which returns the first activity component that can handle the intent. Performing this check is important because if you call startActivityForResult()
using an intent that no app can handle, your app will crash. So as long as the result is not null, it's safe to use the intent.View the Video
The Android Camera application returns the video in the
Intent
delivered to onActivityResult()
as a Uri
pointing to the video location in storage. The following code retrieves this video and displays it in a VideoView
.@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_VIDEO_CAPTURE && resultCode == RESULT_OK) { Uri videoUri = intent.getData(); mVideoView.setVideoURI(videoUri); } }
接下來看sample code
Button.OnClickListener mTakeVidOnClickListener = new Button.OnClickListener() { @Override public void onClick(View v) { dispatchTakeVideoIntent(); } };
private void dispatchTakeVideoIntent() { Intent takeVideoIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE); startActivityForResult(takeVideoIntent, ACTION_TAKE_VIDEO); }
當 takeVideoIntent 做完後... 會呼叫 onActivityResult()... 所以我們必須實做他
@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case ACTION_TAKE_VIDEO: { if (resultCode == RESULT_OK) { handleCameraVideo(data); } break; } // ACTION_TAKE_VIDEO } // switch}
private void handleCameraVideo(Intent intent) { mVideoUri = intent.getData(); mVideoView.setVideoURI(mVideoUri); mImageBitmap = null; mVideoView.setVisibility(View.VISIBLE); mImageView.setVisibility(View.INVISIBLE); }
沒有留言:
張貼留言