android实现简单的音乐播放器

本文介绍了使用Android的MediaPlayer组件实现三种音乐播放方式:读取本地音乐文件、读取手机内存中的音乐文件以及读取网络音乐文件。通过设置进度条与音乐同步,详细讲解了实现过程,对开发者有一定帮助。

            今儿用android的MediaPlayer实现几种音乐播放的方式:

      .读取本地音乐文件

      .读取手机内存里面的音乐文件

      .读取网络音乐文件 

         首先我们来看第一种,所有的xml布局都是这一个:

      

    <SeekBar
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="wrap_content"
        android:id="@+id/sb_main_bar"
        />

    <ImageButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@android:drawable/ic_media_play"
        android:onClick="isPlayOrPause"
        />

    读取本地的音乐文件:在安卓的工程的res下建立一个raw的文件,复制一个音乐文件进去,紧接着就是:

 final   ImageButton imageButton=(ImageButton) view;//视图的button
        if (mediaPlayer==null){
                //播放内地文件
                   mediaPlayer = MediaPlayer.create(this, R.raw.haunted);
                    mediaPlayer.start();
                    imageButton.setImageResource(android.R.drawable.ic_media_pause);
                    //获取音乐总时长
                    int duration= mediaPlayer.getDuration();
                    //设置音乐最大值
                    sb_main_bar.setMax(duration);

        }else if (mediaPlayer.isPlaying()){
            mediaPlayer.pause();
            imageButton.setImageResource(android.R.drawable.ic_media_play);
        }else{
            mediaPlayer.start();
            imageButton.setImageResource(android.R.drawable.ic_media_pause);
        }
在此之前还要给进度条设置监听

 sb_main_bar = (SeekBar) findViewById(R.id.sb_main_bar);
        //给进度条设置监听事件
        sb_main_bar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {

            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
             int progress= seekBar.getProgress();
             //设置当前的播放位置
                mediaPlayer.seekTo(progress);
            }
        });

设置进度条可拉动,并跟随音乐一起快进,就需要用到一个线程,这里我写的是内部类线程

 class mythread extends Thread{
        @Override
        public void run() {
            super.run();
            while (sb_main_bar.getProgress()<=sb_main_bar.getMax()){
            //获取音乐当前播放的时间
           int position= mediaPlayer.getCurrentPosition();
            sb_main_bar.setProgress(position);
            }
        }
    }
此时最简单的播放内地音乐就完成了。

下面我们来看看从手机内容中播放音乐文件,改变不大,看代码

 final   ImageButton imageButton=(ImageButton) view;//视图的button
        if (mediaPlayer==null){
            //播放内地文件
          //  mediaPlayer = MediaPlayer.create(this, R.raw.haunted);
            mediaPlayer=new MediaPlayer();
            mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
            try {
                //播放内存卡中的图片
                mediaPlayer.setDataSource(this,Uri.parse("file://mnt/sdcard/kgmusic/swera.mp3"));
                 mediaPlayer.prepare();
            } catch (IOException e) {
                e.printStackTrace();
            }

            //设置准备完成的监听
            mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mp) {
                    mediaPlayer.start();
                    imageButton.setImageResource(android.R.drawable.ic_media_pause);
                    //获取音乐总时长
                    int duration= mediaPlayer.getDuration();
                    //设置音乐最大值
                    sb_main_bar.setMax(duration);
                    new mythread().start();
                }
            });

        }else if (mediaPlayer.isPlaying()){
            mediaPlayer.pause();
            imageButton.setImageResource(android.R.drawable.ic_media_play);
        }else{
            mediaPlayer.start();
            imageButton.setImageResource(android.R.drawable.ic_media_pause);
        }
小结下内存播放音乐文件的几点:

1.设置音乐类型

 mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
2、读取手机位置的路径这里先是有必要说明下手机内存和内存卡,着两者一个是手机的内置存储,后者是手机外置存储,外置存储指的是后期插入到手机中的内存卡,一般来说,读取手机里面的资源的时候,第一个访问的,默认的是读取手机内置存储的信息,所以路劲因写手机内置存储卡的路劲,小编就是在这两者的路径上耗费了一两个小时,因为读的是手机外置存储卡的信息,一直播放不了音乐
  Uri.parse("file://mnt/sdcard/kgmusic/swera.mp3")
3、播放开始前要先准备:

 mediaPlayer.prepare();

这就是播放内存音乐需要注意的东西.

最后一钟就是网络读取,这里我是用Tomcat作为服务器的,代码也没多大改变无非换了路径、开始前的准备

   //播放网络的音乐
                mediaPlayer.setDataSource(this,Uri.parse("http://192.168.23.1/taly,map3"));
异步准备

       mediaPlayer.prepareAsync();

 final   ImageButton imageButton=(ImageButton) view;//视图的button
        if (mediaPlayer==null){
            //播放内地文件
          //  mediaPlayer = MediaPlayer.create(this, R.raw.haunted);
            mediaPlayer=new MediaPlayer();
            mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
            try {
                //播放网络的音乐
                mediaPlayer.setDataSource(this,Uri.parse("http://192.168.23.1/taly,map3"));
                mediaPlayer.prepareAsync();
               // mediaPlayer.prepare();
            } catch (IOException e) {
                e.printStackTrace();
            }

            //设置准备完成的监听
            mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mp) {
                    mediaPlayer.start();
                    imageButton.setImageResource(android.R.drawable.ic_media_pause);
                    //获取音乐总时长
                    int duration= mediaPlayer.getDuration();
                    //设置音乐最大值
                    sb_main_bar.setMax(duration);
                    new mythread().start();
                }
            });

        }else if (mediaPlayer.isPlaying()){
            mediaPlayer.pause();
            imageButton.setImageResource(android.R.drawable.ic_media_play);
        }else{
            mediaPlayer.start();
            imageButton.setImageResource(android.R.drawable.ic_media_pause);
        }
这就是三种不同的播放方式,有兴趣者还可以进行改造,比如给进度条添加时间,还有就是完善其界面.....

希望这些对大家有帮助!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值