使用播放/停止按钮时出错

时间:2013-07-13 08:45:00

标签: android button android-mediaplayer

我有 10个按钮可播放10首歌曲。我希望在播放时按下相同的按钮,它应该停止。当我按下另一个按钮时,它应该停止前一首歌曲并播放新歌曲。
但我无法使用相同的代码实现这两件事 我试过了 当我使用这段代码时,停止不适用于同一个按钮,但它适用于另一首新歌。

  private void playSample(int[] res, int position)
  {

    AssetFileDescriptor afd = getApplicationContext().getResources().openRawResourceFd(res[position]);
    try
    {   if(mp.isPlaying())
    {
        mp.stop();
    }
        mp.reset();
        mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getDeclaredLength());
        mp.prepare();
        mp.start();
        afd.close();
    }
    catch (IllegalArgumentException e)
    {
        Log.e(TAG, "Unable to play audio queue do to exception: " + e.getMessage(), e);
    }
    catch (IllegalStateException e)
    {
        Log.e(TAG, "Unable to play audio queue do to exception: " + e.getMessage(), e);
    }
    catch (IOException e)
    {
        Log.e(TAG, "Unable to play audio queue do to exception: " + e.getMessage(), e);
    }
 }     

所以我试过这样的

   private void playSample(int[] res, int position)
   {

    AssetFileDescriptor afd = getApplicationContext().getResources().openRawResourceFd(res[position]);

    try
    {   if(mp.isPlaying())
    {
        mp.stop();
    }else
        mp.reset();
        mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getDeclaredLength());
        mp.prepare();
        mp.start();
        afd.close();
    }
    catch (IllegalArgumentException e)
    {
        Log.e(TAG, "Unable to play audio queue do to exception: " + e.getMessage(), e);
    }
    catch (IllegalStateException e)
    {
        Log.e(TAG, "Unable to play audio queue do to exception: " + e.getMessage(), e);
    }
    catch (IOException e)
    {
        Log.e(TAG, "Unable to play audio queue do to exception: " + e.getMessage(), e);
    }
}

现在停止将适用于相同的按钮。但是当我在播放时按下另一个按钮。它不会启动新歌

2 个答案:

答案 0 :(得分:0)

检查播放的媒体是否只是停止并播放请求的媒体。不需要else

if(mp.isPlaying())
        mp.stop();
mp.reset();
mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getDeclaredLength());
mp.prepare();
mp.start();
afd.close();

答案 1 :(得分:0)

我猜问题是在没有等待onPrepared监听器的情况下调用start。错误(-38,0)是无效操作,所以当它甚至没有完成准备时,它们大多可能是调用start。