Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/209.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android VideoView(StagefrightPlayer)调用setDataSource()两次_Android - Fatal编程技术网

Android VideoView(StagefrightPlayer)调用setDataSource()两次

Android VideoView(StagefrightPlayer)调用setDataSource()两次,android,Android,我正在使用VideoView背靠背播放视频,我注意到在我的代码第一次播放视频后,StagefrightPlayer对上一个文件执行setDataSource()。紧接着,它对相应的文件执行setDataSource()操作 例如 第一次播放视频时: I/Slideshow( 1206): showing video: video1 I/StagefrightPlayer( 876): setDataSource('/mnt/sdcard/cache/video1') I/Slideshow(

我正在使用VideoView背靠背播放视频,我注意到在我的代码第一次播放视频后,StagefrightPlayer对上一个文件执行setDataSource()。紧接着,它对相应的文件执行setDataSource()操作

例如

第一次播放视频时:

I/Slideshow( 1206): showing video: video1
I/StagefrightPlayer(  876): setDataSource('/mnt/sdcard/cache/video1')
I/Slideshow( 1206): showing video: video2
I/StagefrightPlayer(  876): setDataSource('/mnt/sdcard/cache/video1')
I/StagefrightPlayer(  876): setDataSource('/mnt/sdcard/cache/video2')
第二次(以及之后的任何一次)播放视频:

I/Slideshow( 1206): showing video: video1
I/StagefrightPlayer(  876): setDataSource('/mnt/sdcard/cache/video1')
I/Slideshow( 1206): showing video: video2
I/StagefrightPlayer(  876): setDataSource('/mnt/sdcard/cache/video1')
I/StagefrightPlayer(  876): setDataSource('/mnt/sdcard/cache/video2')
播放视频的代码:

        Log.i(TAG, "showing video: "+strfilename);
        final String strConstFilename = strfilename;
        mActivity.runOnUiThread(new Runnable()
        {
            public void run()
            {
                mVideoView.setVisibility(View.VISIBLE);

                File file = new File(Environment.getExternalStorageDirectory(), strConstFilename);
                mVideoView.setVideoPath(file.getAbsolutePath());

                if (mOnCompletionListener != null)
                {
                    mVideoView.setOnCompletionListener(new OnVideoCompletionListener());
                }
                mVideoView.requestFocus();
                mVideoView.start();
            }
        });

它似乎没有破坏任何东西,但如果我做错了什么,我希望更正代码。

这是由于
VideoView.java
中的代码造成的,内部函数
openVideo()
实际上执行
MediaPlayer.setDataSource
在调用
setVideoPath
时被多次调用,创建曲面后,在resume()中

在本例中,当您第二次播放时,我认为首先是surface创建的回调,因此它使用前面的文件路径。然后执行
setVideoPath
,因此这次使用正确的文件


它工作得很好,因为当你调用
start
时,已经设置了正确的视频文件。

谢谢你的解释:-)听起来像是谷歌代码中的一个bug