话不多说先上效果

android 播放声音功能 android实现音乐播放器_Android播放音乐

前言

写这个音乐播放器实在是迫不得已。因为我们Andoird课程要求写一个音乐播放器。所以就有了此项目。这个项目比较简单,实现了最基本的音乐播放功能,然后界面是仿照着网易云音乐的样式写的想写成一样但是技术不够QWQ

基本的音乐播放

设置播放音乐文件

Android播放媒体文件大概都是使用MediaPlayer这个类来操作的。
在播放音乐前,必须要给这个MediaPlayer设置一要播放的东西,对于文件资源来说(音乐,视频都算一种文件资源),能够唯一标识它的就是文件的地址(路径)。我们这里使用的是本机音乐,那么就使用文件路径就可以。

private static final MediaPlayer mediaPlayer = new MediaPlayer();
 	/**
     *  设置播放文件
     * @param path
     */
    public static void setPlayPath(String path){
        try {
            // 设置类型
            mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
            // 这里要reset一下啊 (当已经设置过音乐后,再调用此方法时,没有reset就会异常)
            mediaPlayer.reset();
            mediaPlayer.setDataSource(path);// 设置文件源
            mediaPlayer.prepare();// 解析文件
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

播放音乐

设置完播放文件后,下一步就是音乐的播放、暂停、跳进度播放等等。
这里先介绍MediaPlayer的自带方法

mediaPlayer.isPlaying();// 是否正在播放
	mediaPlayer.start();	// 开始播放,如果已经在播放不会有什么效果 (好像也可以当继续播放使用 不过最好不要)
	mediaPlayer.resume();	// 继续播放
	mediaPlayer.stop();		// 停止播放 - 不可以使用start重新开始
	mediaPlayer.pause();	// 暂停当前播放
	mediaPlayer.seekTo(0);	// 移动到某一播放进度
	mediaPlayer.getCurrentPosition();// 获取当前播放进度
	mediaPlayer.getDuration();//获取当前音乐的长度(单位 mm毫秒)

了解了上面的方法后那么就可以实现几乎所有的音乐播放功能。
那么要实现音乐播放功能只需要在调用了setPlayPath(path)后再调用mediaPlayer.start()就能成功的播放音乐前提条件是你确实的设置了正确的音乐路径

获取音乐的信息

获取音乐信息可以使用MediaMetadataRetriever类来获取。它和MediaPlayer也需要一个文件路径来寻找到音乐。

private static final MediaMetadataRetriever mmr = new MediaMetadataRetriever();
    public static Song getSong(String path){
        Song song = new Song();// 自己定义的歌曲类
        song.setPath(path);
        // 获取音乐相关信息
        mmr.setDataSource(path);
        // 歌曲名
        String title = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE);
        song.setTitle(title);
        // 唱片集
        String album = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ALBUM);
        song.setAlbum(album);
        // (艺术家)歌手
        String artist = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST);
        song.setArtist(artist);
        // 歌曲长度(时间长度 单位 mm)
        int duration = Integer.parseInt(mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION)); // 播放时长单位为毫秒  
        song.setDuration(duration);
        // 歌曲的图片
        byte[] image = mmr.getEmbeddedPicture();// 图片,可以通过BitmapFactory.decodeByteArray转换为bitmap图片
//        BitmapFactory.decodeByteArray(image, 0, image.length);
        song.setImage(image);
        return song;
    }

添加进度条拖动控制播放进度

今天终于终于终于所有学校的答辩结束了。有空来更新一下之前太忙其实就是太懒没写完的博客。
首先要在界面中添加一个进度条SeekBar这是Android基础就不多说。然后给这个进度条添加一个事件seekBar.setOnSeekBarChangeListener()(也就是在拖动的时候我们得知道它被拖—了)。然后下面简单解释一下这个事件监听的是什么鬼。

seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
			/**
			 * seekBar 当前进度条,progress当前被拖到了某个进度(我们只关心这两个参数就可以)
			*/
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
            	// 当拖动时会调用
            }
            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {// 点击进度条时 开始拖动前
               // 如果点击了进度条的那个拖动按钮(也就是说你拖动前一定会点一下否则你咋拖 emm)
               // 所以这里最先触发的
            }
            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {// 放开进度条后 开始拖动后
                // 当放开了那个拖动按钮后(当你松开了之后触发,也是就是你一次拖动结束后)
            }
        });

知道了这个事件之后那就很简单了。加上上面介绍的MediaPlayer的几个播放音乐的方法就能成功的实现拖动进度条实现播放进度变化。

boolean isChanging = false;//当前是否正在拖动
seekBar.setMax(mediaPlayer.getDuration());// 首先将进度条的长度与播放音乐的长度同步 -- 这里是必须的
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
            	mediaPlayer.seekTo(progress);// 跳转到相应的播放进度
            }
            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {
            	isChanging = true;
            	mediaPlayer.pause();// 如果要点击了进度条就暂停播放(也可以不暂停 只是可以这样做 是一种用法)
            }
            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
            	isChanging = false;
            	mediaPlayer.resume();// 拖动结束就继续播放
            }
        });

当上面的代码写完之后,拖动确实可以改变播放进度但是你会发现进度条并没有跟着播放进度的前进而前进当然了,因为根本没有写这行代码。那么我们还需要一种方法能够实时的(或者说不间断的)刷新进度条的进度。
这里我提供一种方法:使用Timer去不间断的更新播放进度。

new Timer().schedule(new TimerTask() {// 不间断的更新播放进度
            @Override
            public void run() {
                if (!isChanging)// 如果没有拖动
                    seekBar.setProgress(Player.getCurrentPosition());// 实时更新进度
            }
        }, 0, 10);// 0表示不停的(永无止境), 10表示每间隔 10mm(毫秒) | 就执行一次

其他功能

其他功能都是基于Android的事件和以上播放功能加上MediaMetadataRetriever获取音乐信息来实现的。所以就不详细介绍直接贴代码吧。

代码仓库

github代码仓库