Android 列表视图中的媒体播放器
Android media player in listview
我是 android 的新手,正在构建一个带有类似于 WhatApp 或 Messenger 的语音消息的聊天室应用程序。到目前为止,我能够创建语音笔记并将其上传到我的服务器,并在设备上播放它。但是,我在思考如何处理播放时遇到了一个问题,以便一次只播放一个语音笔记。通过在 ListAdapter 中初始化媒体播放器然后在媒体播放器正在播放时调用 mp.stop() ,我一次只能获得一条消息进行播放。但是,每次我选择播放另一个语音笔记时,我的计时器和最近激活的两个语音笔记的搜索栏都会更新。
我在想,也许我处理这个问题的方式不正确。下面的代码驻留在我的视图 class.
// Runnable
private Runnable onEverySecond = new Runnable() {
@Override
public void run() {
if (!isPaused){
if (mediaPlayer.isPlaying()) {
// Update seekbar position
position = mediaPlayer.getCurrentPosition();
// Displaying time completed playing
playTime.setText(AppUtils.milliSecondsToTimer(mediaPlayer.getCurrentPosition()));
seekBar.setProgress(position);
// Running this thread after 100 milliseconds
seekBar.postDelayed(onEverySecond, 100);
}else{
if(listener != null) listener.onAudioStoppedListener(true);
}
}
}
};
// Play button
actionButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Log.d(TAG, "Play button clicked!");
if (isPaused) {
if (mediaPlayer.isPlaying()){
mediaPlayer.stop();
}
setMediaPlayer();
setIsPlaying();
mediaPlayer.seekTo(position);
mediaPlayer.start();
updateProgressBar();
} else {
mediaPlayer.pause();
setPaused();
}
}
});
private void setMediaPlayer() {
try {
String fileName = getFileName();
File filePath = new File(MyApp.getVoiceNoteDir() + fileName);
if (filePath.exists()){
mediaPlayer.reset();
mediaPlayer.setDataSource(filePath.getPath());
mediaPlayer.prepare();
seekBar.setMax(mediaPlayer.getDuration());
seekBar.setProgress(0);
playTime.setText(AppUtils.milliSecondsToTimer(mediaPlayer.getDuration()));
actionButton.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_pause_light));
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
mp.stop();
seekBar.setProgress(0);
actionButton.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_play_light));
setPaused();
}
});
}else{
checkFile();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
void setPaused(){
isPaused = true;
actionButton.setImageDrawable(ContextCompat.getDrawable(getContext(), R.drawable.ic_play_light));
}
void setIsPlaying(){
if (mediaPlayer.isPlaying()) mediaPlayer.stop();
isPaused = false;
actionButton.setImageDrawable(ContextCompat.getDrawable(getContext(), R.drawable.ic_pause_light));
}
创建一个服务来处理 MediaPlayer 操作。不要在适配器或列表中执行媒体操作。
通过为媒体操作创建单独的服务,您将拥有单个 MediaPlayer 实例。如果你要求它播放特定文件,你也可以处理 stop/reset 以前播放的文件。
我可以找到一个 tutorial link 供您通过服务执行此操作。
我是 android 的新手,正在构建一个带有类似于 WhatApp 或 Messenger 的语音消息的聊天室应用程序。到目前为止,我能够创建语音笔记并将其上传到我的服务器,并在设备上播放它。但是,我在思考如何处理播放时遇到了一个问题,以便一次只播放一个语音笔记。通过在 ListAdapter 中初始化媒体播放器然后在媒体播放器正在播放时调用 mp.stop() ,我一次只能获得一条消息进行播放。但是,每次我选择播放另一个语音笔记时,我的计时器和最近激活的两个语音笔记的搜索栏都会更新。
我在想,也许我处理这个问题的方式不正确。下面的代码驻留在我的视图 class.
// Runnable
private Runnable onEverySecond = new Runnable() {
@Override
public void run() {
if (!isPaused){
if (mediaPlayer.isPlaying()) {
// Update seekbar position
position = mediaPlayer.getCurrentPosition();
// Displaying time completed playing
playTime.setText(AppUtils.milliSecondsToTimer(mediaPlayer.getCurrentPosition()));
seekBar.setProgress(position);
// Running this thread after 100 milliseconds
seekBar.postDelayed(onEverySecond, 100);
}else{
if(listener != null) listener.onAudioStoppedListener(true);
}
}
}
};
// Play button
actionButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Log.d(TAG, "Play button clicked!");
if (isPaused) {
if (mediaPlayer.isPlaying()){
mediaPlayer.stop();
}
setMediaPlayer();
setIsPlaying();
mediaPlayer.seekTo(position);
mediaPlayer.start();
updateProgressBar();
} else {
mediaPlayer.pause();
setPaused();
}
}
});
private void setMediaPlayer() {
try {
String fileName = getFileName();
File filePath = new File(MyApp.getVoiceNoteDir() + fileName);
if (filePath.exists()){
mediaPlayer.reset();
mediaPlayer.setDataSource(filePath.getPath());
mediaPlayer.prepare();
seekBar.setMax(mediaPlayer.getDuration());
seekBar.setProgress(0);
playTime.setText(AppUtils.milliSecondsToTimer(mediaPlayer.getDuration()));
actionButton.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_pause_light));
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
mp.stop();
seekBar.setProgress(0);
actionButton.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_play_light));
setPaused();
}
});
}else{
checkFile();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
void setPaused(){
isPaused = true;
actionButton.setImageDrawable(ContextCompat.getDrawable(getContext(), R.drawable.ic_play_light));
}
void setIsPlaying(){
if (mediaPlayer.isPlaying()) mediaPlayer.stop();
isPaused = false;
actionButton.setImageDrawable(ContextCompat.getDrawable(getContext(), R.drawable.ic_pause_light));
}
创建一个服务来处理 MediaPlayer 操作。不要在适配器或列表中执行媒体操作。
通过为媒体操作创建单独的服务,您将拥有单个 MediaPlayer 实例。如果你要求它播放特定文件,你也可以处理 stop/reset 以前播放的文件。
我可以找到一个 tutorial link 供您通过服务执行此操作。