2016-08-18 52 views
2

打在继承的声音时,我发现下面的代码作为一个答案在这里的一个问题Playing multiple files in MediaPlayer one after other In android应用程序崩溃的MediaPlayer的

当我运行它,在3种播放声音,但随后该应用程序与消息

关闭

不幸的是应用程序已停止。

onCompletion方法里面有什么缺失吗?

public class MainActivity extends Activity implements MediaPlayer.OnCompletionListener { 

    int[] tracks = new int[3]; 
    int currentTrack = 0; 
    private MediaPlayer mediaPlayer = null; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     tracks[0] = R.raw.p46; 
     tracks[1] = R.raw.p52; 
     tracks[2] = R.raw.p55; 
     mediaPlayer = MediaPlayer.create(getApplicationContext(), tracks[currentTrack]); 
     mediaPlayer.setOnCompletionListener(this); 
     mediaPlayer.start(); 
    } 

    public void onCompletion(MediaPlayer arg0) { 
     arg0.release(); 
     if (currentTrack < tracks.length) { 
      currentTrack++; 
      arg0 = MediaPlayer.create(getApplicationContext(), tracks[currentTrack]); 
      arg0.setOnCompletionListener(this); 
      arg0.start(); 
     } 
    } 
+2

我认为这只是你的if语句的错误。在范围检查之后,您正在增加'currentTrack',导致超出范围的异常。 – Jack

+0

我认为这个错误来自'arg0.setOnCompletionListener(this);'在你的onCompletion方法中尝试删除它,看它是否在第一首歌曲后没有抛出错误 –

回答

3

更改此:

public void onCompletion(MediaPlayer arg0) { 
     arg0.release(); 
     if (currentTrack < tracks.length) { 
      currentTrack++; 
      arg0 = MediaPlayer.create(getApplicationContext(), tracks[currentTrack]); 
      arg0.setOnCompletionListener(this); 
      arg0.start(); 
     } 
    } 

到:

public void onCompletion(MediaPlayer arg0) { 
     arg0.release(); 
     currentTrack++; 
     if (currentTrack < tracks.length) { 

      arg0 = MediaPlayer.create(getApplicationContext(), tracks[currentTrack]); 
      arg0.setOnCompletionListener(this); 
      arg0.start(); 
     } 
    } 

基本上你得到一个ArrayIndexOutofBoundException最后currentTrack becoz为3,并没有项目在指数3,即第4项

+0

这解决了这个问题,但现在如果我移动声音从onCreate播放代码到buttonTapped,应用程序再次崩溃。 'public void buttonTapped(View view){ tracks [0] = R.raw.pianoff46; tracks [1] = R.raw.pianoff52; tracks [2] = R.raw.pianoff55; mediaPlayer = MediaPlayer.create(getApplicationContext(),tracks [currentTrack]); mediaPlayer.setOnCompletionListener(this); mediaPlayer.start(); } –

+1

请接受答案,如果有帮助 –

+1

这是一个不同的问题,请为此打开另一个问题,并且这次也要发布堆栈跟踪 –