自定义本地音乐播放器

 

 

package com.welleplus.yfinspection.ui;

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Handler;
import android.os.Message;
import android.support.v7.widget.AppCompatSeekBar;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;

import com.welleplus.yfinspection.R;
import com.welleplus.yfinspection.utils.TimeUtil;

import java.io.File;
import java.util.Timer;


/**
 * description :
 * Author : Vily
 * Date : 2018/08/07
 * Time : 15:07
 */

public class AudioPlayDialog {

    private Context mContext;
    private AlertDialog mDialog;
    private LayoutInflater mInflater;
    private View mView;
    private TextView mTv_start;
    private TextView mTv_finish;
    private AppCompatSeekBar mSeekBar;
    private TextView mTv_audio_play;
    private MediaPlayer mMediaPlayer;
    private Timer mTimer;
    private boolean isSeekBarChanging;
    private File mFile;

    private Handler mHandler=new Handler(){

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if(msg.what==1){
                if(mMediaPlayer!=null && !isSeekBarChanging){

                    mSeekBar.setProgress(mMediaPlayer.getCurrentPosition());
                }

                if(mMediaPlayer!=null && mSeekBar.getProgress()!=mMediaPlayer.getDuration()){
                    sendEmptyMessageDelayed(1,10);
                }

            }

        }
    };

    public AudioPlayDialog(Context context, File media) {
        this.mContext = context;
        this.mInflater = LayoutInflater.from(context);

        this.mFile=media;

        init();

        initData();
        listener();
    }

    private void init() {
        mDialog = new AlertDialog.Builder(mContext, R.style.CalendarDialog).create();
        mView = mInflater.inflate(R.layout.audio_play_dialog, null);
        Window window = mDialog.getWindow();
        window.setGravity(Gravity.BOTTOM);

        mDialog.show();
        //设置dialog弹出后会点击屏幕或物理返回键,dialog不消失
        mDialog.setCanceledOnTouchOutside(false);
//
        window.setContentView(mView);


        //获得window窗口的属性
        WindowManager.LayoutParams params = window.getAttributes();
        //设置窗口宽度为充满全屏
        params.width = WindowManager.LayoutParams.MATCH_PARENT;//如果不设置,可能部分机型出现左右有空隙,也就是产生margin的感觉
        //设置窗口高度为包裹内容
        params.height = WindowManager.LayoutParams.WRAP_CONTENT;

        window.setAttributes(params);

        initView(mView);
    }

    private void initView(View view) {

        mTv_start = view.findViewById(R.id.tv_start);
        mTv_finish = view.findViewById(R.id.tv_finish);
        mSeekBar = view.findViewById(R.id.sb_audio);
        mTv_audio_play = view.findViewById(R.id.tv_audio_play);


    }

    public void show() {
        mDialog.show();
    }


    private void listener() {

        mTv_audio_play.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mMediaPlayer.stop();
                mMediaPlayer.release();
                mHandler.removeCallbacksAndMessages(null);
//                mTimer.cancel();
//                mTimer = null;
                mMediaPlayer = null;
                mDialog.dismiss();

            }
        });


        mDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
            @Override
            public void onDismiss(DialogInterface dialogInterface) {
                if(mOnDismissLis!=null){
                    mOnDismissLis.onDismissLis("----");
                }
            }
        });



    }

    private OnDismissLis mOnDismissLis;

    public interface OnDismissLis {
        void onDismissLis(String path);
    }

    public void setOnDismissLis(OnDismissLis onDismissLis) {
        mOnDismissLis = onDismissLis;
    }


    private void initData() {


        System.out.println("-----------走进来了吗");

        final int currentPosition = 0;
        //实例化媒体播放器
        mMediaPlayer = new MediaPlayer();

        mSeekBar.setOnSeekBarChangeListener(new MySeekBar());


        if (mFile.exists()) {
            try {
                mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);//设置音频类型
                mMediaPlayer.setDataSource(mFile.getAbsolutePath());//设置mp3数据源

                mMediaPlayer.prepareAsync();//数据缓冲
                /*监听缓存 事件,在缓冲完毕后,开始播放*/
                mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                    public void onPrepared(MediaPlayer mp) {
                        mp.start();
//                        mp.seekTo(currentPosition);

                        mSeekBar.setMax(mMediaPlayer.getDuration());
                        mHandler.sendEmptyMessage(1);
                        mTv_finish.setText(TimeUtil.getMinAndSecond(mMediaPlayer.getDuration()));
                    }
                });


            } catch (Exception e) {
                Toast.makeText(mContext, "播放错误", Toast.LENGTH_LONG).show();
                e.printStackTrace();
                System.out.println(e);
            }
        } else {
            Toast.makeText(mContext, "文件错误", Toast.LENGTH_LONG).show();
        }
    }

    /*进度条处理*/
    public class MySeekBar implements SeekBar.OnSeekBarChangeListener {



        public void onProgressChanged(SeekBar seekBar, int progress,
                                      boolean fromUser) {


            if(mMediaPlayer!=null){
                if(  progress>mMediaPlayer.getDuration()-50){

                    mMediaPlayer.stop();
                    mMediaPlayer.release();
                    mHandler.removeCallbacksAndMessages(null);
                    mMediaPlayer = null;
                    mDialog.dismiss();

                }else{
                    mTv_start.setText(TimeUtil.getMinAndSecond(mMediaPlayer.getCurrentPosition()));
                    if(!mMediaPlayer.isPlaying()){

                        mMediaPlayer.start();
                        mMediaPlayer.seekTo(progress);
                    }
                }


            }


        }

        /*滚动时,应当暂停后台定时器*/
        public void onStartTrackingTouch(SeekBar seekBar) {
            isSeekBarChanging = true;
        }

        /*滑动结束后,重新设置值*/
        public void onStopTrackingTouch(SeekBar seekBar) {
            isSeekBarChanging = false;
            mMediaPlayer.seekTo(seekBar.getProgress());

        }

    }


}

 关闭按钮的状态选择器

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_pressed="true">

        <shape android:shape="rectangle">

            <corners android:radius="20dp"/>
            <!--<stroke android:color="@color/colorPrimary"/>-->
            <solid android:color="#38B9A5"/>

        </shape>

    </item>
    <item >
        <shape android:shape="rectangle">
            <corners android:radius="20dp"/>
            <solid android:color="#3EC9B6"/>
        </shape>

    </item>

