Android开发之视频播放调用setVideoPath()方法

当setVideoPath()的时候,底层是这个走的:

setVideoPath()-->setVideoURI()-->openVideo();

openVideo()只是setVideoURI()中的一部分,还有的没有写出来,下面看一下openVideo的具体内容:

 1 private void openVideo() {
 2         if (mUri == null || mSurfaceHolder == null) {
 3             // not ready for playback just yet, will try again later
 4             return;
 5         }
 6         // we shouldn‘t clear the target state, because somebody might have
 7         // called start() previously
 8         release(false);
 9
10         AudioManager am = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
11         am.requestAudioFocus(null, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);
12
13         try {
14             mMediaPlayer = new MediaPlayer();
15             // TODO: create SubtitleController in MediaPlayer, but we need
16             // a context for the subtitle renderers
17             final Context context = getContext();
18             final SubtitleController controller = new SubtitleController(
19                     context, mMediaPlayer.getMediaTimeProvider(), mMediaPlayer);
20             controller.registerRenderer(new WebVttRenderer(context));
21             controller.registerRenderer(new TtmlRenderer(context));
22             controller.registerRenderer(new Cea708CaptionRenderer(context));
23             controller.registerRenderer(new ClosedCaptionRenderer(context));
24             mMediaPlayer.setSubtitleAnchor(controller, this);
25
26             if (mAudioSession != 0) {
27                 mMediaPlayer.setAudioSessionId(mAudioSession);
28             } else {
29                 mAudioSession = mMediaPlayer.getAudioSessionId();
30             }
31             mMediaPlayer.setOnPreparedListener(mPreparedListener);
32             mMediaPlayer.setOnVideoSizeChangedListener(mSizeChangedListener);
33             mMediaPlayer.setOnCompletionListener(mCompletionListener);
34             mMediaPlayer.setOnErrorListener(mErrorListener);
35             mMediaPlayer.setOnInfoListener(mInfoListener);
36             mMediaPlayer.setOnBufferingUpdateListener(mBufferingUpdateListener);
37             mCurrentBufferPercentage = 0;
38             mMediaPlayer.setDataSource(mContext, mUri, mHeaders);
39             mMediaPlayer.setDisplay(mSurfaceHolder);
40             mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
41             mMediaPlayer.setScreenOnWhilePlaying(true);
42             mMediaPlayer.prepareAsync();
43
44             for (Pair<InputStream, MediaFormat> pending: mPendingSubtitleTracks) {
45                 try {
46                     mMediaPlayer.addSubtitleSource(pending.first, pending.second);
47                 } catch (IllegalStateException e) {
48                     mInfoListener.onInfo(
49                             mMediaPlayer, MediaPlayer.MEDIA_INFO_UNSUPPORTED_SUBTITLE, 0);
50                 }
51             }
52
53             // we don‘t set the target state here either, but preserve the
54             // target state that was there before.
55             mCurrentState = STATE_PREPARING;
56             attachMediaController();
57         } catch (IOException ex) {
58             Log.w(TAG, "Unable to open content: " + mUri, ex);
59             mCurrentState = STATE_ERROR;
60             mTargetState = STATE_ERROR;
61             mErrorListener.onError(mMediaPlayer, MediaPlayer.MEDIA_ERROR_UNKNOWN, 0);
62             return;
63         } catch (IllegalArgumentException ex) {
64             Log.w(TAG, "Unable to open content: " + mUri, ex);
65             mCurrentState = STATE_ERROR;
66             mTargetState = STATE_ERROR;
67             mErrorListener.onError(mMediaPlayer, MediaPlayer.MEDIA_ERROR_UNKNOWN, 0);
68             return;
69         } finally {
70             mPendingSubtitleTracks.clear();
71         }
72     }

从31行看,可以知道,执行setVideoPath()会重新执行VideoView的监听事件,会重新prepared等等。。。

时间: 2024-10-08 17:04:04

Android开发之视频播放调用setVideoPath()方法的相关文章

C#程序员学习Android开发系列之调用WebService

