这一期是实现本地播放,也可以播放网络资源的音乐(会在后期放上)
先给大家放一个简略图(仅用于实现该功能,不美观)
点击开始播放,拖动条跟着动,点击暂停时,音乐停止,拖动条停止。也可以手动拖动他,拖动到哪,就播放哪。
下面上代码:
首先是页面布局文件:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MaikefengActivity"> <SeekBar android:id="@+id/seekBar" android:layout_marginTop="40dp" android:layout_width="match_parent" android:layout_height="wrap_content"/> <Button android:id="@+id/start_music" android:layout_marginTop="40dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="开始播放" android:textSize="16sp" /> <Button android:id="@+id/pause_music" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="暂停播放" android:textSize="16sp" /> <Button android:id="@+id/restart_music" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="继续播放" android:textSize="16sp" /> </LinearLayout>
对应的java文件:
package com.example.logintest; import androidx.appcompat.app.AppCompatActivity; import android.media.MediaPlayer; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.SeekBar; import java.io.IOException; import java.util.Timer; import java.util.TimerTask; public class MaikefengActivity extends AppCompatActivity { private Button startmusic,pausemusic,restartmusic; private MediaPlayer mediaPlayer; private SeekBar seekBar; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_maikefeng); initView(); //开始播放 startmusic.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //1.初始化midiaplayer mediaPlayer = new MediaPlayer(); try { mediaPlayer.reset(); //2.设置要播放的资源位置 path 可以是网络路径 也可以是本地路径 mediaPlayer.setDataSource("/mnt/sdcard/Music/iPhone.mp3"); //3.准备播放 mediaPlayer.prepare(); //4.开始播放 mediaPlayer.start(); //5.更新进度条 updateSeekBar(); } catch (IOException e) { e.printStackTrace(); } } }); //暂停播放 pausemusic.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mediaPlayer.pause(); } }); //继续播放 restartmusic.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mediaPlayer.start(); } }); //给seekBar设置监听事件 setSeekBarChange(); } private void setSeekBarChange() { seekBar.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) { seekTo(seekBar.getProgress()); } }); } //实现指定播放的位置 public void seekTo(int position){ mediaPlayer.seekTo(position); } private void updateSeekBar() { //1.获取当前播放的总长度 final int duration = mediaPlayer.getDuration(); //2.使用Timer 定时器 去定时获取当前进度 final Timer timer = new Timer(); final TimerTask task = new TimerTask() { @Override public void run() { //3.一秒获取一次当前进度 int currentPosition = mediaPlayer.getCurrentPosition(); // 设置seekBar进度 seekBar.setMax(duration); //当前进度 seekBar.setProgress(currentPosition); } }; //100毫秒后 每隔1秒 执行一次run方法 timer.schedule(task,100,1000); //当歌曲执行完毕时,把timer 和 timertask 取消 //设置播放完成的监听 mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { timer.cancel(); task.cancel(); } }); } private void initView() { startmusic=findViewById(R.id.start_music); pausemusic=findViewById(R.id.pause_music); restartmusic=findViewById(R.id.restart_music); seekBar=findViewById(R.id.seekBar); } }
其中的音频是播放的本地音乐,路径就是本地mp3文件的路径