Android Service播放音乐

<pre name="code" class="java">/**
 * 音乐播放服务
 * Created by Lezg on 2014/6/7.
 */
public class PlayerService extends Service {

    private final int UPDATA_CURRENT_TIME = 1;

    private AppContext appContext;
    private MyReceiver myReceiver;

    private int curPosition = 0; //记录当前正在播放的音乐
    private int currentTime; //当前播放进度
    private int playMode = 0;
    private boolean isPause;// 暂停状态
    private String path;

    private MediaPlayer mediaPlayer;

    /**
     * handler用来接收消息,发送广播更新歌曲已播放时间
     */
    private final Handler myHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            if (msg.what == UPDATA_CURRENT_TIME) {
                if (mediaPlayer != null) {
                    currentTime = mediaPlayer.getCurrentPosition();//当前歌曲播放时长
                    AppHelper.sendBoastCast_curTime(PlayerService.this, currentTime);
                    myHandler.sendEmptyMessageDelayed(1, 1000);
                }
            }
        }
    };

    @Override
    public void onCreate() {
        super.onCreate();
        appContext = AppContext.getInstance();
        initRegisterReceiver();
        initMedia();
    }

    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }

    @Override
    public void onDestroy() {
        unregisterReceiver(myReceiver);
        if (mediaPlayer != null) {
            mediaPlayer.stop();
            mediaPlayer.release();
            mediaPlayer = null;
        }
        super.onDestroy();
    }

    /**
     * 媒体播放器初始化
     */
    void initMedia() {
        mediaPlayer = new MediaPlayer();
        mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mediaPlayer) {
                switch (playMode) {
                    case AppHelper.MODE_SEQUENCE:
                        ++curPosition;
                        if (curPosition > appContext.mp3Infos.size() - 1) {
                            curPosition = 0;
                            mediaPlayer.stop();
                            return;
                        }
                        AppHelper.sendBoastCast_curPosition(PlayerService.this, curPosition);
                        path = appContext.mp3Infos.get(curPosition).getUrl();
                        playMusic(0);
                        break;
                    case AppHelper.MODE_SHUFFLE:
                        curPosition = AppHelper.getRandomIndex(appContext.mp3Infos.size() - 1);
                        path = appContext.mp3Infos.get(curPosition).getUrl();
                        AppHelper.sendBoastCast_curPosition(PlayerService.this, curPosition);
                        playMusic(0);
                        break;
                    case AppHelper.MODE_REPEAT:
                        ++curPosition;
                        if (curPosition > appContext.mp3Infos.size() - 1) {
                            curPosition = 0;
                        }
                        AppHelper.sendBoastCast_curPosition(PlayerService.this, curPosition);
                        path = appContext.mp3Infos.get(curPosition).getUrl();
                        playMusic(0);
                        break;
                    case AppHelper.MODE_REPEATONE:
                        mediaPlayer.start();
                        break;
                    default:
                        break;
                }
            }
        });
    }

    /**
     * 注册广播
     */
    void initRegisterReceiver() {
        myReceiver = new MyReceiver();
        IntentFilter filter = new IntentFilter();
        filter.addAction(AppHelper.MUSIC_SERVICE);
        registerReceiver(myReceiver, filter);
    }

    /**
     * 播放音乐
     *
     * @param currentTime 当前播放进度
     */
    void playMusic(int currentTime) {
        try {
            mediaPlayer.reset();
            mediaPlayer.setDataSource(path);
            mediaPlayer.prepare();
            mediaPlayer.setOnPreparedListener(new PreParedListner(currentTime));
            myHandler.sendEmptyMessage(UPDATA_CURRENT_TIME);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 暂停播放
     */
    void pausePlaying() {
        if (mediaPlayer != null && mediaPlayer.isPlaying()) {
            mediaPlayer.pause();
            isPause = true;
        }
    }

    /**
     * 暂停后继续播放
     */
    void rePlayMusic() {
        if (isPause) {
            mediaPlayer.start();
            isPause = false;
        }
    }

    /**
     * 实现一个OnPrepareLister接口,当音乐准备好的时候开始播放
     */
    private final class PreParedListner implements OnPreparedListener {

        private final int currentTime;

        public PreParedListner(int currentTime) {
            this.currentTime = currentTime;
        }

        @Override
        public void onPrepared(MediaPlayer mp) {
            mediaPlayer.start();
            if (currentTime > 0) { // 如果音乐不是从头播放
                mediaPlayer.seekTo(currentTime);
            }
            int duration = mediaPlayer.getDuration();
            AppHelper.sendBoastCast_duration(PlayerService.this, duration);
        }
    }

    /**
     * 接收MianActivity 传来的播放模式
     */
    private class MyReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            int mode = intent.getIntExtra("playMode", 0);
            switch (mode) {
                case AppHelper.MODE_SEQUENCE:
                    playMode = AppHelper.MODE_SEQUENCE;
                    break;
                case AppHelper.MODE_SHUFFLE:
                    playMode = AppHelper.MODE_SEQUENCE;
                    break;
                case AppHelper.MODE_REPEAT:
                    playMode = AppHelper.MODE_REPEAT;
                    break;
                case AppHelper.MODE_REPEATONE:
                    playMode = AppHelper.MODE_REPEATONE;
                    break;
                case AppHelper.MODE_PLAY:
                    path = intent.getStringExtra("url");
                    curPosition = intent.getIntExtra("curPosition", 0);
                    playMusic(0);
                    break;
                case AppHelper.MODE_PAUSE:
                    pausePlaying();
                    break;
                case AppHelper.MODE_CONTINUE:
                    rePlayMusic();
                    break;
                case AppHelper.MODE_PRE:
                    path = intent.getStringExtra("url");
                    curPosition = intent.getIntExtra("curPosition", 0);
                    playMusic(0);
                    break;
                case AppHelper.MODE_NEXT:
                    path = intent.getStringExtra("url");
                    curPosition = intent.getIntExtra("curPosition", 0);
                    playMusic(0);
                    break;
                case AppHelper.MODE_PROGRESS_CHANGE:
                    currentTime = intent.getIntExtra("progress", 0);
                    playMusic(currentTime);
                    break;
                default:
                    break;
            }
        }
    }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Android Service可以用来实现音乐播放功能。具体实现步骤如下: 1. 创建一个Service类,继承自Service类。 2. 在Service类中创建一个MediaPlayer对象,用于播放音乐。 3. 在Service类中实现onStartCommand()方法,用于启动Service并开始播放音乐。 4. 在Service类中实现onDestroy()方法,用于停止音乐播放并释放MediaPlayer对象。 5. 在Activity中通过startService()方法启动Service,并通过bindService()方法绑定Service。 6. 在Activity中通过ServiceConnection接口获取Service实例,并调用Service中的方法控制音乐播放。 以上就是Android Service实现音乐播放的基本步骤。需要注意的是,在Service播放音乐时需要使用异步线程,避免阻塞主线程。同时,需要在AndroidManifest.xml文件中声明Service。 ### 回答2: Android中有多种方式实现音乐播放,其中最常见的方法就是通过Service实现。ServiceAndroid中的一个基本组件,可以在后台执行长时间运行的任务,不与用户界面直接交互。音乐播放器需要在后台持续运行,而不影响用户的交互,因此非常适合使用Service来实现。 在实现音乐播放的Service中,我们需要完成以下步骤: 1. 创建一个Service类,继承自Android中的Service类。 2. 在Service类中创建一个MediaPlayer对象,这是实现音乐播放的关键。 3. 在onCreate()方法中初始化MediaPlayer对象,并将待播放的音频文件传给它。 4. 在Service类中创建一个IBinder对象,用于将Service类与Activity类进行交互。 5. 在onStartCommand()方法中开始音乐播放,并接收Activity传来的指令,如暂停、停止等操作。 6. 在onDestroy()方法中释放MediaPlayer对象,停止音乐播放。 7. 在Activity类中通过ServiceConnection接口获取Service对象的引用,并调用Service类中的方法实现音乐播放的控制。 通过以上步骤,我们就可以顺利地实现一个Android音乐播放器。当然,在实际开发中还需要考虑到音乐播放的异常情况处理、状态栏通知等细节问题。此外,我们还可以通过广播接收器来实现音乐播放完成的通知,以便及时更新UI界面。总之,通过Service实现音乐播放是Android开发中的重要知识点,需要多加练习。 ### 回答3: Android ServiceAndroid 架构中的一个重要组件,能够在后台运行。它被用来执行长时间运行的任务,比如下载数据、音乐播放等,而不会影响用户正在使用的应用程序。 在实现音乐播放的时候,可以使用 Android Service,这样可以让用户在使用其他应用程序的同时,继续听着音乐。下面就是如何使用 Android Service 实现音乐播放的步骤: 1. 引入音乐播放所需的用户权限 在 AndroidManifest.xml 文件中引入以下用户权限: <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> 其中,READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE 权限用来访问设备存储,WAKE_LOCK 权限是用来唤醒屏幕的。 2. 创建 Service 类 在 Android 项目的主包中创建 Service 类。Service 是一种后台运行的组件,不会与用户界面交互。在 onCreate() 方法中初始化 MediaPlayer 类,实现音乐的播放。 例如: public class MusicService extends Service implements MediaPlayer.OnPreparedListener { private MediaPlayer mediaPlayer; @Override public IBinder onBind(Intent intent) { return null; } @Override public int onStartCommand(Intent intent, int flags, int startId) { mediaPlayer = new MediaPlayer(); mediaPlayer.setOnPreparedListener(this); return super.onStartCommand(intent, flags, startId); } @Override public void onPrepared(MediaPlayer mp) { mp.start(); } } 3. 实现音乐播放器的逻辑代码 在 Activity 中编写逻辑代码来使用 Service。使用 Intent 启动 Service,将要播放的音乐文件路径传递给 Service,并调用 prepareAsync() 方法来异步准备音乐播放器。 例如: public class MainActivity extends AppCompatActivity { private final String music_path = "/sdcard/music/music.mp3"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Intent intent = new Intent(this, MusicService.class); intent.putExtra("music_path", music_path); startService(intent); } } 在 Service 中处理传递过来的音乐文件路径,然后调用 prepareAsync() 方法异步准备播放器。当音乐准备好后,回调 onPrepared() 方法就可以启动播放器了。 例如: public class MusicService extends Service implements MediaPlayer.OnPreparedListener { private MediaPlayer mediaPlayer; @Override public IBinder onBind(Intent intent) { return null; } @Override public int onStartCommand(Intent intent, int flags, int startId) { String music_path = intent.getStringExtra("music_path"); mediaPlayer = new MediaPlayer(); try { mediaPlayer.setDataSource(music_path); mediaPlayer.setOnPreparedListener(this); mediaPlayer.prepareAsync(); } catch (IOException e) { e.printStackTrace(); } return super.onStartCommand(intent, flags, startId); } @Override public void onPrepared(MediaPlayer mp) { mp.start(); } } 实现了以上三步,就可以非常简单地实现音乐播放了。值得注意的是,服务在调用 stopService() 方法停止时,需要在 onDestroy() 方法中处理 mediaPlayer.stop()、mediaPlayer.release() 以及 mediaPlayer= null 来释放资源。 以上就是使用 Android Service 实现音乐播放的步骤。在实际开发中,还需要根据需求进行适当的改动和完善,比如增加音量、暂停/继续播放、重复播放等功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值