Android媒体播放器setDataSource()方法抛出IllegalStateException错误

4

我使用几乎相同的代码来播放两个视频,第一个视频可以完美播放,但是第二个却无法播放。当我按下下一个视频按钮时,程序会崩溃,并显示以下错误信息:

WARN/System.err(15726): java.lang.IllegalStateException
WARN/System.err(15726):     at android.media.MediaPlayer.setDataSource(Native Method)

源代码:

第一段示例代码:

    mediaPlayer = new MediaPlayer();
    playURI = receiveIntent.getStringExtra("playURI");
    showDebugInfo("play uri "+playURI);
    Log.e("Gplayer on create", "play uri "+playURI);
    try {
        mediaPlayer.setDataSource(playURI);
    } catch (IllegalArgumentException e) {
        Log.v(LOGTAG, e.getMessage());
        finish();
    } catch (IllegalStateException e) {
        Log.v(LOGTAG, e.getMessage());
        finish();
    } catch (IOException e) {
        Log.v(LOGTAG, e.getMessage());
        finish();
    }

当按下下一个按钮时,它会运行以下代码:
   String uri = listAdapter.getItem(position).getItem().getFirstResource().getValue();
    showDebugInfo(" Uri "+uri);
    if(mediaPlayer != null){
        mediaPlayer.stop();
    }
    try {
        mediaPlayer.reset();
        mediaPlayer.setDataSource(uri);
        mediaPlayer.prepareAsync();
    } catch (IllegalStateException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        finish();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        finish();
    }

为什么会这样呢?我检查了两部分,唯一的不同是第一部分新建了一个媒体播放器,而第二部分则是让媒体播放器停止并重置,然后再进行相同操作。

"几乎相同的代码"。你能把它们都展示一下吗?另外,你是如何处理“下一个视频”按钮的点击事件处理程序的?你现在的方式应该可以工作。 - Kevin Coppock
很多时候,这些类型的错误与您尝试播放的媒体文件的文件权限有关。 - Thunder Rabbit
如果您更改视频的顺序,那么崩溃的视频首先播放会发生什么?是第二个视频总是有问题,还是只有那个特定的视频有问题? - Chad Schultz
@ChadSchultz,总是第二个视频有问题,而不是特定的一个。 - zyunchen
@ThunderRabbit 我认为问题不是这个原因,因为有两个视频A和B,无论我先播放哪一个,都能正常工作,而第二个却不能。 - zyunchen
@kcoppock,我已经添加了这两部分代码。你有什么想法吗? - zyunchen
1个回答

4

我曾遇到过同样的问题。

在调用第二个视频的mediaPlayer.setDataSource(uri);之前,您需要调用mediaPlayer.reset();。原因是,因为函数mediaPlayer.setDataSource(uri);只能在空闲状态下调用,而mediaPlayer.reset();是将您带入空闲状态的函数。

我从这个答案中理解了这一点,尽管问题有些不同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接