在android中一个接一个播放声音文件
我试图在android中播放“res/raw”文件夹中的声音。但它只播放声音阵列中的第一个声音。还有别的办法吗 原始文件夹中有三个声音文件 1.aa.ogg 2.ma.ogg 3.ar.ogg在android中一个接一个播放声音文件,android,Android,我试图在android中播放“res/raw”文件夹中的声音。但它只播放声音阵列中的第一个声音。还有别的办法吗 原始文件夹中有三个声音文件 1.aa.ogg 2.ma.ogg 3.ar.ogg package com.protonray.calculatorplus; 导入java.util.List; 导入android.media.MediaPlayer; 导入android.media.MediaPlayer.OnCompletionListener; 导入android.os.Bundl
package com.protonray.calculatorplus;
导入java.util.List;
导入android.media.MediaPlayer;
导入android.media.MediaPlayer.OnCompletionListener;
导入android.os.Bundle;
导入android.view.view;
导入android.widget.Button;
导入android.widget.EditText;
导入android.app.Activity;
公共类布局新扩展活动{
整数计数=0;
int[]发音={R.raw.aa,R.raw.ma,R.raw.ar};
MediaPlayer mp=新的MediaPlayer();
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_new);
按钮播放=(按钮)findViewById(R.id.play);
play.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图arg0){
//TODO自动生成的方法存根
计数=0;
//播放第一个声音
mp=MediaPlayer.create(LayoutNew.this,听起来像[count]);
mp.start();
计数=1;
}
});
mp.setOnCompletionListener(新的OnCompletionListener(){
@凌驾
完成时的公共作废(MediaPlayer mp){
//TODO自动生成的方法存根
如果(count仅根据您的代码判断,请尝试将您的mp.setOnCompletionListener
放在onClick
中。此外,我认为您不需要mp.stop
查看一下。这应该可以满足您的需要
只需在onClick
中创建3个媒体播放器(每个声音文件一个),然后将前两个文件的下一个播放器设置为下一个文件的播放器,例如:
play.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
for ( int snd = 0; snd < 3; snd++ ) {
mp[snd] = MediaPlayer.create( LayoutNew.this, sounds[snd] );
}
for ( int snd = 0; snd < 2; snd++ ) {
mp[snd].setNextMediaPlayer( mp[snd+1] );
}
);
我没有测试这段代码,但它应该可以工作。关键是每次创建新的MediaPlayer时都需要调用setOnCompletionListener
,以便新实例在完成时通知您
另外,因为您正在onClick
中设置所有内容(一次完成)除非你真的想使用计数器,或者有其他充分的理由,否则你不需要使用计数器。无论哪种方式,这都应该充分说明你做错了什么,以及如何做到这一点以使其工作。谢谢你……它部分工作了……我已将“mp.setOnCompletionListener”放在“onclick”中它只工作一次,即只播放声音[0]和声音[1]。你能告诉我这里有什么问题吗?我个人认为你做的工作太多了,我只是在你的onClick
方法中执行whileloop
,然后创建一个playSound
方法来处理MediaPLayer。伪代码:While(在播放所有音频文件之前,它会停止整个活动。API级别8不支持setNextMediaPlayer(arg0)方法…现在我该怎么办?然后您可以使用代码中当前使用的方法,但需要做一些更改。我已将此添加到答案中:)谢谢你…实际上声音文件不是常数…它是动态的…我已经用循环函数解决了这个问题。。。。
play.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
for ( int snd = 0; snd < 3; snd++ ) {
mp[snd] = MediaPlayer.create( LayoutNew.this, sounds[snd] );
}
for ( int snd = 0; snd < 2; snd++ ) {
mp[snd].setNextMediaPlayer( mp[snd+1] );
}
);
MediaPlayer mp;
play.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View arg0) {
mp = MediaPlayer.create( LayoutNew.this, sounds[0] );
mp.start();
mp.setOnCompletionListener( new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
mp.dispose();
mp = MediaPlayer.create( LayoutNew.this, sounds[1] );
mp.start();
mp.setOnCompletionListener( new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
mp.dispose();
mp = MediaPlayer.create( LayoutNew.this, sounds[2] );
mp.start();
mp.setOnCompletionListener( new OnCompletionListener() {
public void onCompletion(MediaPlayer mp) {
mp.dispose();
mp = null;
}
});
}
});
}
});
}
}