播放音乐逻辑

播放音乐逻辑 

  • mediaplayer 播放音频和视频
        try {
            String path = Environment.getExternalStorageDirectory().getPath();
            Log.e(TAG, "palysMusic: " + path+"/data/xpg.mp3");
            mediaPlayer.setDataSource(path + "/data/xpg.mp3");
            mediaPlayer.prepare();
            mediaPlayer.start();
            updateseekbar();
        } catch (IOException e) {
            Log.e(TAG, "palysMusic: "+e.getLocalizedMessage().toString() );
            e.printStackTrace();
        }
  • 完善百度音乐盒,为了提升音乐播放器案例进程优先级,所以我们把播放的逻辑写到服务里 
    • 完善UI 加上一个进度条 代表播放歌曲的进度
<?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=".MainActivity">

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="start"
        android:text="播放" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="pause"
        android:text="暂停" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="restart"
        android:text="继续" />

    <SeekBar
        android:id="@+id/seekbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="net"
        android:text="播放网络音乐" />
</LinearLayout>
    • 实现播放歌曲 暂停 继续播放的逻辑
    public void palysMusic() {
        try {
            String path = Environment.getExternalStorageDirectory().getPath();
            Log.e(TAG, "palysMusic: " + path+"/data/xpg.mp3");
            mediaPlayer.setDataSource(path + "/data/xpg.mp3");
            mediaPlayer.prepare();
            mediaPlayer.start();
            updateseekbar();
        } catch (IOException e) {
            Log.e(TAG, "palysMusic: "+e.getLocalizedMessage().toString() );
            e.printStackTrace();
        }
    }

 

    • 暂停歌曲

 

    public void pausesMusic() {
        Log.e(TAG, "pausesMusic: " );
        mediaPlayer.pause();
    }
      • 继续播放歌曲

 

    public void continueMusic() {
        Log.e(TAG, "continueMusic: " );
        mediaPlayer.start();
    }
    • 实现更新进度条的逻辑:
    private void updateseekbar() {
        final Timer timer = new Timer();
        TimerTask timerTask = new TimerTask() {
            @Override
            public void run() {
                int duration = mediaPlayer.getDuration();
                int currentPosition = mediaPlayer.getCurrentPosition();
                Message msg = Message.obtain();
                Bundle bundle = new Bundle();
                bundle.putInt("all", duration);
                bundle.putInt("current", currentPosition);
                msg.setData(bundle);
                MainActivity.handler.sendMessage(msg);
            }
        };
        timer.schedule(timerTask, 1000, 1000);
        mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                timer.cancel();
            }
        });
    }
    @SuppressLint("HandlerLeak")
    public static Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            Bundle bundle = msg.getData();
            int all = bundle.getInt("all");
            int current = bundle.getInt("current");
            seekbar.setMax(all);
            seekbar.setProgress(current);
            super.handleMessage(msg);
        }
    };
    • 实现拖拽进度条,播放歌曲指定位置.首先在服务内部暴漏一个方法,用来播放歌曲指定位置.
    public void palyPosition(int position) {
        mediaPlayer.seekTo(position);
    }
    • 给进度条设置一个监听 当拖动停止的时候播放歌曲的指定位置:

 

       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) {
                iservice.playPosition(seekbar.getProgress());
            }
        });
    }
    • 当歌曲播放完成了 取消tiemr(计时器)
        mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                timer.cancel();
            }
        });
  • 播放网络音频代码
    public void net(View view) {
        Log.e(TAG, "net: ");
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    MediaPlayer mediaPlayer = new MediaPlayer();
                    mediaPlayer.setDataSource("http://47.105.71.243:8080/resource/xpg.mp3");
                    mediaPlayer.prepareAsync();
                    mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                        @Override
                        public void onPrepared(MediaPlayer mp) {
                            Log.e(TAG, "onPrepared: ");
                            mp.start();
                        }
                    });
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();

猜你喜欢

转载自www.cnblogs.com/nangongyibin/p/10252809.html