android MediaPlayer简易播放器

本文介绍了一个简单的Android音乐播放器应用程序的实现过程。该应用使用MediaPlayer类进行音频文件的播放,并实现了基本的播放、暂停、停止功能。此外,还包含了进度条、缓冲进度显示等实用功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.example.jared.mediaplayerstudy;

import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.SeekBar;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    private Button playMusic;
    private Button pauseMusic;
    private Button stopMusic;

    private TextView totalTime_text;
    private TextView playingTime_text;

    private SeekBar playingProcess;

    private int totalTime = 0;

    private MediaPlayer mediaPlayer;

    private Handler hangler = new Handler();
    private boolean flag = true;
    private Player player;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        playMusic = (Button) findViewById(R.id.play);//开始/暂停


        pauseMusic = (Button) findViewById(R.id.pause);//暂停


        playingProcess = (SeekBar) findViewById(R.id.seek);//进度条


        totalTime_text = (TextView) findViewById(R.id.totalTime);//播放时间和总时长
        player = new Player(playingProcess, totalTime_text);  //初始化
        playingProcess.setOnSeekBarChangeListener(new SeekBarChangeEvent());
        new Thread(new Runnable() {
            @Override
            public void run() {
                player.playUrl("http://abv.cn/music/光辉岁月.mp3");
            }
        }).start();
        playMusic.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (player.mediaPlayer.isPlaying()) {
                    player.mediaPlayer.pause();
                } else {
                    player.mediaPlayer.start();
                }
            }
        });
        pauseMusic.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (player.mediaPlayer.isPlaying()) {
                    player.mediaPlayer.pause();
                }
            }
        });
    }


    class SeekBarChangeEvent implements SeekBar.OnSeekBarChangeListener {
        int progress;

        @Override
        public void onProgressChanged(SeekBar seekBar, int progress,
                                      boolean fromUser) {
            // 原本是(progress/seekBar.getMax())*player.mediaPlayer.getDuration()


            this.progress = progress * player.mediaPlayer.getDuration()
                    / seekBar.getMax();

        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
            // seekTo()的参数是相对与影片时间的数字,而不是与seekBar.getMax()相对的数字
            player.mediaPlayer.seekTo(progress);
        }
    }

    
    @Override
    public void onBackPressed() {//退出并且停止播放
        super.onBackPressed();
        player.stop();
        this.finish();
    }
}
 
   
package com.example.jared.mediaplayerstudy;

import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnBufferingUpdateListener;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaPlayer.OnPreparedListener;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.widget.SeekBar;
import android.widget.TextView;

import java.io.IOException;
import java.util.Timer;
import java.util.TimerTask;



public class Player implements OnBufferingUpdateListener,
        OnCompletionListener, OnPreparedListener{
    public MediaPlayer mediaPlayer;
    private SeekBar skbProgress;
    private Timer mTimer=new Timer();
    private TextView textView;
    public Player(SeekBar skbProgress, TextView textView)
    {
        this.skbProgress=skbProgress;
        this.textView = textView;
        try {
            mediaPlayer = new MediaPlayer();
            mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
            mediaPlayer.setOnBufferingUpdateListener(this);
            mediaPlayer.setOnPreparedListener(this);
        } catch (Exception e) {
            Log.e("mediaPlayer", "error", e);
        }

        mTimer.schedule(mTimerTask, 0, 300);
    }

    /*******************************************************
     * 通过定时器和Handler来更新进度条
     ******************************************************/
    TimerTask mTimerTask = new TimerTask() {
        @Override
        public void run() {
            if(mediaPlayer==null)
                return;
            if (mediaPlayer.isPlaying() && skbProgress.isPressed() == false) {
                handleProgress.sendEmptyMessage(0);
            }
        }
    };

    Handler handleProgress = new Handler() {
        public void handleMessage(Message msg) {
            int position = getCurrentPositionWhenPlaying();
            int duration = 0;
            if (mediaPlayer!=null) {
                 duration = mediaPlayer.getDuration();
            }
            if (position != 0)
            textView.setText(JCUtils.stringForTime(position)+"/"+JCUtils.stringForTime(duration));
            if (duration > 0) {
                long pos = skbProgress.getMax() * position / duration;
                skbProgress.setProgress((int) pos);
            }
        };
    };




    public int getCurrentPositionWhenPlaying() {
        int position = 0;
            try {
                if (mediaPlayer!=null)
                position = mediaPlayer.getCurrentPosition();
            } catch (IllegalStateException e) {
                e.printStackTrace();
                return position;
            }

        return position;
    }




    //*****************************************************

    public void play()
    {
        mediaPlayer.start();
    }

    public void playUrl(String videoUrl)
    {
        try {
            mediaPlayer.reset();
            mediaPlayer.setDataSource(videoUrl);
            mediaPlayer.prepare();//prepare之后自动播放
            //mediaPlayer.start();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalStateException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }


    public void pause()
    {
        mediaPlayer.pause();
    }

    public void stop()
    {
        if (mediaPlayer != null) {
            if (mTimer!=null) {
                mTimer.cancel();
            }
            if(mTimerTask!=null) {
                mTimerTask.cancel();
            }
            mediaPlayer.stop();
            mediaPlayer.release();
            mediaPlayer = null;


        }
    }

    @Override
    /**
     * 通过onPrepared播放
     */
    public void onPrepared(MediaPlayer arg0) {
        arg0.start();
        Log.e("mediaPlayer", "onPrepared");
    }

    @Override
    public void onCompletion(MediaPlayer arg0) {
        Log.e("mediaPlayer", "onCompletion");
    }

    @Override
    public void onBufferingUpdate(MediaPlayer arg0, int bufferingProgress) {
        skbProgress.setSecondaryProgress(bufferingProgress);
        int currentProgress=skbProgress.getMax()*mediaPlayer.getCurrentPosition()/mediaPlayer.getDuration();
        Log.e(currentProgress+"% play", bufferingProgress + "% buffer");
    }

}

    完整项目链接:http://download.youkuaiyun.com/detail/cst11041/9812308


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值