首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >列表视图中的Android媒体播放器

列表视图中的Android媒体播放器
EN

Stack Overflow用户
提问于 2015-11-13 00:04:10
回答 1查看 1.3K关注 0票数 1

我是安卓系统的新手,我开发了一个聊天室应用程序,其语音信息类似于WhatApp或Messenger。到目前为止,我能够创建并上传语音笔记到我的服务器,以及在设备上播放它。然而,我有一个问题,围绕着我的头,我应该如何处理回放,以便只有一个声音音符是在一次播放。通过在ListAdapter中初始化媒体播放器,然后在mediaplayer播放时调用mp.stop(),我一次只能得到一条要播放的消息。然而,每次我选择播放另一个语音注意事项,我的计时器和查找条的最后两个语音音符激活正在更新。

我在想,也许我是不正确地处理这个问题。下面的代码驻留在我的视图类中。

代码语言:javascript
复制
// 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));
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-13 00:08:32

创建一个服务来处理MediaPlayer操作。不要在适配器或列表中做媒体内容。

通过为媒体操作创建单独的服务,您将拥有一个MediaPlayer实例。如果您要求它播放特定的文件,您还可以处理停止/重置以前的播放文件。

我可以通过服务为您找到一个教程链接来完成这个任务。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33683729

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档