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 に答える