我在学习Android开发过程中遇到的第一个疑问就是Android客户端是怎么跟服务器数据库进行交互的呢?这个问题是我当初初次接触Android时所困扰我的一个很大的问题,直到几年前的一天,我突然想到WebService是否可以呢?让WebService充当服务器端的角色,完成与服务器数据库操作相关的事情,而Android客户端只要按照WebService方法参数的要求去调用就行了.在当时我对这个解决方案的实现还没模糊,我想这个问题也是初学Android的朋友肯定会想到的问题.那么现在就让我们动

android开发 Fragment嵌套调用常见错误

在activity中有时需要嵌套调用fragment,但嵌套调用往往带来视图的显示与预期的不一样或是fragment的切换有问题.在使用时要注意几点: 1.fragment中嵌套fragment,子fragment视图无法显示: 如下: 父fragment的.xml文件: <pre name="code" class="html"><LinearLayout xmlns:android="http://schemas.android.co

android ListView 多次调用 getView方法

<ListView            android:layout_width="match_parent"            android:layout_height="match_parent"             android:id="@+id/alarm_list"></ListView> ListView 的高度 必须要设置成一个明确的值 或者match_parent  不然就会调用多次getVi

Android开发中退出程序几种方法

参考:http://johncookie.iteye.com/blog/890734 Android程序有很多Activity,比如说主窗口A,调用了子窗口B,子窗口B又调用子窗口C,back返回子窗口B后,在B中如何关闭整个Android应用程序呢? 这里用到几种方法. 1.finish()方法 finish是Activity的类,仅仅针对Activity,当调用finish()时,只是将活动推向后台,并没有立即释放内存,活动的资源并没有被清理:调用finish()方法会执行Activity.

Android开发实例透明效果设置方法

没什么android开发经验的朋友来说,实现透明效果是有一定难度的,我看见麦子学院android开发视频上面讲了三种方法来实现透明效果,这三种方法非常不错,嘿嘿,就抄下来分享给大家. 1.设置alpha View v = findViewById(R.id.content);/到你要设透明背景的layout 的id  v.getBackground().setAlpha(100);//0~255透明度值  2.用ARGB来控制 半透明<Button android:background="

Android开发系列之调用WebService

我在学习Android开发过程中遇到的第一个疑问就是Android客户端是怎么跟服务器数据库进行交互的呢?这个问题是我当初初次接触Android时所困扰我的一个很大的问题,直到几年前的一天,我突然想到WebService是否可以呢?让WebService充当服务器端的角色,完成与服务器数据库操作相关的事情,而Android客户端只要按照WebService方法参数的要求去调用就行了.在当时我对这个解决方案的实现还没模糊,我想这个问题也是初学Android的朋友肯定会想到的问题.那么现在就让我们动

Android Fragment隐藏显示调用的方法

//在Activity中加载显示隐藏Fragment import android.app.Activity; import android.app.FragmentManager; import android.app.FragmentTransaction; import android.content.Intent; import android.os.Bundle; import com.commons.Config; import com.geluyawangluo.withtheni

Android开发心得——viewpager调用setCurrentItem设页面没有滑动效果?我来帮你

本博文欢迎转载,转载请注明来自唔系好人之Android小码农 最近做项目,遇到一个焦点图的问题,而我,在这段时间可以说是viewpager的爱好者,虽然有很多优秀的开源项目,但是我还是想要研究一下,viewpager,怎么自己做带有滑动效果的焦点图切换. 通过一轮的网络搜索,最终研究到一个方法通过反射来获取viewpager的内部属性,然后设置他的滑动属性. 说实话,对于我这种半路出家的和尚来说,反射是个什么真的不懂,我也是听同事说的,他这个反射的作用就是强制获取了一个并不公开的内部属性,并修改

Android开发——diglog cancel与dismiss方法区别

AlertDialog dismiss 和 cancel方法的区别 AlertDialog使用很方便,但是有一个问题就是:dismiss方法和cancel方法到底有什么不同? 今天有时间,看了看源码(其实源码并不是全都那么深奥的!~~). AlertDialog继承与Dialog,现在各位看看结构图: 然后在Dialog类中找到了dismiss和cancel方法的实现.重要看dismiss的源码: Java代码   public void cancel() { if (mCancelMessag