Scott Main 326ed257b1 Update to the Taking Photos Simply lesson (offshoot of the intent doc rewrite)
clarifications about different external directories,
information about required permissions,
intent resolution technique to match other docs,
clarify section headings, plus other code clarification

Change-Id: I62e3692a53bcd724676c74dc2c98eb72bcf58e1e
2013-12-18 09:58:15 -08:00

119 lines
4.3 KiB
Plaintext

page.title=Recording Videos Simply
parent.title=Capturing Photos
parent.link=index.html
trainingnavtop=true
previous.title=Recording Photos Simply
previous.link=photobasics.html
next.title=Controlling the Camera
next.link=cameradirect.html
@jd:body
<div id="tb-wrapper">
<div id="tb">
<h2>This lesson teaches you to</h2>
<ol>
<li><a href="#TaskManifest">Request Camera Permission</a></li>
<li><a href="#TaskCaptureIntent">Record a Video with a Camera App</a>
<li><a href="#TaskVideoView">View the Video</a></li>
</ol>
<h2>You should also read</h2>
<ul>
<li><a href="{@docRoot}guide/topics/media/camera.html">Camera</a></li>
<li><a href="{@docRoot}guide/components/intents-filters.html">Intents and Intent
Filters</a></li>
</ul>
<h2>Try it out</h2>
<div class="download-box">
<a href="http://developer.android.com/shareables/training/PhotoIntentActivity.zip"
class="button">Download the sample</a>
<p class="filename">PhotoIntentActivity.zip</p>
</div>
</div>
</div>
<p>This lesson explains how to capture video using existing camera
applications.</p>
<p>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.</p>
<h2 id="TaskManifest">Request Camera Permission</h2>
<p>To advertise that your application depends on having a camera, put a
{@code &lt;uses-feature&gt;} tag in the manifest file:</p>
<pre style="clear:right">
&lt;manifest ... >
&lt;uses-feature android:name="android.hardware.camera"
android:required="true" /&gt;
...
&lt;/manifest>
</pre>
<p>If your application uses, but does not require a camera in order to function, set {@code
android:required} to {@code 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 calling {@link
android.content.pm.PackageManager#hasSystemFeature hasSystemFeature(PackageManager.FEATURE_CAMERA)}.
If a camera is not available, you should then disable your camera features.</p>
<h2 id="TaskCaptureIntent">Record a Video with a Camera App</h2>
<p>The Android way of delegating actions to other applications is to invoke an {@link
android.content.Intent} that describes what you want done. This process involves three pieces: The
{@link android.content.Intent} itself, a call to start the external {@link android.app.Activity},
and some code to handle the video when focus returns to your activity.</p>
<p>Here's a function that invokes an intent to capture video.</p>
<pre>
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);
}
}
</pre>
<p>Notice that the {@link android.app.Activity#startActivityForResult
startActivityForResult()} method is protected by a condition that calls
{@link android.content.Intent#resolveActivity resolveActivity()}, which returns the
first activity component that can handle the intent. Performing this check
is important because if you call {@link android.app.Activity#startActivityForResult
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. </p>
<h2 id="TaskVideoView">View the Video</h2>
<p>The Android Camera application returns the video in the {@link android.content.Intent} delivered
to {@link android.app.Activity#onActivityResult onActivityResult()} as a {@link
android.net.Uri} pointing to the video location in storage. The following code
retrieves this video and displays it in a {@link android.widget.VideoView}.</p>
<pre>
&#64;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);
}
}
</pre>