1

我有10 个按钮可以播放 10 首歌曲。我想实现当我在播放时按下同一个按钮时,它应该是 stop 。当我按下另一个按钮时,它应该停止上一首歌曲并播放新歌曲..
但我无法使用相同的代码实现这两件事我在使用此代码时尝试过,停止对同一个按钮不起作用,但它适用于另一首播放新歌。

  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);
    }
}

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

4

2 回答 2

0

我猜问题是在不等待 onPrepared 侦听器的情况下调用 start 。错误 (-38,0) 是无效操作,因此很可能是在尚未完成准备时调用 start。

于 2013-07-15T07:35:24.553 回答
0

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

if(mp.isPlaying())
        mp.stop();
mp.reset();
mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getDeclaredLength());
mp.prepare();
mp.start();
afd.close();
于 2013-07-13T09:03:28.427 回答