MediaPlayer.java revision 4d61f602bf67fe61256c23f090d6119992ad5160
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.media;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContentResolver;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.AssetFileDescriptor;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Looper;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Message;
2620cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Cataniaimport android.os.Parcel;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ParcelFileDescriptor;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.PowerManager;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.Surface;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.SurfaceHolder;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Bitmap;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.media.AudioManager;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileDescriptor;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException;
37256430093679e1d62b54fb0c852126e54d162f6fAndreas Huberimport java.util.Map;
389193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Cataniaimport java.util.Set;
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.lang.ref.WeakReference;
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * MediaPlayer class can be used to control playback
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of audio/video files and streams. An example on how to use the methods in
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this class can be found in {@link android.widget.VideoView}.
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Please see <a href="{@docRoot}guide/topics/media/index.html">Audio and Video</a>
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for additional help using MediaPlayer.
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Topics covered here are:
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ol>
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><a href="#StateDiagram">State Diagram</a>
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><a href="#Valid_and_Invalid_States">Valid and Invalid States</a>
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><a href="#Permissions">Permissions</a>
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ol>
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="StateDiagram"></a>
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>State Diagram</h3>
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Playback control of audio/video files and streams is managed as a state
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * machine. The following diagram shows the life cycle and the states of a
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * MediaPlayer object driven by the supported playback control operations.
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The ovals represent the states a MediaPlayer object may reside
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in. The arcs represent the playback control operations that drive the object
6332f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania * state transition. There are two types of arcs. The arcs with a single arrow
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * head represent synchronous method calls, while those with
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a double arrow head represent asynchronous method calls.</p>
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><img src="../../../images/mediaplayer_state_diagram.gif"
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         alt="MediaPlayer State diagram"
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         border="0" /></p>
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>From this state diagram, one can see that a MediaPlayer object has the
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *    following states:</p>
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul>
7432f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *     <li>When a MediaPlayer object is just created using <code>new</code> or
7532f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         after {@link #reset()} is called, it is in the <em>Idle</em> state; and after
7632f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         {@link #release()} is called, it is in the <em>End</em> state. Between these
7732f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         two states is the life cycle of the MediaPlayer object.
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <ul>
7932f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         <li>There is a subtle but important difference between a newly constructed
8032f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         MediaPlayer object and the MediaPlayer object after {@link #reset()}
8132f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         is called. It is a programming error to invoke methods such
8232f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         as {@link #getCurrentPosition()},
8332f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         {@link #getDuration()}, {@link #getVideoHeight()},
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         {@link #getVideoWidth()}, {@link #setAudioStreamType(int)},
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         {@link #setLooping(boolean)},
8632f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         {@link #setVolume(float, float)}, {@link #pause()}, {@link #start()},
8732f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         {@link #stop()}, {@link #seekTo(int)}, {@link #prepare()} or
8832f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         {@link #prepareAsync()} in the <em>Idle</em> state for both cases. If any of these
8932f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         methods is called right after a MediaPlayer object is constructed,
9032f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         the user supplied callback method OnErrorListener.onError() won't be
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         called by the internal player engine and the object state remains
9232f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         unchanged; but if these methods are called right after {@link #reset()},
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         the user supplied callback method OnErrorListener.onError() will be
9432f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         invoked by the internal player engine and the object will be
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         transfered to the <em>Error</em> state. </li>
9632f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         <li>It is also recommended that once
9732f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         a MediaPlayer object is no longer being used, call {@link #release()} immediately
9832f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         so that resources used by the internal player engine associated with the
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         MediaPlayer object can be released immediately. Resource may include
10032f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         singleton resources such as hardware acceleration components and
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         failure to call {@link #release()} may cause subsequent instances of
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         MediaPlayer objects to fallback to software implementations or fail
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         altogether. Once the MediaPlayer
10432f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         object is in the <em>End</em> state, it can no longer be used and
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         there is no way to bring it back to any other state. </li>
10632f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         <li>Furthermore,
10732f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         the MediaPlayer objects created using <code>new</code> is in the
10832f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         <em>Idle</em> state, while those created with one
10932f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         of the overloaded convenient <code>create</code> methods are <em>NOT</em>
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         in the <em>Idle</em> state. In fact, the objects are in the <em>Prepared</em>
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         state if the creation using <code>create</code> method is successful.
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         </li>
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         </ul>
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         </li>
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li>In general, some playback control operation may fail due to various
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         reasons, such as unsupported audio/video format, poorly interleaved
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         audio/video, resolution too high, streaming timeout, and the like.
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         Thus, error reporting and recovery is an important concern under
11932f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         these circumstances. Sometimes, due to programming errors, invoking a playback
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         control operation in an invalid state may also occur. Under all these
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         error conditions, the internal player engine invokes a user supplied
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         OnErrorListener.onError() method if an OnErrorListener has been
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         registered beforehand via
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         {@link #setOnErrorListener(android.media.MediaPlayer.OnErrorListener)}.
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <ul>
12632f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         <li>It is important to note that once an error occurs, the
12732f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         MediaPlayer object enters the <em>Error</em> state (except as noted
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         above), even if an error listener has not been registered by the application.</li>
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <li>In order to reuse a MediaPlayer object that is in the <em>
13032f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         Error</em> state and recover from the error,
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         {@link #reset()} can be called to restore the object to its <em>Idle</em>
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         state.</li>
13332f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         <li>It is good programming practice to have your application
13432f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         register a OnErrorListener to look out for error notifications from
13532f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         the internal player engine.</li>
136c6f8ea4cf26aadc0da765585d37f7850596af6dehugh kennedy *         <li>IllegalStateException is
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         thrown to prevent programming errors such as calling {@link #prepare()},
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         {@link #prepareAsync()}, or one of the overloaded <code>setDataSource
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         </code> methods in an invalid state. </li>
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         </ul>
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         </li>
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li>Calling
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         {@link #setDataSource(FileDescriptor)}, or
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         {@link #setDataSource(String)}, or
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         {@link #setDataSource(Context, Uri)}, or
14632f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         {@link #setDataSource(FileDescriptor, long, long)} transfers a
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         MediaPlayer object in the <em>Idle</em> state to the
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <em>Initialized</em> state.
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <ul>
15032f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         <li>An IllegalStateException is thrown if
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         setDataSource() is called in any other state.</li>
15232f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         <li>It is good programming
15332f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         practice to always look out for <code>IllegalArgumentException</code>
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         and <code>IOException</code> that may be thrown from the overloaded
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <code>setDataSource</code> methods.</li>
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         </ul>
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         </li>
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li>A MediaPlayer object must first enter the <em>Prepared</em> state
15932f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         before playback can be started.
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <ul>
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <li>There are two ways (synchronous vs.
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         asynchronous) that the <em>Prepared</em> state can be reached:
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         either a call to {@link #prepare()} (synchronous) which
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         transfers the object to the <em>Prepared</em> state once the method call
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         returns, or a call to {@link #prepareAsync()} (asynchronous) which
16632f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         first transfers the object to the <em>Preparing</em> state after the
16732f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         call returns (which occurs almost right way) while the internal
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         player engine continues working on the rest of preparation work
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         until the preparation work completes. When the preparation completes or when {@link #prepare()} call returns,
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         the internal player engine then calls a user supplied callback method,
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         onPrepared() of the OnPreparedListener interface, if an
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         OnPreparedListener is registered beforehand via {@link
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         #setOnPreparedListener(android.media.MediaPlayer.OnPreparedListener)}.</li>
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <li>It is important to note that
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         the <em>Preparing</em> state is a transient state, and the behavior
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         of calling any method with side effect while a MediaPlayer object is
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         in the <em>Preparing</em> state is undefined.</li>
17832f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         <li>An IllegalStateException is
17932f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         thrown if {@link #prepare()} or {@link #prepareAsync()} is called in
18032f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         any other state.</li>
18132f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         <li>While in the <em>Prepared</em> state, properties
18232f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         such as audio/sound volume, screenOnWhilePlaying, looping can be
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         adjusted by invoking the corresponding set methods.</li>
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         </ul>
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         </li>
18632f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *     <li>To start the playback, {@link #start()} must be called. After
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         {@link #start()} returns successfully, the MediaPlayer object is in the
18832f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         <em>Started</em> state. {@link #isPlaying()} can be called to test
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         whether the MediaPlayer object is in the <em>Started</em> state.
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <ul>
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <li>While in the <em>Started</em> state, the internal player engine calls
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         a user supplied OnBufferingUpdateListener.onBufferingUpdate() callback
19332f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         method if a OnBufferingUpdateListener has been registered beforehand
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         via {@link #setOnBufferingUpdateListener(OnBufferingUpdateListener)}.
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         This callback allows applications to keep track of the buffering status
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         while streaming audio/video.</li>
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <li>Calling {@link #start()} has not effect
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         on a MediaPlayer object that is already in the <em>Started</em> state.</li>
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         </ul>
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         </li>
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li>Playback can be paused and stopped, and the current playback position
20232f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         can be adjusted. Playback can be paused via {@link #pause()}. When the call to
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         {@link #pause()} returns, the MediaPlayer object enters the
20432f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         <em>Paused</em> state. Note that the transition from the <em>Started</em>
20532f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         state to the <em>Paused</em> state and vice versa happens
20632f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         asynchronously in the player engine. It may take some time before
20732f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         the state is updated in calls to {@link #isPlaying()}, and it can be
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         a number of seconds in the case of streamed content.
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <ul>
21032f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         <li>Calling {@link #start()} to resume playback for a paused
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         MediaPlayer object, and the resumed playback
21232f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         position is the same as where it was paused. When the call to
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         {@link #start()} returns, the paused MediaPlayer object goes back to
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         the <em>Started</em> state.</li>
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <li>Calling {@link #pause()} has no effect on
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         a MediaPlayer object that is already in the <em>Paused</em> state.</li>
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         </ul>
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         </li>
21932f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *     <li>Calling  {@link #stop()} stops playback and causes a
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         MediaPlayer in the <em>Started</em>, <em>Paused</em>, <em>Prepared
22132f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         </em> or <em>PlaybackCompleted</em> state to enter the
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <em>Stopped</em> state.
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <ul>
22432f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         <li>Once in the <em>Stopped</em> state, playback cannot be started
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         until {@link #prepare()} or {@link #prepareAsync()} are called to set
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         the MediaPlayer object to the <em>Prepared</em> state again.</li>
22732f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         <li>Calling {@link #stop()} has no effect on a MediaPlayer
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         object that is already in the <em>Stopped</em> state.</li>
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         </ul>
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         </li>
23132f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *     <li>The playback position can be adjusted with a call to
23232f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         {@link #seekTo(int)}.
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <ul>
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <li>Although the asynchronuous {@link #seekTo(int)}
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         call returns right way, the actual seek operation may take a while to
23632f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         finish, especially for audio/video being streamed. When the actual
23732f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         seek operation completes, the internal player engine calls a user
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         supplied OnSeekComplete.onSeekComplete() if an OnSeekCompleteListener
23932f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         has been registered beforehand via
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         {@link #setOnSeekCompleteListener(OnSeekCompleteListener)}.</li>
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <li>Please
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         note that {@link #seekTo(int)} can also be called in the other states,
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         such as <em>Prepared</em>, <em>Paused</em> and <em>PlaybackCompleted
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         </em> state.</li>
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <li>Furthermore, the actual current playback position
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         can be retrieved with a call to {@link #getCurrentPosition()}, which
24732f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         is helpful for applications such as a Music player that need to keep
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         track of the playback progress.</li>
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         </ul>
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         </li>
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li>When the playback reaches the end of stream, the playback completes.
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <ul>
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <li>If the looping mode was being set to <var>true</var>with
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         {@link #setLooping(boolean)}, the MediaPlayer object shall remain in
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         the <em>Started</em> state.</li>
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <li>If the looping mode was set to <var>false
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         </var>, the player engine calls a user supplied callback method,
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         OnCompletion.onCompletion(), if a OnCompletionListener is registered
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         beforehand via {@link #setOnCompletionListener(OnCompletionListener)}.
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         The invoke of the callback signals that the object is now in the <em>
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         PlaybackCompleted</em> state.</li>
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <li>While in the <em>PlaybackCompleted</em>
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         state, calling {@link #start()} can restart the playback from the
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         beginning of the audio/video source.</li>
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul>
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="Valid_and_Invalid_States"></a>
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Valid and invalid states</h3>
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <table border="0" cellspacing="0" cellpadding="0">
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><td>Method Name </p></td>
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <td>Valid Sates </p></td>
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <td>Invalid States </p></td>
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <td>Comments </p></td></tr>
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><td>getCurrentPosition </p></td>
27732f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *     <td>{Idle, Initialized, Prepared, Started, Paused, Stopped,
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         PlaybackCompleted} </p></td>
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <td>{Error}</p></td>
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <td>Successful invoke of this method in a valid state does not change the
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         state. Calling this method in an invalid state transfers the object
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         to the <em>Error</em> state. </p></td></tr>
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><td>getDuration </p></td>
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <td>{Prepared, Started, Paused, Stopped, PlaybackCompleted} </p></td>
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <td>{Idle, Initialized, Error} </p></td>
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <td>Successful invoke of this method in a valid state does not change the
28732f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         state. Calling this method in an invalid state transfers the object
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         to the <em>Error</em> state. </p></td></tr>
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><td>getVideoHeight </p></td>
29032f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *     <td>{Idle, Initialized, Prepared, Started, Paused, Stopped,
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         PlaybackCompleted}</p></td>
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <td>{Error}</p></td>
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <td>Successful invoke of this method in a valid state does not change the
29432f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         state. Calling this method in an invalid state transfers the object
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         to the <em>Error</em> state.  </p></td></tr>
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><td>getVideoWidth </p></td>
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <td>{Idle, Initialized, Prepared, Started, Paused, Stopped,
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         PlaybackCompleted}</p></td>
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <td>{Error}</p></td>
30032f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *     <td>Successful invoke of this method in a valid state does not change
30132f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         the state. Calling this method in an invalid state transfers the
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         object to the <em>Error</em> state. </p></td></tr>
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><td>isPlaying </p></td>
30432f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *     <td>{Idle, Initialized, Prepared, Started, Paused, Stopped,
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *          PlaybackCompleted}</p></td>
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <td>{Error}</p></td>
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <td>Successful invoke of this method in a valid state does not change
30832f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         the state. Calling this method in an invalid state transfers the
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         object to the <em>Error</em> state. </p></td></tr>
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><td>pause </p></td>
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <td>{Started, Paused}</p></td>
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <td>{Idle, Initialized, Prepared, Stopped, PlaybackCompleted, Error}</p></td>
31332f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *     <td>Successful invoke of this method in a valid state transfers the
31432f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         object to the <em>Paused</em> state. Calling this method in an
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         invalid state transfers the object to the <em>Error</em> state.</p></td></tr>
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><td>prepare </p></td>
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <td>{Initialized, Stopped} </p></td>
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <td>{Idle, Prepared, Started, Paused, PlaybackCompleted, Error} </p></td>
31932f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *     <td>Successful invoke of this method in a valid state transfers the
32032f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         object to the <em>Prepared</em> state. Calling this method in an
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         invalid state throws an IllegalStateException.</p></td></tr>
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><td>prepareAsync </p></td>
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <td>{Initialized, Stopped} </p></td>
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <td>{Idle, Prepared, Started, Paused, PlaybackCompleted, Error} </p></td>
32532f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *     <td>Successful invoke of this method in a valid state transfers the
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         object to the <em>Preparing</em> state. Calling this method in an
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         invalid state throws an IllegalStateException.</p></td></tr>
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><td>release </p></td>
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <td>any </p></td>
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <td>{} </p></td>
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <td>After {@link #release()}, the object is no longer available. </p></td></tr>
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><td>reset </p></td>
33332f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *     <td>{Idle, Initialized, Prepared, Started, Paused, Stopped,
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         PlaybackCompleted, Error}</p></td>
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <td>{}</p></td>
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <td>After {@link #reset()}, the object is like being just created.</p></td></tr>
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><td>seekTo </p></td>
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <td>{Prepared, Started, Paused, PlaybackCompleted} </p></td>
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <td>{Idle, Initialized, Stopped, Error}</p></td>
34032f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *     <td>Successful invoke of this method in a valid state does not change
34132f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         the state. Calling this method in an invalid state transfers the
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         object to the <em>Error</em> state. </p></td></tr>
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><td>setAudioStreamType </p></td>
34432f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *     <td>{Idle, Initialized, Stopped, Prepared, Started, Paused,
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *          PlaybackCompleted}</p></td>
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <td>{Error}</p></td>
3479d96354d7055cd165d7d5625990f810f46339e52James Dong *     <td>Successful invoke of this method does not change the state. In order for the
3489d96354d7055cd165d7d5625990f810f46339e52James Dong *         target audio stream type to become effective, this method must be called before
3499d96354d7055cd165d7d5625990f810f46339e52James Dong *         prepare() or prepareAsync().</p></td></tr>
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><td>setDataSource </p></td>
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <td>{Idle} </p></td>
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <td>{Initialized, Prepared, Started, Paused, Stopped, PlaybackCompleted,
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *          Error} </p></td>
35432f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *     <td>Successful invoke of this method in a valid state transfers the
35532f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         object to the <em>Initialized</em> state. Calling this method in an
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         invalid state throws an IllegalStateException.</p></td></tr>
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><td>setDisplay </p></td>
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <td>any </p></td>
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <td>{} </p></td>
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <td>This method can be called in any state and calling it does not change
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         the object state. </p></td></tr>
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><td>setLooping </p></td>
36332f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *     <td>{Idle, Initialized, Stopped, Prepared, Started, Paused,
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         PlaybackCompleted}</p></td>
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <td>{Error}</p></td>
36632f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *     <td>Successful invoke of this method in a valid state does not change
36732f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         the state. Calling this method in an
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         invalid state transfers the object to the <em>Error</em> state.</p></td></tr>
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><td>isLooping </p></td>
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <td>any </p></td>
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <td>{} </p></td>
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <td>This method can be called in any state and calling it does not change
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         the object state. </p></td></tr>
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><td>setOnBufferingUpdateListener </p></td>
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <td>any </p></td>
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <td>{} </p></td>
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <td>This method can be called in any state and calling it does not change
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         the object state. </p></td></tr>
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><td>setOnCompletionListener </p></td>
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <td>any </p></td>
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <td>{} </p></td>
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <td>This method can be called in any state and calling it does not change
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         the object state. </p></td></tr>
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><td>setOnErrorListener </p></td>
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <td>any </p></td>
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <td>{} </p></td>
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <td>This method can be called in any state and calling it does not change
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         the object state. </p></td></tr>
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><td>setOnPreparedListener </p></td>
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <td>any </p></td>
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <td>{} </p></td>
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <td>This method can be called in any state and calling it does not change
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         the object state. </p></td></tr>
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><td>setOnSeekCompleteListener </p></td>
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <td>any </p></td>
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <td>{} </p></td>
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <td>This method can be called in any state and calling it does not change
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         the object state. </p></td></tr>
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><td>setScreenOnWhilePlaying</></td>
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <td>any </p></td>
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <td>{} </p></td>
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <td>This method can be called in any state and calling it does not change
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         the object state.  </p></td></tr>
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><td>setVolume </p></td>
40532f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *     <td>{Idle, Initialized, Stopped, Prepared, Started, Paused,
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *          PlaybackCompleted}</p></td>
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <td>{Error}</p></td>
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <td>Successful invoke of this method does not change the state.
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><td>setWakeMode </p></td>
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <td>any </p></td>
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <td>{} </p></td>
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <td>This method can be called in any state and calling it does not change
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         the object state.</p></td></tr>
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><td>start </p></td>
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <td>{Prepared, Started, Paused, PlaybackCompleted}</p></td>
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <td>{Idle, Initialized, Stopped, Error}</p></td>
41732f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *     <td>Successful invoke of this method in a valid state transfers the
41832f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         object to the <em>Started</em> state. Calling this method in an
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         invalid state transfers the object to the <em>Error</em> state.</p></td></tr>
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><td>stop </p></td>
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <td>{Prepared, Started, Stopped, Paused, PlaybackCompleted}</p></td>
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <td>{Idle, Initialized, Error}</p></td>
42332f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *     <td>Successful invoke of this method in a valid state transfers the
42432f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania *         object to the <em>Stopped</em> state. Calling this method in an
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         invalid state transfers the object to the <em>Error</em> state.</p></td></tr>
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </table>
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="Permissions"></a>
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Permissions</h3>
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>One may need to declare a corresponding WAKE_LOCK permission {@link
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * android.R.styleable#AndroidManifestUsesPermission &lt;uses-permission&gt;}
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * element.
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class MediaPlayer
43632f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania{
4379193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania    /**
4389193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania       Constant to retrieve only the new metadata since the last
4399193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania       call.
4409193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania       // FIXME: unhide.
4419193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania       // FIXME: add link to getMetadata(boolean, boolean)
4429193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania       {@hide}
4439193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania     */
4449193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania    public static final boolean METADATA_UPDATE_ONLY = true;
4459193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania
4469193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania    /**
4479193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania       Constant to retrieve all the metadata.
4489193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania       // FIXME: unhide.
4499193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania       // FIXME: add link to getMetadata(boolean, boolean)
4509193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania       {@hide}
4519193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania     */
4529193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania    public static final boolean METADATA_ALL = false;
4539193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania
4549193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania    /**
4559193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania       Constant to enable the metadata filter during retrieval.
4569193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania       // FIXME: unhide.
4579193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania       // FIXME: add link to getMetadata(boolean, boolean)
4589193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania       {@hide}
4599193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania     */
4609193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania    public static final boolean APPLY_METADATA_FILTER = true;
4619193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania
4629193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania    /**
4639193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania       Constant to disable the metadata filter during retrieval.
4649193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania       // FIXME: unhide.
4659193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania       // FIXME: add link to getMetadata(boolean, boolean)
4669193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania       {@hide}
4679193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania     */
4689193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania    public static final boolean BYPASS_METADATA_FILTER = false;
4699193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static {
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        System.loadLibrary("media_jni");
4724935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen        native_init();
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
47432f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static String TAG = "MediaPlayer";
47620cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania    // Name of the remote interface for the media player. Must be kept
47720cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania    // in sync with the 2nd parameter of the IMPLEMENT_META_INTERFACE
47820cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania    // macro invocation in IMediaPlayer.cpp
47920cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania    private final static String IMEDIA_PLAYER = "android.media.IMediaPlayer";
48032f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mNativeContext; // accessed by native methods
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mListenerContext; // accessed by native methods
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Surface mSurface; // accessed by native methods
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private SurfaceHolder  mSurfaceHolder;
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private EventHandler mEventHandler;
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private PowerManager.WakeLock mWakeLock = null;
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mScreenOnWhilePlaying;
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mStayAwake;
48932f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
49132f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania     * Default constructor. Consider using one of the create() methods for
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * synchronously instantiating a MediaPlayer from a Uri or resource.
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>When done with the MediaPlayer, you should call  {@link #release()},
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to free the resources. If not released, too many MediaPlayer instances may
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * result in an exception.</p>
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public MediaPlayer() {
49832f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Looper looper;
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((looper = Looper.myLooper()) != null) {
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mEventHandler = new EventHandler(this, looper);
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if ((looper = Looper.getMainLooper()) != null) {
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mEventHandler = new EventHandler(this, looper);
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mEventHandler = null;
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /* Native setup requires a weak reference to our object.
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * It's easier to create it here than in C++.
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        native_setup(new WeakReference<MediaPlayer>(this));
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5138b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparks
5148b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparks    /*
5158b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparks     * Update the MediaPlayer ISurface. Call after updating mSurface.
5168b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparks     */
5178b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparks    private native void _setVideoSurface();
51832f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
52020cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania     * Create a request parcel which can be routed to the native media
52120cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania     * player using {@link #invoke(Parcel, Parcel)}. The Parcel
52220cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania     * returned has the proper InterfaceToken set. The caller should
52320cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania     * not overwrite that token, i.e it can only append data to the
52420cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania     * Parcel.
52520cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania     *
52620cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania     * @return A parcel suitable to hold a request for the native
52720cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania     * player.
5283b49e9b52558b5c45240d098410bd5afbd29e1fegwang@google.com     * {@hide}
52920cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania     */
53020cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania    public Parcel newRequest() {
53120cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania        Parcel parcel = Parcel.obtain();
53220cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania        parcel.writeInterfaceToken(IMEDIA_PLAYER);
53320cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania        return parcel;
53420cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania    }
53520cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania
53620cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania    /**
53720cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania     * Invoke a generic method on the native player using opaque
53820cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania     * parcels for the request and reply. Both payloads' format is a
53920cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania     * convention between the java caller and the native player.
54020cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania     * Must be called after setDataSource to make sure a native player
54120cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania     * exists.
54220cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania     *
54320cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania     * @param request Parcel with the data for the extension. The
54420cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania     * caller must use {@link #newRequest()} to get one.
54520cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania     *
5464a51c20ce607c74914f90fd897f04080121ac13bDianne Hackborn     * @param reply Output parcel with the data returned by the
54720cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania     * native player.
54820cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania     *
54920cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania     * @return The status code see utils/Errors.h
5503b49e9b52558b5c45240d098410bd5afbd29e1fegwang@google.com     * {@hide}
55120cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania     */
55220cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania    public int invoke(Parcel request, Parcel reply) {
55320cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania        int retcode = native_invoke(request, reply);
55420cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania        reply.setDataPosition(0);
55520cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania        return retcode;
55620cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania    }
55720cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania
55820cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania    /**
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the SurfaceHolder to use for displaying the video portion of the media.
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This call is optional. Not calling it when playing back a video will
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * result in only the audio track being played.
56232f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania     *
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param sh the SurfaceHolder to use for video display
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setDisplay(SurfaceHolder sh) {
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSurfaceHolder = sh;
5678b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparks        if (sh != null) {
5688b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparks            mSurface = sh.getSurface();
5698b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparks        } else {
5708b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparks            mSurface = null;
5718b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparks        }
5728b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparks        _setVideoSurface();
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        updateSurfaceScreenOn();
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Convenience method to create a MediaPlayer for a given Uri.
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * On success, {@link #prepare()} will already have been called and must not be called again.
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>When done with the MediaPlayer, you should call  {@link #release()},
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to free the resources. If not released, too many MediaPlayer instances will
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * result in an exception.</p>
58232f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania     *
58332f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania     * @param context the Context to use
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param uri the Uri from which to get the datasource
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return a MediaPlayer object, or null if creation failed
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static MediaPlayer create(Context context, Uri uri) {
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return create (context, uri, null);
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
59032f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Convenience method to create a MediaPlayer for a given Uri.
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * On success, {@link #prepare()} will already have been called and must not be called again.
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>When done with the MediaPlayer, you should call  {@link #release()},
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to free the resources. If not released, too many MediaPlayer instances will
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * result in an exception.</p>
59732f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania     *
59832f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania     * @param context the Context to use
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param uri the Uri from which to get the datasource
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param holder the SurfaceHolder to use for displaying the video
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return a MediaPlayer object, or null if creation failed
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static MediaPlayer create(Context context, Uri uri, SurfaceHolder holder) {
60432f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            MediaPlayer mp = new MediaPlayer();
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mp.setDataSource(context, uri);
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (holder != null) {
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mp.setDisplay(holder);
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mp.prepare();
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mp;
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (IOException ex) {
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.d(TAG, "create failed:", ex);
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // fall through
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (IllegalArgumentException ex) {
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.d(TAG, "create failed:", ex);
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // fall through
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (SecurityException ex) {
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.d(TAG, "create failed:", ex);
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // fall through
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Convenience method to create a MediaPlayer for a given resource id.
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * On success, {@link #prepare()} will already have been called and must not be called again.
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>When done with the MediaPlayer, you should call  {@link #release()},
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to free the resources. If not released, too many MediaPlayer instances will
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * result in an exception.</p>
63332f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania     *
63432f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania     * @param context the Context to use
63532f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania     * @param resid the raw resource id (<var>R.raw.&lt;something></var>) for
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *              the resource to use as the datasource
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return a MediaPlayer object, or null if creation failed
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static MediaPlayer create(Context context, int resid) {
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AssetFileDescriptor afd = context.getResources().openRawResourceFd(resid);
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (afd == null) return null;
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            MediaPlayer mp = new MediaPlayer();
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            afd.close();
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mp.prepare();
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mp;
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (IOException ex) {
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.d(TAG, "create failed:", ex);
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // fall through
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (IllegalArgumentException ex) {
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.d(TAG, "create failed:", ex);
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           // fall through
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (SecurityException ex) {
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.d(TAG, "create failed:", ex);
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // fall through
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
66132f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the data source as a content Uri.
66432f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania     *
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param context the Context to use when resolving the Uri
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param uri the Content URI of the data you want to play
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws IllegalStateException if it is called in an invalid state
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setDataSource(Context context, Uri uri)
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws IOException, IllegalArgumentException, SecurityException, IllegalStateException {
671256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber        setDataSource(context, uri, null);
672256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber    }
673256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber
674256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber    /**
675256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber     * Sets the data source as a content Uri.
676256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber     *
677256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber     * @param context the Context to use when resolving the Uri
678256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber     * @param uri the Content URI of the data you want to play
679256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber     * @param headers the headers to be sent together with the request for the data
680256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber     * @throws IllegalStateException if it is called in an invalid state
681256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber     * @hide pending API council
682256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber     */
683256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber    public void setDataSource(Context context, Uri uri, Map<String, String> headers)
684256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber        throws IOException, IllegalArgumentException, SecurityException, IllegalStateException {
68532f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String scheme = uri.getScheme();
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if(scheme == null || scheme.equals("file")) {
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setDataSource(uri.getPath());
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AssetFileDescriptor fd = null;
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ContentResolver resolver = context.getContentResolver();
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            fd = resolver.openAssetFileDescriptor(uri, "r");
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (fd == null) {
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Note: using getDeclaredLength so that our behavior is the same
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // as previous versions when the content provider is returning
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // a full file.
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (fd.getDeclaredLength() < 0) {
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                setDataSource(fd.getFileDescriptor());
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                setDataSource(fd.getFileDescriptor(), fd.getStartOffset(), fd.getDeclaredLength());
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (SecurityException ex) {
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (IOException ex) {
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (fd != null) {
7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                fd.close();
7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
715a2df60598ac0158468ce242498b7bd3cb9383e13Marco Nelissen        Log.d(TAG, "Couldn't open file on client side, trying server side");
716256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber        setDataSource(uri.toString(), headers);
7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the data source (file-path or http/rtsp URL) to use.
72232f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania     *
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param path the path of the file, or the http/rtsp URL of the stream you want to play
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws IllegalStateException if it is called in an invalid state
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native void setDataSource(String path) throws IOException, IllegalArgumentException, IllegalStateException;
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
729256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber     * Sets the data source (file-path or http/rtsp URL) to use.
730256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber     *
731256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber     * @param path the path of the file, or the http/rtsp URL of the stream you want to play
732256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber     * @param headers the headers associated with the http request for the stream you want to play
733256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber     * @throws IllegalStateException if it is called in an invalid state
734256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber     * @hide pending API council
735256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber     */
736256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber    public native void setDataSource(String path,  Map<String, String> headers)
737256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber            throws IOException, IllegalArgumentException, IllegalStateException;
738256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber
739256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber    /**
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the data source (FileDescriptor) to use. It is the caller's responsibility
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to close the file descriptor. It is safe to do so as soon as this call returns.
74232f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania     *
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param fd the FileDescriptor for the file you want to play
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws IllegalStateException if it is called in an invalid state
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
74632f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania    public void setDataSource(FileDescriptor fd)
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws IOException, IllegalArgumentException, IllegalStateException {
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // intentionally less than LONG_MAX
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setDataSource(fd, 0, 0x7ffffffffffffffL);
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
75132f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7536ab180aa65d2b4f155518af0ac7bb2777f9ce61fKenny Root     * Sets the data source (FileDescriptor) to use.  The FileDescriptor must be
7546ab180aa65d2b4f155518af0ac7bb2777f9ce61fKenny Root     * seekable (N.B. a LocalSocket is not seekable). It is the caller's responsibility
7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to close the file descriptor. It is safe to do so as soon as this call returns.
75632f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania     *
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param fd the FileDescriptor for the file you want to play
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param offset the offset into the file where the data to be played starts, in bytes
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param length the length in bytes of the data to be played
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws IllegalStateException if it is called in an invalid state
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
76232f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania    public native void setDataSource(FileDescriptor fd, long offset, long length)
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws IOException, IllegalArgumentException, IllegalStateException;
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Prepares the player for playback, synchronously.
76732f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania     *
7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * After setting the datasource and the display surface, you need to either
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * call prepare() or prepareAsync(). For files, it is OK to call prepare(),
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * which blocks until MediaPlayer is ready for playback.
77132f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania     *
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws IllegalStateException if it is called in an invalid state
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native void prepare() throws IOException, IllegalStateException;
77532f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania
7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Prepares the player for playback, asynchronously.
77832f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania     *
7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * After setting the datasource and the display surface, you need to either
7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * call prepare() or prepareAsync(). For streams, you should call prepareAsync(),
7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * which returns immediately, rather than blocking until enough data has been
7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * buffered.
78332f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania     *
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws IllegalStateException if it is called in an invalid state
7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native void prepareAsync() throws IllegalStateException;
78732f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania
7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Starts or resumes playback. If playback had previously been paused,
7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * playback will continue from where it was paused. If playback had
7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * been stopped, or never started before, playback will start at the
7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * beginning.
79332f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania     *
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws IllegalStateException if it is called in an invalid state
7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public  void start() throws IllegalStateException {
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        stayAwake(true);
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        _start();
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private native void _start() throws IllegalStateException;
80232f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania
8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
80432f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania     * Stops playback after playback has been stopped or paused.
80532f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania     *
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws IllegalStateException if the internal player engine has not been
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * initialized.
8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void stop() throws IllegalStateException {
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        stayAwake(false);
8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        _stop();
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private native void _stop() throws IllegalStateException;
81532f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Pauses playback. Call start() to resume.
81832f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania     *
8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws IllegalStateException if the internal player engine has not been
8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * initialized.
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void pause() throws IllegalStateException {
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        stayAwake(false);
8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        _pause();
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private native void _pause() throws IllegalStateException;
82832f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania
8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the low-level power management behavior for this MediaPlayer.  This
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * can be used when the MediaPlayer is not playing through a SurfaceHolder
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * set with {@link #setDisplay(SurfaceHolder)} and thus can use the
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * high-level {@link #setScreenOnWhilePlaying(boolean)} feature.
83432f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania     *
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This function has the MediaPlayer access the low-level power manager
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * service to control the device's power usage while playing is occurring.
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The parameter is a combination of {@link android.os.PowerManager} wake flags.
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use of this method requires {@link android.Manifest.permission#WAKE_LOCK}
8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * permission.
8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * By default, no attempt is made to keep the device awake during playback.
84132f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania     *
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param context the Context to use
8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param mode    the power/wake mode to set
8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.os.PowerManager
8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setWakeMode(Context context, int mode) {
8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean washeld = false;
8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mWakeLock != null) {
8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mWakeLock.isHeld()) {
8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                washeld = true;
8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWakeLock.release();
8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWakeLock = null;
8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWakeLock = pm.newWakeLock(mode|PowerManager.ON_AFTER_RELEASE, MediaPlayer.class.getName());
8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWakeLock.setReferenceCounted(false);
8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (washeld) {
8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWakeLock.acquire();
8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
86332f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Control whether we should use the attached SurfaceHolder to keep the
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * screen on while video playback is occurring.  This is the preferred
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * method over {@link #setWakeMode} where possible, since it doesn't
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * require that the application have permission for low-level wake lock
8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * access.
87032f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania     *
8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param screenOn Supply true to keep the screen on, false to allow it
8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to turn off.
8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setScreenOnWhilePlaying(boolean screenOn) {
8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mScreenOnWhilePlaying != screenOn) {
8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mScreenOnWhilePlaying = screenOn;
8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            updateSurfaceScreenOn();
8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
88032f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania
8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void stayAwake(boolean awake) {
8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mWakeLock != null) {
8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (awake && !mWakeLock.isHeld()) {
8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWakeLock.acquire();
8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (!awake && mWakeLock.isHeld()) {
8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWakeLock.release();
8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStayAwake = awake;
8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        updateSurfaceScreenOn();
8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
89232f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania
8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void updateSurfaceScreenOn() {
8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mSurfaceHolder != null) {
8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mSurfaceHolder.setKeepScreenOn(mScreenOnWhilePlaying && mStayAwake);
8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
89832f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania
8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the width of the video.
90132f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania     *
9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the width of the video, or 0 if there is no video,
903ea5f767246ad201a9e2bba0d657404e002cd7c70Jean-Baptiste Queru     * no display surface was set, or the width has not been determined
904ea5f767246ad201a9e2bba0d657404e002cd7c70Jean-Baptiste Queru     * yet. The OnVideoSizeChangedListener can be registered via
905ea5f767246ad201a9e2bba0d657404e002cd7c70Jean-Baptiste Queru     * {@link #setOnVideoSizeChangedListener(OnVideoSizeChangedListener)}
906ea5f767246ad201a9e2bba0d657404e002cd7c70Jean-Baptiste Queru     * to provide a notification when the width is available.
9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native int getVideoWidth();
90932f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the height of the video.
91232f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania     *
9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the height of the video, or 0 if there is no video,
914ea5f767246ad201a9e2bba0d657404e002cd7c70Jean-Baptiste Queru     * no display surface was set, or the height has not been determined
915ea5f767246ad201a9e2bba0d657404e002cd7c70Jean-Baptiste Queru     * yet. The OnVideoSizeChangedListener can be registered via
916ea5f767246ad201a9e2bba0d657404e002cd7c70Jean-Baptiste Queru     * {@link #setOnVideoSizeChangedListener(OnVideoSizeChangedListener)}
917ea5f767246ad201a9e2bba0d657404e002cd7c70Jean-Baptiste Queru     * to provide a notification when the height is available.
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native int getVideoHeight();
92032f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Checks whether the MediaPlayer is playing.
92332f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania     *
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true if currently playing, false otherwise
9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native boolean isPlaying();
92732f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania
9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Seeks to specified time position.
93032f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania     *
9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param msec the offset in milliseconds from the start to seek to
9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws IllegalStateException if the internal player engine has not been
9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * initialized
9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native void seekTo(int msec) throws IllegalStateException;
93632f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania
9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gets the current playback position.
93932f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania     *
9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the current position in milliseconds
9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native int getCurrentPosition();
94332f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania
9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gets the duration of the file.
94632f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania     *
9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the duration in milliseconds
9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native int getDuration();
95032f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania
9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9529193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania     * Gets the media metadata.
9539193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania     *
9549193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania     * @param update_only controls whether the full set of available
9559193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania     * metadata is returned or just the set that changed since the
9569193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania     * last call. See {@see #METADATA_UPDATE_ONLY} and {@see
9579193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania     * #METADATA_ALL}.
9589193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania     *
9599193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania     * @param apply_filter if true only metadata that matches the
9609193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania     * filter is returned. See {@see #APPLY_METADATA_FILTER} and {@see
9619193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania     * #BYPASS_METADATA_FILTER}.
9629193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania     *
9639193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania     * @return The metadata, possibly empty. null if an error occured.
9649193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania     // FIXME: unhide.
9659193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania     * {@hide}
9669193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania     */
9679193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania    public Metadata getMetadata(final boolean update_only,
9689193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania                                final boolean apply_filter) {
9695d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania        Parcel reply = Parcel.obtain();
9705d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania        Metadata data = new Metadata();
9715d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania
9725d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania        if (!native_getMetadata(update_only, apply_filter, reply)) {
9735d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania            reply.recycle();
9745d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania            return null;
9755d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania        }
9765d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania
9775d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania        // Metadata takes over the parcel, don't recycle it unless
9785d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania        // there is an error.
9795d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania        if (!data.parse(reply)) {
9805d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania            reply.recycle();
9815d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania            return null;
9825d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania        }
9835d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania        return data;
9849193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania    }
9859193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania
9869193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania    /**
9879193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania     * Set a filter for the metadata update notification and update
9889193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania     * retrieval. The caller provides 2 set of metadata keys, allowed
989b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania     * and blocked. The blocked set always takes precedence over the
990b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania     * allowed one.
9919193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania     * Metadata.MATCH_ALL and Metadata.MATCH_NONE are 2 sets available as
992b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania     * shorthands to allow/block all or no metadata.
9939193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania     *
9949193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania     * By default, there is no filter set.
9959193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania     *
9969193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania     * @param allow Is the set of metadata the client is interested
997b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania     *              in receiving new notifications for.
998b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania     * @param block Is the set of metadata the client is not interested
999b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania     *              in receiving new notifications for.
10009193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania     * @return The call status code.
10019193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania     *
10029193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania     // FIXME: unhide.
10039193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania     * {@hide}
10049193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania     */
1005b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania    public int setMetadataFilter(Set<Integer> allow, Set<Integer> block) {
1006b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania        // Do our serialization manually instead of calling
1007b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania        // Parcel.writeArray since the sets are made of the same type
1008b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania        // we avoid paying the price of calling writeValue (used by
1009b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania        // writeArray) which burns an extra int per element to encode
1010b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania        // the type.
1011b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania        Parcel request =  newRequest();
1012b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania
1013b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania        // The parcel starts already with an interface token. There
1014b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania        // are 2 filters. Each one starts with a 4bytes number to
1015b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania        // store the len followed by a number of int (4 bytes as well)
1016b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania        // representing the metadata type.
1017b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania        int capacity = request.dataSize() + 4 * (1 + allow.size() + 1 + block.size());
1018b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania
1019b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania        if (request.dataCapacity() < capacity) {
1020b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania            request.setDataCapacity(capacity);
1021b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania        }
1022b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania
1023b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania        request.writeInt(allow.size());
1024b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania        for(Integer t: allow) {
1025b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania            request.writeInt(t);
1026b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania        }
1027b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania        request.writeInt(block.size());
1028b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania        for(Integer t: block) {
1029b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania            request.writeInt(t);
1030b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania        }
1031b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania        return native_setMetadataFilter(request);
10329193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania    }
10339193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania
10349193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania    /**
10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Releases resources associated with this MediaPlayer object.
10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * It is considered good practice to call this method when you're
10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * done using the MediaPlayer.
10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void release() {
10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        stayAwake(false);
10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        updateSurfaceScreenOn();
10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOnPreparedListener = null;
10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOnBufferingUpdateListener = null;
10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOnCompletionListener = null;
10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOnSeekCompleteListener = null;
10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOnErrorListener = null;
1047c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        mOnInfoListener = null;
10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOnVideoSizeChangedListener = null;
10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        _release();
10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private native void _release();
105332f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania
10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Resets the MediaPlayer to its uninitialized state. After calling
10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this method, you will have to initialize it again by setting the
10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * data source and calling prepare().
10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void reset() {
10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        stayAwake(false);
10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        _reset();
10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // make sure none of the listeners get called anymore
10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mEventHandler.removeCallbacksAndMessages(null);
10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
106532f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania
10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private native void _reset();
106732f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania
10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1069fbb3885024ac9c90f322b6259d7e519c8927e6ffAndreas Huber     * Suspends the MediaPlayer. The only methods that may be called while
1070fbb3885024ac9c90f322b6259d7e519c8927e6ffAndreas Huber     * suspended are {@link #reset()}, {@link #release()} and {@link #resume()}.
1071fbb3885024ac9c90f322b6259d7e519c8927e6ffAndreas Huber     * MediaPlayer will release its hardware resources as far as
1072fbb3885024ac9c90f322b6259d7e519c8927e6ffAndreas Huber     * possible and reasonable. A successfully suspended MediaPlayer will
1073fbb3885024ac9c90f322b6259d7e519c8927e6ffAndreas Huber     * cease sending events.
1074fbb3885024ac9c90f322b6259d7e519c8927e6ffAndreas Huber     * If suspension is successful, this method returns true, otherwise
1075fbb3885024ac9c90f322b6259d7e519c8927e6ffAndreas Huber     * false is returned and the player's state is not affected.
1076fbb3885024ac9c90f322b6259d7e519c8927e6ffAndreas Huber     * @hide
1077fbb3885024ac9c90f322b6259d7e519c8927e6ffAndreas Huber     */
1078fbb3885024ac9c90f322b6259d7e519c8927e6ffAndreas Huber    public boolean suspend() {
1079fbb3885024ac9c90f322b6259d7e519c8927e6ffAndreas Huber        if (native_suspend_resume(true) < 0) {
1080fbb3885024ac9c90f322b6259d7e519c8927e6ffAndreas Huber            return false;
1081fbb3885024ac9c90f322b6259d7e519c8927e6ffAndreas Huber        }
1082fbb3885024ac9c90f322b6259d7e519c8927e6ffAndreas Huber
1083fbb3885024ac9c90f322b6259d7e519c8927e6ffAndreas Huber        stayAwake(false);
1084fbb3885024ac9c90f322b6259d7e519c8927e6ffAndreas Huber
1085fbb3885024ac9c90f322b6259d7e519c8927e6ffAndreas Huber        // make sure none of the listeners get called anymore
1086fbb3885024ac9c90f322b6259d7e519c8927e6ffAndreas Huber        mEventHandler.removeCallbacksAndMessages(null);
1087fbb3885024ac9c90f322b6259d7e519c8927e6ffAndreas Huber
1088fbb3885024ac9c90f322b6259d7e519c8927e6ffAndreas Huber        return true;
1089fbb3885024ac9c90f322b6259d7e519c8927e6ffAndreas Huber    }
1090fbb3885024ac9c90f322b6259d7e519c8927e6ffAndreas Huber
1091fbb3885024ac9c90f322b6259d7e519c8927e6ffAndreas Huber    /**
1092fbb3885024ac9c90f322b6259d7e519c8927e6ffAndreas Huber     * Resumes the MediaPlayer. Only to be called after a previous (successful)
1093fbb3885024ac9c90f322b6259d7e519c8927e6ffAndreas Huber     * call to {@link #suspend()}.
1094fbb3885024ac9c90f322b6259d7e519c8927e6ffAndreas Huber     * MediaPlayer will return to a state close to what it was in before
1095fbb3885024ac9c90f322b6259d7e519c8927e6ffAndreas Huber     * suspension.
1096fbb3885024ac9c90f322b6259d7e519c8927e6ffAndreas Huber     * @hide
1097fbb3885024ac9c90f322b6259d7e519c8927e6ffAndreas Huber     */
1098fbb3885024ac9c90f322b6259d7e519c8927e6ffAndreas Huber    public boolean resume() {
1099fbb3885024ac9c90f322b6259d7e519c8927e6ffAndreas Huber        if (native_suspend_resume(false) < 0) {
1100fbb3885024ac9c90f322b6259d7e519c8927e6ffAndreas Huber            return false;
1101fbb3885024ac9c90f322b6259d7e519c8927e6ffAndreas Huber        }
1102fbb3885024ac9c90f322b6259d7e519c8927e6ffAndreas Huber
1103fbb3885024ac9c90f322b6259d7e519c8927e6ffAndreas Huber        if (isPlaying()) {
1104fbb3885024ac9c90f322b6259d7e519c8927e6ffAndreas Huber            stayAwake(true);
1105fbb3885024ac9c90f322b6259d7e519c8927e6ffAndreas Huber        }
1106fbb3885024ac9c90f322b6259d7e519c8927e6ffAndreas Huber
1107fbb3885024ac9c90f322b6259d7e519c8927e6ffAndreas Huber        return true;
1108fbb3885024ac9c90f322b6259d7e519c8927e6ffAndreas Huber    }
1109fbb3885024ac9c90f322b6259d7e519c8927e6ffAndreas Huber
1110fbb3885024ac9c90f322b6259d7e519c8927e6ffAndreas Huber    /**
1111fbb3885024ac9c90f322b6259d7e519c8927e6ffAndreas Huber     * @hide
1112fbb3885024ac9c90f322b6259d7e519c8927e6ffAndreas Huber     */
1113fbb3885024ac9c90f322b6259d7e519c8927e6ffAndreas Huber    private native int native_suspend_resume(boolean isSuspend);
1114fbb3885024ac9c90f322b6259d7e519c8927e6ffAndreas Huber
1115fbb3885024ac9c90f322b6259d7e519c8927e6ffAndreas Huber    /**
11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the audio stream type for this MediaPlayer. See {@link AudioManager}
11179d96354d7055cd165d7d5625990f810f46339e52James Dong     * for a list of stream types. Must call this method before prepare() or
11189d96354d7055cd165d7d5625990f810f46339e52James Dong     * prepareAsync() in order for the target stream type to become effective
11199d96354d7055cd165d7d5625990f810f46339e52James Dong     * thereafter.
112032f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania     *
11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param streamtype the audio stream type
11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.media.AudioManager
11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native void setAudioStreamType(int streamtype);
11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the player to be looping or non-looping.
112832f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania     *
11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param looping whether to loop or not
11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native void setLooping(boolean looping);
11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Checks whether the MediaPlayer is looping or non-looping.
113532f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania     *
11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true if the MediaPlayer is currently looping, false otherwise
11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native boolean isLooping();
11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
114132f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania     * Sets the volume on this player.
11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This API is recommended for balancing the output of audio streams
11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * within an application. Unless you are writing an application to
11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * control user settings, this API should be used in preference to
11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link AudioManager#setStreamVolume(int, int, int)} which sets the volume of ALL streams of
11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a particular type. Note that the passed volume values are raw scalars.
11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * UI controls should be scaled logarithmically.
11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param leftVolume left volume scalar
11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param rightVolume right volume scalar
11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native void setVolume(float leftVolume, float rightVolume);
11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Currently not implemented, returns null.
11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @deprecated
11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native Bitmap getFrameAt(int msec) throws IllegalStateException;
116032f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania
116120cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania    /**
116220cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania     * @param request Parcel destinated to the media player. The
116320cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania     *                Interface token must be set to the IMediaPlayer
116420cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania     *                one to be routed correctly through the system.
11655d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania     * @param reply[out] Parcel that will contain the reply.
116620cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania     * @return The status code.
116720cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania     */
116820cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania    private native final int native_invoke(Parcel request, Parcel reply);
116920cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania
11705d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania
11715d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania    /**
11725d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania     * @param update_only If true fetch only the set of metadata that have
11735d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania     *                    changed since the last invocation of getMetadata.
11745d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania     *                    The set is built using the unfiltered
11755d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania     *                    notifications the native player sent to the
11765d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania     *                    MediaPlayerService during that period of
11775d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania     *                    time. If false, all the metadatas are considered.
11785d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania     * @param apply_filter  If true, once the metadata set has been built based on
11795d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania     *                     the value update_only, the current filter is applied.
11805d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania     * @param reply[out] On return contains the serialized
11815d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania     *                   metadata. Valid only if the call was successful.
11825d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania     * @return The status code.
11835d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania     */
11845d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania    private native final boolean native_getMetadata(boolean update_only,
11855d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania                                                    boolean apply_filter,
11865d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania                                                    Parcel reply);
11875d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania
1188b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania    /**
1189b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania     * @param request Parcel with the 2 serialized lists of allowed
1190b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania     *                metadata types followed by the one to be
1191b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania     *                dropped. Each list starts with an integer
1192b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania     *                indicating the number of metadata type elements.
1193b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania     * @return The status code.
1194b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania     */
1195b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania    private native final int native_setMetadataFilter(Parcel request);
1196b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania
11974935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen    private static native final void native_init();
11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private native final void native_setup(Object mediaplayer_this);
11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private native final void native_finalize();
120020cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania
12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void finalize() { native_finalize(); }
12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* Do not change these values without updating their counterparts
12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * in include/media/mediaplayer.h!
12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int MEDIA_NOP = 0; // interface test message
12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int MEDIA_PREPARED = 1;
12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int MEDIA_PLAYBACK_COMPLETE = 2;
12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int MEDIA_BUFFERING_UPDATE = 3;
12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int MEDIA_SEEK_COMPLETE = 4;
12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int MEDIA_SET_VIDEO_SIZE = 5;
12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int MEDIA_ERROR = 100;
1214c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    private static final int MEDIA_INFO = 200;
12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private class EventHandler extends Handler
12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private MediaPlayer mMediaPlayer;
12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public EventHandler(MediaPlayer mp, Looper looper) {
12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(looper);
12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mMediaPlayer = mp;
12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void handleMessage(Message msg) {
12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mMediaPlayer.mNativeContext == 0) {
12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.w(TAG, "mediaplayer went away with unhandled events");
12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            switch(msg.what) {
12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case MEDIA_PREPARED:
12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mOnPreparedListener != null)
12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mOnPreparedListener.onPrepared(mMediaPlayer);
12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case MEDIA_PLAYBACK_COMPLETE:
12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mOnCompletionListener != null)
12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mOnCompletionListener.onCompletion(mMediaPlayer);
12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                stayAwake(false);
12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case MEDIA_BUFFERING_UPDATE:
12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mOnBufferingUpdateListener != null)
12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mOnBufferingUpdateListener.onBufferingUpdate(mMediaPlayer, msg.arg1);
12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case MEDIA_SEEK_COMPLETE:
12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project              if (mOnSeekCompleteListener != null)
12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                  mOnSeekCompleteListener.onSeekComplete(mMediaPlayer);
12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project              return;
12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case MEDIA_SET_VIDEO_SIZE:
12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project              if (mOnVideoSizeChangedListener != null)
12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                  mOnVideoSizeChangedListener.onVideoSizeChanged(mMediaPlayer, msg.arg1, msg.arg2);
12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project              return;
12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case MEDIA_ERROR:
1259c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project                // For PV specific error values (msg.arg2) look in
1260c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project                // opencore/pvmi/pvmf/include/pvmf_return_codes.h
12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.e(TAG, "Error (" + msg.arg1 + "," + msg.arg2 + ")");
12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                boolean error_was_handled = false;
12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mOnErrorListener != null) {
12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    error_was_handled = mOnErrorListener.onError(mMediaPlayer, msg.arg1, msg.arg2);
12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mOnCompletionListener != null && ! error_was_handled) {
12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mOnCompletionListener.onCompletion(mMediaPlayer);
12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                stayAwake(false);
12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
1271c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project
1272c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            case MEDIA_INFO:
1273c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project                // For PV specific code values (msg.arg2) look in
1274c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project                // opencore/pvmi/pvmf/include/pvmf_return_codes.h
1275c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project                Log.i(TAG, "Info (" + msg.arg1 + "," + msg.arg2 + ")");
1276c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project                if (mOnInfoListener != null) {
1277c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project                    mOnInfoListener.onInfo(mMediaPlayer, msg.arg1, msg.arg2);
1278c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project                }
1279c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project                // No real default action so far.
1280c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project                return;
1281c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project
12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case MEDIA_NOP: // interface test message - ignore
12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            default:
12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.e(TAG, "Unknown message type " + msg.what);
12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called from native code when an interesting event happens.  This method
12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * just uses the EventHandler system to post the event back to the main app thread.
12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * We use a weak reference to the original MediaPlayer object so that the native
12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * code is safe from the object disappearing from underneath it.  (This is
12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the cookie passed to native_setup().)
12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static void postEventFromNative(Object mediaplayer_ref,
13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            int what, int arg1, int arg2, Object obj)
13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        MediaPlayer mp = (MediaPlayer)((WeakReference)mediaplayer_ref).get();
13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mp == null) {
13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mp.mEventHandler != null) {
13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Message m = mp.mEventHandler.obtainMessage(what, arg1, arg2, obj);
13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mp.mEventHandler.sendMessage(m);
13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Interface definition for a callback to be invoked when the media
13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * source is ready for playback.
13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public interface OnPreparedListener
13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Called when the media file is ready for playback.
132132f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania         *
13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param mp the MediaPlayer that is ready for playback
13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void onPrepared(MediaPlayer mp);
13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Register a callback to be invoked when the media source is ready
13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for playback.
13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1331105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * @param listener the callback that will be run
13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1333105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void setOnPreparedListener(OnPreparedListener listener)
13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
1335105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mOnPreparedListener = listener;
13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private OnPreparedListener mOnPreparedListener;
13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Interface definition for a callback to be invoked when playback of
13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a media source has completed.
13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public interface OnCompletionListener
13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Called when the end of a media source is reached during playback.
134832f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania         *
13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param mp the MediaPlayer that reached the end of the file
13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void onCompletion(MediaPlayer mp);
13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Register a callback to be invoked when the end of a media source
13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * has been reached during playback.
13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1358105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * @param listener the callback that will be run
13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1360105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void setOnCompletionListener(OnCompletionListener listener)
13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
1362105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mOnCompletionListener = listener;
13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private OnCompletionListener mOnCompletionListener;
13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Interface definition of a callback to be invoked indicating buffering
13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * status of a media resource being streamed over the network.
13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public interface OnBufferingUpdateListener
13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Called to update status in buffering a media stream.
137532f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania         *
13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param mp      the MediaPlayer the update pertains to
13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param percent the percentage (0-100) of the buffer
13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *                that has been filled thus far
13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void onBufferingUpdate(MediaPlayer mp, int percent);
13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
138232f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania
13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Register a callback to be invoked when the status of a network
13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * stream's buffer has changed.
13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1387105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * @param listener the callback that will be run.
13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1389105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void setOnBufferingUpdateListener(OnBufferingUpdateListener listener)
13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
1391105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mOnBufferingUpdateListener = listener;
13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private OnBufferingUpdateListener mOnBufferingUpdateListener;
139532f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania
13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Interface definition of a callback to be invoked indicating
13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the completion of a seek operation.
13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public interface OnSeekCompleteListener
14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Called to indicate the completion of a seek operation.
140432f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania         *
14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param mp the MediaPlayer that issued the seek operation
14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void onSeekComplete(MediaPlayer mp);
14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
140932f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania
14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Register a callback to be invoked when a seek operation has been
14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * completed.
141332f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania     *
1414105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * @param listener the callback that will be run
14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1416105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void setOnSeekCompleteListener(OnSeekCompleteListener listener)
14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
1418105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mOnSeekCompleteListener = listener;
14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
142032f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania
14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private OnSeekCompleteListener mOnSeekCompleteListener;
14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Interface definition of a callback to be invoked when the
14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * video size is first known or updated
14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public interface OnVideoSizeChangedListener
14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Called to indicate the video size
143132f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania         *
14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param mp        the MediaPlayer associated with this callback
14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param width     the width of the video
14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param height    the height of the video
14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void onVideoSizeChanged(MediaPlayer mp, int width, int height);
14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
143832f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania
14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Register a callback to be invoked when the video size is
14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * known or updated.
144232f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania     *
1443105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * @param listener the callback that will be run
14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1445105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void setOnVideoSizeChangedListener(OnVideoSizeChangedListener listener)
14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
1447105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mOnVideoSizeChangedListener = listener;
14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
144932f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania
14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private OnVideoSizeChangedListener mOnVideoSizeChangedListener;
14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* Do not change these values without updating their counterparts
14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * in include/media/mediaplayer.h!
14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Unspecified media player error.
14569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.media.MediaPlayer.OnErrorListener
14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int MEDIA_ERROR_UNKNOWN = 1;
1459c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project
14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Media server died. In this case, the application must release the
146132f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania     * MediaPlayer object and instantiate a new one.
14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.media.MediaPlayer.OnErrorListener
14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int MEDIA_ERROR_SERVER_DIED = 100;
146532f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania
1466c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    /** The video is streamed and its container is not valid for progressive
1467c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project     * playback i.e the video's index (e.g moov atom) is not at the start of the
1468c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project     * file.
14694a0029f95db144ba735b35e636400e8ce535383fNiko Catania     * @see android.media.MediaPlayer.OnErrorListener
1470c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project     */
1471c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    public static final int MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK = 200;
14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Interface definition of a callback to be invoked when there
14759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * has been an error during an asynchronous operation (other errors
14769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will throw exceptions at method call time).
14779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
14789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public interface OnErrorListener
14799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
14809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
14819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Called to indicate an error.
148232f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania         *
14839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param mp      the MediaPlayer the error pertains to
14849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param what    the type of error that has occurred:
14859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <ul>
14869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <li>{@link #MEDIA_ERROR_UNKNOWN}
14879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <li>{@link #MEDIA_ERROR_SERVER_DIED}
14889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * </ul>
1489c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project         * @param extra an extra code, specific to the error. Typically
1490c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project         * implementation dependant.
14919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return True if the method handled the error, false if it didn't.
14929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Returning false, or not having an OnErrorListener at all, will
14939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * cause the OnCompletionListener to be called.
14949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
14959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean onError(MediaPlayer mp, int what, int extra);
14969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
149732f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania
14989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
14999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Register a callback to be invoked when an error has happened
15009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * during an asynchronous operation.
150132f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania     *
1502c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project     * @param listener the callback that will be run
15039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1504c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    public void setOnErrorListener(OnErrorListener listener)
15059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
1506c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        mOnErrorListener = listener;
15079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private OnErrorListener mOnErrorListener;
1510c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project
1511c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project
1512c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    /* Do not change these values without updating their counterparts
1513c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project     * in include/media/mediaplayer.h!
1514c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project     */
1515c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    /** Unspecified media player info.
1516c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project     * @see android.media.MediaPlayer.OnInfoListener
1517c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project     */
1518c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    public static final int MEDIA_INFO_UNKNOWN = 1;
1519c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project
1520c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    /** The video is too complex for the decoder: it can't decode frames fast
1521c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project     *  enough. Possibly only the audio plays fine at this stage.
1522c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project     * @see android.media.MediaPlayer.OnInfoListener
1523c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project     */
1524c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    public static final int MEDIA_INFO_VIDEO_TRACK_LAGGING = 700;
1525c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project
15264d61f602bf67fe61256c23f090d6119992ad5160Andreas Huber    /** MediaPlayer is temporarily pausing playback internally in order to
15274d61f602bf67fe61256c23f090d6119992ad5160Andreas Huber     * buffer more data.
15284d61f602bf67fe61256c23f090d6119992ad5160Andreas Huber     */
15294d61f602bf67fe61256c23f090d6119992ad5160Andreas Huber    public static final int MEDIA_INFO_BUFFERING_START = 701;
15304d61f602bf67fe61256c23f090d6119992ad5160Andreas Huber
15314d61f602bf67fe61256c23f090d6119992ad5160Andreas Huber    /** MediaPlayer is resuming playback after filling buffers.
15324d61f602bf67fe61256c23f090d6119992ad5160Andreas Huber     */
15334d61f602bf67fe61256c23f090d6119992ad5160Andreas Huber    public static final int MEDIA_INFO_BUFFERING_END = 702;
15344d61f602bf67fe61256c23f090d6119992ad5160Andreas Huber
1535c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    /** Bad interleaving means that a media has been improperly interleaved or
1536c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project     * not interleaved at all, e.g has all the video samples first then all the
1537c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project     * audio ones. Video is playing but a lot of disk seeks may be happening.
1538c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project     * @see android.media.MediaPlayer.OnInfoListener
1539c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project     */
1540c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    public static final int MEDIA_INFO_BAD_INTERLEAVING = 800;
1541c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project
1542c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    /** The media cannot be seeked (e.g live stream)
1543c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project     * @see android.media.MediaPlayer.OnInfoListener
1544c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project     */
1545c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    public static final int MEDIA_INFO_NOT_SEEKABLE = 801;
1546c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project
15479193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania    /** A new set of metadata is available.
15489193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania     * @see android.media.MediaPlayer.OnInfoListener
15499193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania     */
15509193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania    public static final int MEDIA_INFO_METADATA_UPDATE = 802;
15519193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania
1552c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    /**
1553c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project     * Interface definition of a callback to be invoked to communicate some
1554c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project     * info and/or warning about the media or its playback.
1555c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project     */
1556c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    public interface OnInfoListener
1557c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    {
1558c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        /**
1559c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project         * Called to indicate an info or a warning.
156032f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania         *
1561c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project         * @param mp      the MediaPlayer the info pertains to.
1562c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project         * @param what    the type of info or warning.
1563c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project         * <ul>
1564c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project         * <li>{@link #MEDIA_INFO_UNKNOWN}
1565c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project         * <li>{@link #MEDIA_INFO_VIDEO_TRACK_LAGGING}
1566c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project         * <li>{@link #MEDIA_INFO_BAD_INTERLEAVING}
1567c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project         * <li>{@link #MEDIA_INFO_NOT_SEEKABLE}
15689193e08dc1d91401fdf1846eaad4689da3911dc1Nicolas Catania         * <li>{@link #MEDIA_INFO_METADATA_UPDATE}
1569c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project         * </ul>
1570c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project         * @param extra an extra code, specific to the info. Typically
1571c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project         * implementation dependant.
1572c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project         * @return True if the method handled the info, false if it didn't.
1573c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project         * Returning false, or not having an OnErrorListener at all, will
1574c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project         * cause the info to be discarded.
1575c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project         */
1576c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        boolean onInfo(MediaPlayer mp, int what, int extra);
1577c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    }
1578c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project
1579c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    /**
1580c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project     * Register a callback to be invoked when an info/warning is available.
158132f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania     *
1582c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project     * @param listener the callback that will be run
1583c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project     */
1584c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    public void setOnInfoListener(OnInfoListener listener)
1585c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    {
1586c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        mOnInfoListener = listener;
1587c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    }
1588c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project
1589c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    private OnInfoListener mOnInfoListener;
1590c39d2e3c012fb96999991e30659a474f9f30f789Marco Nelissen
1591c39d2e3c012fb96999991e30659a474f9f30f789Marco Nelissen    /**
1592c39d2e3c012fb96999991e30659a474f9f30f789Marco Nelissen     * @hide
1593c39d2e3c012fb96999991e30659a474f9f30f789Marco Nelissen     */
1594c39d2e3c012fb96999991e30659a474f9f30f789Marco Nelissen    public native static int snoop(short [] outData, int kind);
15959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1596