Android使用Service播放音乐

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

先创建一个MusicService,在Android Studio中,点击包名右键New-->Service-->Service

如果是按照上面的方法创建的Service,配置清单中会自动生成 改Service的声明

在MusicService中的Java代码,里面包含了音乐的相关操作复写了onCreate()用于初始化播放器

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();
    }
}

最后别忘了添加读写内存卡的权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

效果图

 既然说到音乐播放器了,就顺便说说如何播放网络上的音乐,这是个很重要的功能,其实跟播放本地的差不多,只是用了异步准备,使用setOnPreparedListener()监听是否准备完成才去播放

private MediaPlayer player;

if (player == null){
            //如果为空就new我一个
            player = new MediaPlayer();
            try {
                player.setDataSource("http://www.w3school.com.cn/i/horse.mp3");
                //异步准备
                player.prepareAsync();
                //添加准备好的监听
                player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                    @Override
                    public void onPrepared(MediaPlayer mp) {
                        //如果准备好了,就会进行这个方法
                        mp.start();
                    }
                });
            } catch (IOException e) {
                e.printStackTrace();
            }
        }else {
            //判断是否处于播放状态
            if (player.isPlaying()){
                player.pause();
            }else {
                player.start();
            }
        }

要访问网络,就别忘了加权限

<uses-permission android:name="android.permission.INTERNET"/>

项目源代码:https://resource.doiduoyi.com/#6a9ak65

  • 21
    点赞
  • 150
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论
### 回答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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜雨飘零1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值