這一期是實現本地播放,也可以播放網絡資源的音樂(會在后期放上)
先給大家放一個簡略圖(僅用於實現該功能,不美觀)
點擊開始播放,拖動條跟着動,點擊暫停時,音樂停止,拖動條停止。也可以手動拖動他,拖動到哪,就播放哪。
下面上代碼:
首先是頁面布局文件:
<?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文件的路徑