zoukankan      html  css  js  c++  java
  • 安卓第十七天笔记--简易版本音乐播放器


    title:简易版本音乐播放器

    简易版本音乐播放器

    1.布局

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:gravity="center_horizontal">
    
        <Button
            android:id="@+id/musicList"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:background="#86B2F4"
            android:text="音乐文件列表"
            android:textColor="#fff"
            android:textSize="28sp"/>
    
        <ImageView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:src="@drawable/logo"/>
    
        <SeekBar
            android:id="@+id/seekBar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center_horizontal">
    
            <ImageButton
                android:id="@+id/stop"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@drawable/stop"/>
    
            <ImageButton
                android:id="@+id/pre"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@drawable/pree"/>
    
            <ImageButton
                android:id="@+id/play"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@drawable/play"/>
    
            <ImageButton
                android:id="@+id/next"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@drawable/next"/>
        </LinearLayout>
    </LinearLayout>

    2.工具类

    /**
     * Created by  刘楠 on 2016-03-05 19:39.
     * 文件过滤器工具类,
     * 用于过滤指定后缀的文件
     */
    public class MusicFileNameFilter implements FilenameFilter {
    
        private String type;
    
        public MusicFileNameFilter(String type) {
            this.type = type;
        }
    
        @Override
        public boolean accept(File dir, String filename) {
            return filename.endsWith(type);
        }
    }

    3.Binder接口

    /**
     * Created by  刘楠 on 2016-03-05 20:41.
     */
    public interface IMusicPlayerService {
        public void callplay(String path);
        ;
        public  void callStop();
    
        public boolean callIsPlaying();
    
        public int callGetgetDuration();
    
        public int callGetgetCurrentDuration();
    
        public boolean callMediaIsNull();
    
        public void callChanageSeek(int position);
    
        public void callPause();
    }
    4. service
    
                /**
             * Created by  刘楠 on 2016-03-05 20:32.
             *
             * Servie音乐播放
             */
            public class MusicPlayerService extends Service {
    
    
                private MediaPlayer mediaPlayer;
    
                private MusicPlayerBinder musicPlayerBinder = new MusicPlayerBinder();
    
                private class MusicPlayerBinder extends Binder implements IMusicPlayerService {
    
                    public void callplay(String path) {
    
                        play(path);
                    }
    
                    @Override
                    public void callStop() {
                        stop();
                    }
    
                    @Override
                    public boolean callIsPlaying() {
                        return isPlaying();
                    }
    
                    @Override
                    public int callGetgetDuration() {
                        return getgetDuration();
                    }
    
                    @Override
                    public int callGetgetCurrentDuration() {
                        return getCurrentDuration();
                    }
    
                    @Override
                    public boolean callMediaIsNull() {
                        return mediaIsNull();
                    }
    
                    @Override
                    public void callChanageSeek(int position) {
                        chanageSeek(position);
                    }
    
                    @Override
                    public void callPause() {
                        pause();
                    }
    
                }
    
                @Nullable
                @Override
                public IBinder onBind(Intent intent) {
    
                    return musicPlayerBinder;
                }
    
                /**
                 * 初始化
                 * @param path
                 */
                private void init(String path) {
    
                    if (mediaPlayer == null) {
                        mediaPlayer = new MediaPlayer();
                        reset(path);
                    }else{
                        reset(path);
                    }
                }
    
                /**
                 * 资源重置
                 * @param path
                 */
                private void reset(String path) {
    
                        try {
                            mediaPlayer.reset();
                            mediaPlayer.setDataSource(path);
                            mediaPlayer.prepare();
                            mediaPlayer.setLooping(true);
                            mediaPlayer.start();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
    
                }
    
                /**
                 * 播放
                 * @param path
                 */
                private void play(String path) {
    
                  /*  if (mediaPlayer != null && mediaPlayer.isPlaying()) {
                        mediaPlayer.pause();
                    } else if (mediaPlayer != null&&!mediaPlayer.isPlaying()) {
                        mediaPlayer.start();
                    } else {
                        init(path);
                    }*/
                    init(path);
    
                }
    
                /**
                 * 是不是在播放
                 * @return
                 */
                private boolean isPlaying(){
                    if(mediaPlayer!=null) {
                        return mediaPlayer.isPlaying();
                    }
                    return false;
                }
    
                /**
                 * 获取总的进度
                 * @return
                 */
                private int getgetDuration(){
                    return  mediaPlayer.getDuration();
                }
    
                /**
                 * 获取当前进度
                 * @return
                 */
                private int getCurrentDuration(){
                    return mediaPlayer.getCurrentPosition();
                }
    
                /**
                 * 暂停
                 */
                private void pause(){
                    if(mediaPlayer!=null&&mediaPlayer.isPlaying()){
                        mediaPlayer.pause();
                    }else if(mediaPlayer!=null&&!mediaPlayer.isPlaying()){
                        mediaPlayer.start();
                    }
                }
    
                /**
                 * 停止
                 */
                private void stop(){
                    if(mediaPlayer!=null){
                        mediaPlayer.stop();
                        mediaPlayer.release();
                        mediaPlayer=null;
    
                    }
                }
    
                /**
                 * 判断当前是不是NULL
                 * @return
                 */
                private boolean mediaIsNull(){
                    return  mediaPlayer==null;
                }
    
                private void chanageSeek(int position){
                    mediaPlayer.seekTo(position);
                    mediaPlayer.start();
                }
    
    
            }

    5.Activity

     public class MainActivity extends AppCompatActivity implements View.OnClickListener {
            //音乐文件的目录
            private static final String PATH = Environment.getExternalStorageDirectory() + "/Music/";
            private static final String TAG = "MainActivity";
            //文件路径
            private ArrayList<String> fileList = new ArrayList<String>();
            //文件名
            private ArrayList<String> fileNameList = new ArrayList<String>();
    
            /*
            进度条
             */
            private SeekBar seekBar;
            /*
            音乐文件列表
             */
            private Button musicList;
    
            /*
            音乐控制按键
             */
            private ImageButton stop;
            private ImageButton pre;
            private ImageButton play;
            private ImageButton next;
            //单首音乐的路径
            private String musicPath;
    
            private IMusicPlayerService mPlayerService;
    
            private MusicPlayerServiceConnection mConn;
    
            private boolean mBound =false;
    
    
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                /*
                初始化
                 */
                seekBar = (SeekBar) findViewById(R.id.seekBar);
    
                musicList = (Button) findViewById(R.id.musicList);
    
                stop = (ImageButton) findViewById(R.id.stop);
                pre = (ImageButton) findViewById(R.id.pre);
                ;
                play = (ImageButton) findViewById(R.id.play);
                ;
                next = (ImageButton) findViewById(R.id.next);
                ;
    
    
                File file = new File(PATH);
    
                //获取文件列表
                File[] arrs = file.listFiles(new MusicFileNameFilter(".mp3"));
    
                for (File f : arrs) {
                    //添加全路径到文件列表
                    fileList.add(f.getAbsolutePath());
                    //添加文件表到文件列表
                    fileNameList.add(f.getName());
    
                }
    
                /*
                设置监听器
                 */
                musicList.setOnClickListener(this);
                stop.setOnClickListener(this);
                pre.setOnClickListener(this);
                play.setOnClickListener(this);
                next.setOnClickListener(this);
    
    
    
                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) {
                        mPlayerService.callChanageSeek(seekBar.getProgress());
                    }
                });
    
            }
    
            @Override
            protected void onStart() {
                super.onStart();
                if(mConn==null){
                    mConn= new MusicPlayerServiceConnection();
                }
                Intent intent = new Intent(this,MusicPlayerService.class);
                mBound = bindService(intent, mConn, BIND_AUTO_CREATE);
    
            }
    
            @Override
            public void onClick(View v) {
                switch (v.getId()) {
                    case R.id.musicList:
                        showList();
                        break;
                    case R.id.stop:
                        stop();
                        break;
                    case R.id.pre:
                        pre();
                        break;
                    case R.id.play:
                        play();
                        break;
                    case R.id.next:
                        next();
                        break;
                }
    
            }
            /*
            下一首
             */
            private void next() {
                int index = fileList.indexOf(musicPath);
                if(index>=fileList.size()){
                    index=0;
                }
                mPlayerService.callplay(fileList.get(index+1));
            }
    
            /*
            播放
             */
            private void play() {
                Log.d(TAG, "mBound" + mBound);
                boolean isNull = mPlayerService.callMediaIsNull();
                if(isNull) {
                    mPlayerService.callplay(musicPath);
                }else{
                    mPlayerService.callPause();
                }
    
                if(mPlayerService.callIsPlaying()){
                    play.setImageBitmap(BitmapFactory.decodeResource(getResources(),R.drawable.pause));
                }else{
                    play.setImageBitmap(BitmapFactory.decodeResource(getResources(),R.drawable.play));
                }
    
                //更新进度
                new Thread(){
    
                    boolean isFinished=mPlayerService.callIsPlaying();
                    @Override
                    public void run() {
                        if(isFinished) {
                            while (isFinished) {
                                SystemClock.sleep(200);
                                int currentDuration = mPlayerService.callGetgetCurrentDuration();
                                int duration = mPlayerService.callGetgetDuration();
                                seekBar.setMax(duration);
                                seekBar.setProgress(currentDuration);
                                if (currentDuration >= duration) {
                                    isFinished = false;
                                }
                            }
                        }
    
                    }
                }.start();
            }
    
            /**
             * 上一首
             */
            private void pre() {
                int index = fileList.indexOf(musicPath);
                if(index<=0){
                    index=fileList.size()-1;
                }
                mPlayerService.callplay(fileList.get(index-1));
            }
    
            /**
             * 停止播放
             */
            private void stop() {
                mPlayerService.callStop();
            }
    
            /**
             * 显示音乐列表
             */
            private void showList() {
    
                Intent intent = new Intent(this,MusicListActivity.class);
                //intent.putStringArrayListExtra("filelist",fileList);
                intent.putStringArrayListExtra("filenamelist",fileNameList);
    
                startActivityForResult(intent,100);
    
            }
    
            @Override
            protected void onActivityResult(int requestCode, int resultCode, Intent data) {
                super.onActivityResult(requestCode, resultCode, data);
    
                if(data==null){
                    Toast.makeText(MainActivity.this, "没有结果", Toast.LENGTH_SHORT).show();
                    return;
                }
                //获取下标
                int position = data.getIntExtra("position", 0);
                //设置音乐路径
                musicPath = fileList.get(position);
               // play();
                Log.d(TAG,musicPath);
            }
    
            private class MusicPlayerServiceConnection implements ServiceConnection{
    
                @Override
                public void onServiceConnected(ComponentName name, IBinder service) {
                    mPlayerService = (IMusicPlayerService) service;
    
    
                }
    
                @Override
                public void onServiceDisconnected(ComponentName name) {
                    if(mConn!=null){
                     mConn =null;
                    }
                }
            }
    
            @Override
            protected void onStop() {
                super.onStop();
                if(mConn!=null){
                    unbindService(mConn);
                    mConn=null;
                    mPlayerService=null;
                }
            }
    
            @Override
            protected void onDestroy() {
                super.onDestroy();
                if(mConn!=null){
                    unbindService(mConn);
                    mConn=null;
                    mPlayerService=null;
                }
            }
        }
  • 相关阅读:
    oo——第三单元总结
    oo第三单元总结
    【BUAA软工】提问回顾与个人总结
    【BUAA软工】HTTP协议前后端实现及实战北航云盘爬取
    【BUAA软工】软件案例分析
    【BUAA软工】结对编程作业
    【BUAA 软工个人项目作业】玩转平面几何
    【BUAA 软工博客作业】个人博客作业
    【BUAA 软工热身作业】继往开来,勇攀高峰
    BUAA-OO-第四单元总结——终章
  • 原文地址:https://www.cnblogs.com/liunanjava/p/5250041.html
Copyright © 2011-2022 走看看