Android实现本地音频播放(可拖动条)

这一期是实现本地播放,也可以播放网络资源的音乐(会在后期放上)

 

先给大家放一个简略图(仅用于实现该功能,不美观)

Android实现本地音频播放(可拖动条)

点击开始播放,拖动条跟着动,点击暂停时,音乐停止,拖动条停止。也可以手动拖动他,拖动到哪,就播放哪。

 

下面上代码:

首先是页面布局文件:

<?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文件的路径

 

上一篇:第十六周总结


下一篇:设计模式——Adapter Pattern 适配器模式