Android使用Service播放音乐

像音乐这种耗时的和适合后台操作的应当放在Service中进行操作,而不是放在Activity,下面就介绍使用Service的音乐播放器

先创建一个MusicService

配置清单中会自动生成 改Service的声明

在MusicService中的Java代码,里面包含了音乐的相关操作

public class MusicService extends Service {
    private String path = "mnt/sdcard/123.mp3";
    private MediaPlayer player;

    @Override
    public IBinder onBind(Intent intent) {
        //当执行完了onCreate后,就会执行onBind把操作歌曲的方法返回
        return new MyBinder();
    }

    @Override
    public void onCreate() {
        super.onCreate();
        //这里只执行一次,用于准备播放器
        player = new MediaPlayer();
        try {
            player.setDataSource(path);
            //准备资源
            player.prepare();
        } catch (IOException e) {
            e.printStackTrace();
        }
        Log.e("服务", "准备播放音乐");
    }

    //该方法包含关于歌曲的操作
    public class MyBinder extends Binder {

        //判断是否处于播放状态
        public boolean isPlaying(){
            return player.isPlaying();
        }

        //播放或暂停歌曲
        public void play() {
            if (player.isPlaying()) {
                player.pause();
            } else {
                player.start();
            }
            Log.e("服务", "播放音乐");
        }

        //返回歌曲的长度,单位为毫秒
        public int getDuration(){
            return player.getDuration();
        }

        //返回歌曲目前的进度,单位为毫秒
        public int getCurrenPostion(){
            return player.getCurrentPosition();
        }

        //设置歌曲播放的进度,单位为毫秒
        public void seekTo(int mesc){
            player.seekTo(mesc);
        }
    }
}

布局中只添加一个按钮和进度条

    <Button
        android:id="@+id/play"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="play"
        android:text="播放" />

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

在MainActivity中的Java代码

public class MainActivity extends AppCompatActivity {

    private MyConnection conn;
    private MusicService.MyBinder musicControl;

    private Button playBtn;
    private SeekBar seekBar;
    private static final int UPDATE_PROGRESS = 0;

    //使用handler定时更新进度条
    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case UPDATE_PROGRESS:
                    updateProgress();
                    break;
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        playBtn = (Button) findViewById(R.id.play);
        seekBar = (SeekBar) findViewById(R.id.sb);

        Intent intent3 = new Intent(this, MusicService.class);
        conn = new MyConnection();
        //使用混合的方法开启服务,
        startService(intent3);
        bindService(intent3, conn, BIND_AUTO_CREATE);

        seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                //进度条改变
                if (fromUser){
                    musicControl.seekTo(progress);
                }
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {
                //开始触摸进度条
            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
                //停止触摸进度条
            }
        });
    }

    private class MyConnection implements ServiceConnection {

        //服务启动完成后会进入到这个方法
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            //获得service中的MyBinder
            musicControl = (MusicService.MyBinder) service;
            //更新按钮的文字
            updatePlayText();
            //设置进度条的最大值
            seekBar.setMax(musicControl.getDuration());
            //设置进度条的进度
            seekBar.setProgress(musicControl.getCurrenPostion());
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        //进入到界面后开始更新进度条
        if (musicControl != null){
            handler.sendEmptyMessage(UPDATE_PROGRESS);
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //退出应用后与service解除绑定
        unbindService(conn);
    }

    @Override
    protected void onStop() {
        super.onStop();
        //停止更新进度条的进度
        handler.removeCallbacksAndMessages(null);
    }

    //更新进度条
    private void updateProgress() {
        int currenPostion = musicControl.getCurrenPostion();
        seekBar.setProgress(currenPostion);
        //使用Handler每500毫秒更新一次进度条
        handler.sendEmptyMessageDelayed(UPDATE_PROGRESS, 500);
    }

    //更新按钮的文字
    public void updatePlayText() {
        if (musicControl.isPlaying()) {
            playBtn.setText("暂停");
            handler.sendEmptyMessage(UPDATE_PROGRESS);
        } else {
            playBtn.setText("播放");
        }
    }

    //调用MyBinder中的play()方法
    public void play(View view) {
        musicControl.play();
        updatePlayText();
    }
}