</selector>

 

要求: 基本功能实现(40分) 实现音乐文件的获取——获取方式自定 实现音乐的播放、暂停、停止、上一首、下一首功能 实现音乐播放进度的控制 实现音乐播放模式的设定 实现摇一摇切换音乐的功能——音乐切换顺序自定 实现音乐文件的分享——至少要能使用短信和蓝牙两种方式分享,短信分享时必须提供用户输入手机号或者从通信录中直接获取两种方式,不得直接通过intent对象调用手机的相应功能 实现提高功能(20分) 实现音乐库的生成和管理——全盘扫描音乐文件、将扫描到的音乐文件保存到媒体库中 播放列表的管理——至少应包括生成播放列表、向播放列表中添加音乐文件、删除播放列表、按播放列表播放等功能 其他自定义功能——根据自己的喜好自行设计新功能 书写程序制作思路分析文档(40分) 程序制作思路分析文档必须包含如下内容: 列出本项目需要开发的功能 对每个功能进行功能分析,需要分析说明的内容包括: 要实现该功能需要解决哪些问题? 分别对每个问题进行分析,该问题是否能用某个知识或技能解决:如能,写出该知识点或技能点的使用;如不能,该问题又该分为哪几个子问题来解决。 需要提交的文件 本次项目的安卓工程 本项目生成的apk文件 描述程序制作思路的word文档 其他要求 本项目的安卓工程包名必须以“com.你的姓全拼名声母.”开始,例如: 冉超群的安卓工程中的包名都以“com.ranchq.”开头 注释的书写:每个类必须写明其实现的功能,每个方法必须写明其作用及方法中参数的意义。 本次期末项目在第六周周三进行效果展示,项目工程、apk文件和描述程序制作思路的word文档在周四下课时统一上交作为期末成绩的最终考核依据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值