我已經搜索並研究了stackoverflow和谷歌,但無法找到任何答案我的問題。我發現了其他問題和答案,但這與保存在應用程序中的聲音有關,但是我創建了一個應用程序,它從Parse服務器獲取數據,因此它獲取mp3文件並在listview中顯示這些內容,並且與單擊某個項目時相比播放該曲目。但問題在於:當您播放聲音並點擊另一個聲音時,第一個不會停止,第二個會開始播放。 我已經嘗試使用下面的代碼,但它只是不工作。 這裏是我的代碼:Android MediaPlayer:多個聲音同時播放。我的代碼是
play.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final MediaPlayer mediaPlayer = new MediaPlayer();
final MediaPlayer scndmediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
scndmediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
if (mediaPlayer.isPlaying()) {
Toast.makeText(getContext(), "First is playing", Toast.LENGTH_SHORT).show();
try {
mediaPlayer.stop();
scndmediaPlayer.setDataSource(audioFileURL);
scndmediaPlayer.prepare();
scndmediaPlayer.start();
//soundtoolbar.setTitle(name);
} catch (IllegalArgumentException e1) {
e1.printStackTrace();
} catch (SecurityException e1) {
e1.printStackTrace();
} catch (IllegalStateException e1) {
e1.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} else {
try {
if (scndmediaPlayer.isPlaying()){
scndmediaPlayer.stop();
}
Toast.makeText(getContext(), "First is starting", Toast.LENGTH_SHORT).show();
mediaPlayer.setDataSource(audioFileURL);
mediaPlayer.prepare();
mediaPlayer.start();
soundtoolbar.setTitle(name);
} catch (IllegalArgumentException e1) {
e1.printStackTrace();
} catch (SecurityException e1) {
e1.printStackTrace();
} catch (IllegalStateException e1) {
e1.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
playPause.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mediaPlayer.isPlaying() || scndmediaPlayer.isPlaying()) {
mediaPlayer.pause();
scndmediaPlayer.pause();
playPause.setBackground(getContext().getDrawable(R.drawable.ic_play_arrow_white_24dp));
} else {
mediaPlayer.start();
scndmediaPlayer.start();
playPause.setBackground(getContext().getDrawable(R.drawable.ic_pause_white_24dp));
}
}
});
}
});
我創建2個mediaplayers與上面的代碼,當用戶點擊播放按鈕它首先檢查是否有任何的播放器正在運行。 我試圖達到以下目的:當用戶點擊播放按鈕時,它會檢查(1st)mediaPlayer
是否在運行。如果它正在運行,它只是停止它並啓動(第二)scndmediaPlayer
或反之亦然...如果第二個正在播放它停止並啓動第一個。所以它會創建一個循環:1st正在播放?用戶首先點擊另一個按鈕。第二個啓動。用戶點擊另一個按鈕。首先是玩?第二是玩?是。停下來,開始第一個。 但無法找到我的代碼中的問題。 請幫我這個。我想在2天內解決,但我不能... 謝謝:)
編輯:我使用一個MediaPlayer的,並做了以下嘗試:檢查MediaPlayer正在玩!不,它不是在玩。啓動它。用戶再次單擊該按鈕,它會停止mediaplayer並使用新的audioFileUrl啓動它。但。 MediaPlayer忘記它正在播放。似乎它只是開始軌道,而不是忘記,並檢查是否是真的我設置了一個敬酒:當mediaplayer沒有播放吐司節目時,它顯示每次我點擊列表中的一個軌道,這意味着它忘記了它有一個正在播放的曲目...
編輯2:我設法做到以下幾點:它播放曲目。用戶點擊另一首曲目。它會停止媒體播放器,但不會播放新曲目。用戶再次點擊。它播放着新的曲目。用戶點擊新的跟蹤和應用程序崩潰...
編輯3:發佈我的整個類:
public class MyAdapter extends ParseQueryAdapter<ParseObject> {
public Button playPause, next, previous;
public Toolbar soundtoolbar;
boolean isPlaying = false;
public MyAdapter(Context context) {
super(context, new ParseQueryAdapter.QueryFactory<ParseObject>() {
public ParseQuery create() {
ParseQuery query = new ParseQuery("MyClass");
query.orderByDescending("createdAt");
return query;
}
});
}
@Override
public View getItemView(final ParseObject object, View v, final ViewGroup parent) {
if (v == null) {
v = View.inflate(getContext(), R.layout.activity_audio_files_item, null);
}
super.getItemView(object, v, parent);
final Button play = (Button) v.findViewById(R.id.play);
playPause = TabFragment1.playPause;
next = TabFragment1.next;
previous = TabFragment1.previous;
soundtoolbar = TabFragment1.soundtoolbar;
final ParseFile descr = object.getParseFile("audiofile");
final String name = object.getString("name");
final String audioFileURL = descr.getUrl();
final SlidingUpPanelLayout slidingUpPanelLayout = TabFragment1.spanel;
play.setText(name);
final MediaPlayer mediaPlayer = new MediaPlayer();
play.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (isPlaying != true) {
Toast.makeText(getContext(), name+" is playing", Toast.LENGTH_SHORT).show();
try {
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource(audioFileURL);
mediaPlayer.prepareAsync();
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
soundtoolbar.setTitle(name);
slidingUpPanelLayout.setPanelState(SlidingUpPanelLayout.PanelState.EXPANDED);
mediaPlayer.start();
isPlaying = true;
}
});
} catch (IllegalArgumentException e1) {
e1.printStackTrace();
} catch (SecurityException e2) {
e2.printStackTrace();
} catch (IllegalStateException e3) {
e3.printStackTrace();
} catch (IOException e4) {
e4.printStackTrace();
} catch (NullPointerException e5) {
e5.printStackTrace();
}
} else {
mediaPlayer.stop();
Toast.makeText(getContext(), "Starting "+name, Toast.LENGTH_SHORT).show();
try {
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.prepareAsync();
mediaPlayer.setDataSource(audioFileURL);
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
soundtoolbar.setTitle(name);
slidingUpPanelLayout.setPanelState(SlidingUpPanelLayout.PanelState.EXPANDED);
mediaPlayer.start();
}
});
} catch (IllegalArgumentException e1) {
e1.printStackTrace();
} catch (SecurityException e2) {
e2.printStackTrace();
} catch (IllegalStateException e3) {
e3.printStackTrace();
} catch (IOException e4) {
e4.printStackTrace();
} catch (NullPointerException e5){
e5.printStackTrace();
}
}
playPause.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mediaPlayer.isPlaying()) {
mediaPlayer.pause();
playPause.setBackground(getContext().getDrawable(R.drawable.ic_play_arrow_white_24dp));
} else {
mediaPlayer.start();
playPause.setBackground(getContext().getDrawable(R.drawable.ic_pause_white_24dp));
}
}
});
}
});
return v;
}
}
有人請幫助...
我不熟悉SoundPool,所以我想繼續使用MediaPlayer。我嘗試使用一個MediaPlayer並執行以下操作:檢查mediaplayer是否正在播放!不,它不是在玩。啓動它。用戶再次單擊該按鈕,它會停止mediaplayer並使用新的audioFileUrl啓動它。但。 MediaPlayer忘記它正在播放。似乎它只是開始軌道,而不是忘記,並檢查它是否屬實我設置了Toast:當mediaplayer沒有播放Toast節目時,每當我點擊列表中的一個曲目,這意味着它忘記它有一個軌道正在播放... – Asama
我遇到過與您類似的mediaPlayer問題。然後,我將視圖更改爲我的代碼。可以使用一個密鑰來存儲mediaPlayer狀態,然後檢查它的形式。 –
請檢查我的編輯3.我發佈了我的整個班級。也許現在很容易理解...... – Asama