• 百度音乐盒完成


    package com.itheima.baidumusic;
    
    import java.util.Timer;
    import java.util.TimerTask;
    
    import android.app.Service;
    import android.content.Intent;
    import android.media.MediaPlayer;
    import android.media.MediaPlayer.OnCompletionListener;
    import android.os.Binder;
    import android.os.Bundle;
    import android.os.IBinder;
    import android.os.Message;
    
    //音乐播放服务
    public class MusicService extends Service {
    
        private MediaPlayer player;
    
        //[2]把我们定义的中间人对象 返回
        @Override
        public IBinder onBind(Intent intent) {
            return new MyBinder();
        }
        //服务第一次开启的是调用
        @Override
        public void onCreate() {
            
            //[1]初始化mediaplayer 
            player = new MediaPlayer();
            
            super.onCreate();
        }
        
        
        //当服务销毁的时候调用
        @Override
        public void onDestroy() {
            super.onDestroy();
        }
        
        //设置播放音乐指定位置的方法
        public void seekToPosition(int position){
            player.seekTo(position);
        }
        
        
    
        //专门用来播放音乐的 
        public void playMusic(){
            System.out.println("音乐播放了");
            
            //[2]设置要播放的资源  path 可以是本地也可是网络路径 
                    try {
                        player.reset();
                        
                        player.setDataSource("/mnt/sdcard/xpg.mp3");
                        
                        //[3]准备播放 
                        player.prepare(); 
                        
                        //[4]开始播放 
                        player.start();
                        
                        //[5]更新进度条 
                        updateSeekBar();
                        
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
            
            
        }
        
        //更新进度条的方法 
        private void updateSeekBar() {
            //[1]获取当前歌曲总时长 
            final int duration = player.getDuration();
            //[2]一秒钟获取一次当前进度  
            final Timer timer = new Timer();
            final TimerTask task = new TimerTask() {
                
                @Override
                public void run() {
                    //[3]获取当前歌曲的进度 
                    int currentPosition = player.getCurrentPosition();
                    
                    //[4]创建message对象  
                    Message msg = Message.obtain();
                    //[5]使用msg携带多个数据   
                    Bundle bundle = new Bundle();
                    bundle.putInt("duration", duration);
                    bundle.putInt("currentPosition", currentPosition);
                    msg.setData(bundle);
                    //发送消息 MainActivity的handlemessage方法会执行
                    MainActivity.handler.sendMessage(msg);
                    
                }
            };
            //300毫秒后 每隔1秒钟获取一次当前歌曲的进度
            timer.schedule(task, 300, 1000);
            //[3]当歌曲播放完成的时候 把timer 和task 取消 
            player.setOnCompletionListener(new OnCompletionListener() {
                
                //当歌曲播放完成的回调
                @Override
                public void onCompletion(MediaPlayer mp) {
                    System.out.println("歌曲播放完成了 ");
                    
                    timer.cancel();
                    task.cancel();
                    
                }
            });
            
            
        }
        //音乐暂停了
        public void pauseMusic(){
            System.out.println("音乐暂停了");
            //暂停 
            player.pause();
            
        }
        
        //音乐继续播放的方法
        public void  rePlayMusic(){
            System.out.println("音乐继续播放了");
            
            player.start();
            
        }
        
        //[1]定义一个中间人对象(IBinder) 
        private class MyBinder extends Binder implements Iservice{
    
            //调用播放音乐的方法
            @Override
            public void callPlayMusic() {
                
                playMusic();
            }
    
            //调用暂停音乐的方法
            @Override
            public void callPauseMusic() {
                
                pauseMusic();
            }
    
            //调用继续播放的方法 
            @Override
            public void callrePlayMusic() {
                
                rePlayMusic();
            }
    
            //调用设置播放指定位置的方法 
            @Override
            public void callSeekToPosition(int position) {
                
                seekToPosition(position);
            }
            
        }
        
        
        
    }
    package com.itheima.baidumusic;
    
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.IBinder;
    import android.app.Activity;
    import android.content.ComponentName;
    import android.content.Intent;
    import android.content.ServiceConnection;
    import android.view.Menu;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.SeekBar;
    import android.widget.SeekBar.OnSeekBarChangeListener;
    
    public class MainActivity extends Activity {
    
        private Iservice iservice; // 这个就是我们定义的中间人对象
        private MyConn conn;
        private static SeekBar sbar;  
        public  static Handler handler = new Handler(){
            //当 接收到消息该方法执行
            public void handleMessage(android.os.Message msg) {
                //[1]获取msg 携带的数据 
                Bundle data = msg.getData();
                //[2]获取当前进度和总进度
                int duration = data.getInt("duration");
                int currentPosition = data.getInt("currentPosition");
                
                //[3]设置seekbar的最大进度和当前进度 
                sbar.setMax(duration);  //设置进度条的最大值
                sbar.setProgress(currentPosition);//设置当前进度
                
                
                
            };
        };
        
        
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            sbar = (SeekBar) findViewById(R.id.seekBar1);
            
            
            //[0]先调用startservice 方法开启服务 保证服务在后台长期运行
            Intent intent = new Intent(this, MusicService.class);
            startService(intent);
            
            // [1]调用bindservice 目的是为了获取我们定义的中间人对象
            conn = new MyConn();
            // 连接MusicService 服务 获取我们定义的中间人对象
            bindService(intent, conn, BIND_AUTO_CREATE);
    
            //[2]给seekbar 设置监听 
    
            sbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
                //当停止拖动执行
                @Override
                public void onStopTrackingTouch(SeekBar seekBar) {
                    
                    //设置播放的位置 
                    iservice.callSeekToPosition(seekBar.getProgress());
                }
                //开始拖动
                @Override
                public void onStartTrackingTouch(SeekBar seekBar) {
                    
                }
                
                @Override
                public void onProgressChanged(SeekBar seekBar, int progress,
                        boolean fromUser) {
                    
                }
            });
            
        }
    
        // 点击按钮 进行 音乐播放
        public void click1(View v) {
    
            // 调用播放音乐的方法
            iservice.callPlayMusic();
        }
    
        // 暂停音乐
        public void click2(View v) {
    
            // 调用暂停音乐的方法
            iservice.callPauseMusic();
        }
    
        // 继续播放
        public void click3(View v) {
    
            // 调用继续播放
            iservice.callrePlayMusic();
        }
    
        // 当Activity销毁的时候调用
        @Override
        protected void onDestroy() {
            // 在Activity销毁的时候 取消绑定服务
            unbindService(conn);
    
            super.onDestroy();
        }
    
        private class MyConn implements ServiceConnection {
    
            // 当连接成功时候调用
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                // 获取我们定义的中间人对象
                iservice = (Iservice) service;
    
            }
    
            @Override
            public void onServiceDisconnected(ComponentName name) {
    
            }
    
        }
    
    }
    public interface Iservice {
        //把我们想暴露的方法放到接口中
        public void callPlayMusic();
        public void callPauseMusic();
        public void callrePlayMusic();
        
        public void callSeekToPosition(int position);
        
    }
  • 相关阅读:
    Linux 设置主机名和 IP 地址的映射关系
    Zookeeper 数据查看工具 ZooInspector 的使用
    Zookeeper 集群
    Zookeeper 监控指定节点数据变化
    Zookeeper 常用命令
    Spring整合ActiveMQ持久化到Mysql数据库
    Activemq5.15.5持久化到mysql8.0.20
    ActiveMQ支持的协议
    SIGINT SIGTERM SIGKILL区别
    lograte -日志轮询log
  • 原文地址:https://www.cnblogs.com/xufengyuan/p/6080610.html
Copyright © 2020-2023  润新知