效果图

时间: 2024-10-11 00:23:46

Android使用Service播放音乐的相关文章

android 利用 service 实现音乐播放

今天的播放器利用了service,播放音乐在service端,进度条在activity端,因此主要的工作就是activity和service的交互,本文将利用IBinder进行交互,主要是activity可以调用service的函数,可以参考我的这篇博客. 本文关键点:利用利用IBinder实现activity 控制service 实现功能: 1 控制播放进度: activity调用service的函数,对MediaPlayer进行控制.包括启动时的播放和滑动seekbar时,对MediaPla

android 使用 service 实现音乐

今天的球员趁service.播放音乐service结束,进度条activity结束,因此,基础工作activity和service互动,本文将使用IBinder互动.主要activity能够调用service的函数.能够參考我的这篇博客. 本文关键点:利用利用IBinder实现activity 控制service 实现功能: 1 控制播放进度: activity调用service的函数,对MediaPlayer进行控制. 包含启动时的播放和滑动seekbar时.对MediaPlayer进行设置,

Android连接蓝牙耳机播放音乐

参考: Android实现主动连接蓝牙耳机 具体实现: private static final String TAG = "BluetoothA2DPTest"; private BroadcastReceiver mBroadcastReceiver; private BluetoothA2dp mBluetoothA2dp; private BluetoothAdapter mBluetoothAdapter; private String DEVICE_NAME = "

Android实现在线播放音乐

原文地址:http://blog.csdn.net/wwj_748/article/details/20933055 在此感谢原作者 效果实现: 下面介绍具体实现过程: 定义一个具有缓冲效果的播放器:Player 我们看到的缓冲效果,是通过设置拖动条SeekBar的二级进度实现的,这就要设置MediaPlayer的缓冲更新的监听了. 具体代码实现: package com.wwj.download.util; import java.io.IOException; import java.uti

Android实例-MediaPlayer播放音乐和视频(XE8+小米2)

结果: 1.播放视频需要手动放入MediaPlayerControl1控件,设置MediaPlayerControl1.MediaPlayer := MediaPlayer1; 2.播放声音文件正常,但播放器视时发现,第一边正常第二边就报错了(哪位大神知道的,请M我哦,先谢谢了). 3.打包时需要打入MP3与MP4文件,路径为"assets\internal\". 实例代码: 1 unit Unit1; 2 3 interface 4 5 uses 6 System.SysUtils,

android 5.0 播放音乐时闹钟响,此时来电话并挂断,闹钟和音乐同时响

请按照如下方法进行修改: frameworks\base\media\java\android\media\MediaFocusControl.java: 1.import packages: import com.android.internal.telephony.ITelephony; import android.os.ServiceManager; 2.增加获取当前Phone Call State的方法getPhoneCallState(): private int getPhoneC

android Alarm闹钟发送广播播放音乐

通过网上的例子  自己根据相关功能修改的  如有不合理的地方  请提出来  互相学习 一共有3个类 MainActivity.java 主程序 AlarmReceiver.java 广播接收器 MusicService.java service播放音乐 MainActivity.java package com.yqy.yqy_alarm; import java.util.Calendar; import android.app.Activity; import android.app.Ala

android使用service

运行效果:一开始app调用service播放音乐,点击左上角的音量按钮会停止播放音乐.         结构目录图: activity_main.xml: 1 <?xml version="1.0" encoding="utf-8"?> 2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:app="ht

手机影音第十五天,利用service实现后台播放音乐,在通知栏显示当前音乐信息等

代码已经托管到码云上,有兴趣的小伙伴可以下载看看 https://git.oschina.net/joy_yuan/MobilePlayer 先来一张目前的音乐播放器的效果图,当播放时,手机的状态通知栏也会有音乐信息显示. 这里可以看到有歌名.演唱者,还有歌曲的总时间,当前播放时间,当前播放进度,音乐暂停.下一首,上一首,音乐循环模式(单曲循环,顺序播放.循环播放)功能的实现.下一步就是把中间空白的部分填充歌词,然后做成根据进度显示歌词. 由于这次的内容有点多,是写了一天半的代码,讲的没那么细,