【问题标题】:MediaPlayer isPlaying() always returning falseMediaPlayer isPlaying() 总是返回 false
【发布时间】:2011-11-29 06:47:08
【问题描述】:

我正在 2 部手机上进行测试。在一个设备中,媒体播放器的 isPlaying() 总是返回 false,即使它正在播放。但在其他设备(lg Optimus 姜饼)中,isPlaying() 返回 true 是否正在播放,否则返回 false。

谁能告诉我为什么会这样?我的一些代码取决于这个 isPlaying() 部分,我想让它在所有设备上工作。

public void addSoundMedia(Context context, int resId){
    MediaPlayer mp = MediaPlayer.create(context, resId);
    mp.setVolume(1.0f, 1.0f);
    try{
    mPlayerList.add(mp);
    }
    catch(Exception e){}
}

public void playSoundMedia(int index){
    try{        
    mPlayerList.get(index).start();         
    }
        catch(Exception e){}
}


public MediaPlayer getPlayer(int index){
    return mPlayerList.get(index);
}

现在我正在打电话

mPlayer.getPlayer(currentPlayingPhraseIndex).isPlaying(); 
//which is now returning false. Previously i was returning true but now it always return false

而且我还匹配了对象, 这是现在的代码场景:

int phraseIndexToBePlayed = getRandomInteger(0, numberOfPhrasesSelected-1, randomPhraseGen); //get random index from 0 to (size of arraylist where i added my media) -1
currentPlayingPhraseIndex = phraseIndexToBePlayed; //for later use in another function scope

mPlayer.playSoundMedia(phraseIndexToBePlayed);

我还验证了两者是否是相同的媒体

mPlayer.getPlayer(currentPlayingPhraseIndex).equals(mPlayer.getPlayer(phraseIndexToBePlayed)); //it returns true so they are both same media

谢谢。

【问题讨论】:

  • 你检查过try catch空子句是否抛出异常吗?
  • 不,我在每次捕获中都在跟踪日志。所以还没有抛出异常。
  • 我刚刚从设备上卸载并再次从 Eclipse 重新运行/安装项目。现在它的工作。奇怪。
  • 现在对你来说可能不值得..但是在阅读 isPlaying() 之前检查一次是否调用 MediaPlayer.pause()/stop()/release()/reset(),我做到了同样的错误。

标签: java android media-player


【解决方案1】:

MediaPlayer 非常奇怪而且非常脆弱。你几乎无法判断它处于什么状态——而且你知道的任何事情最终都可能出错。

附带说明一下,我发现有时 Eclipse 可以让应用程序做一些非常奇怪、莫名其妙的事情。清理项目并重新启动 Eclipse 以及卸载和重新安装应用程序通常会处理那些非常不稳定的事情,所以当你发现似乎不可能的错误时,请务必尝试。

使用 MediaPlayer 时,请自行跟踪它应该做什么,然后永远不要相信 MediaPlayer 会处于您离开它的相同状态。每当您对 MediaPlayer 进行任何操作时,都要为那个可爱的 IllegalStateException 做好准备——也许它正在播放,也许它已准备好,也许它已暂停,但您应该做好准备,在任何时候,它都可能处于错误状态。当您以这种方式编写代码时,您对 isPlaying() 准确性的依赖就会降低。

我知道这没什么用,但不幸的是,我们没有太多替代 MediaPlayer 的方法。

【讨论】:

    【解决方案2】:

    此外,虽然我们讨论的是一般的 MediaPlayer 主题,但请注意,当在 UI 线程上调用时,isPlaying() 可能会导致 ANR。事实上,Google 建议从后台处理程序线程执行所有 MediaPlayer 调用。这还将序列化 MediaPlayer 调用的执行。

    【讨论】:

    • 是的,我一直在调用 asynctask,而不是从 UI 线程。以上只是一个代码sn-p。谢谢。
    • Google 已向我确认 MediaPlayer 不是线程安全的,因此必须由客户端同步访问。因此,不需要在 AsyncTask 中运行每个 MediaPlayer 调用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-20
    • 2021-11-05
    • 2018-11-05
    • 2019-05-06
    • 2017-04-29
    • 2013-04-30
    相关资源
    最近更新 更多