Android学习之路4——音乐播放器后台播放

Android学习之路4——音乐播放器后台播放

一、实验题目

  • 简单音乐播放器

二、实现内容

  • 实现一个简单的播放器,要求功能有:
    • 播放、暂停、停止、退出功能,按停止键会重置封面转角,进度条和播放按钮;按退出键将停止播放并退出程序。
    • 后台播放功能,按手机的返回键和home键都不会停止播放,而是转入后台进行播放。
    • 进度条显示播放进度、拖动进度条改变进度功能。
    • 播放时图片旋转,显示当前播放时间功能,圆形图片的实现使用的是一个开源控件CircleImageView
  • 加分项
    • 用户可以点击选歌按钮自己选择歌曲进行播放,要求换歌后不仅能正常实现上述的全部功能,还要求选歌成功后不自动播放,重置播放按钮,重置进度条,重置歌曲封面转动角度,最重要的一点:需要解析mp3文件,并更新封面图片。

三、实验结果:

  • 进入后的界面:

  • 点击播放后:
    在这里插入图片描述

  • 点击file图标选择文件:

  • 选择歌曲后:

  • 拖动进度条播放:

  • 点击退出图标退出后再进入界面也能正确显示。

四、实验步骤及主要代码:

  • Step1:布局

    • 整体用的是线性布局,比较适合。

    • 音乐专辑图片用到圆形图片空间CircleImageView

      <de.hdodenhof.circleimageview.CircleImageView
              xmlns:app="http://schemas.android.com/apk/res-auto"
              android:id="@+id/image"
              android:layout_width="wrap_content"
              android:layout_height="0dp"
              android:src="@drawable/img"
              app:civ_border_color="#FF000000"
              android:layout_margin="20dp"
              android:layout_weight="10"
              android:layout_gravity="center"/>
      
    • 进度条用的是SeekBar:

      <SeekBar
                  android:id="@+id/seek_bar"
                  android:layout_width="0dp"
                  android:layout_height="wrap_content"
                  app:layout_constraintLeft_toRightOf="@id/start_time"
                  app:layout_constraintRight_toLeftOf="@id/end_time"
                  android:layout_marginHorizontal="2dp" />
      
    • 其它的就是布局的一些基本功了。

  • Step2:创建一个服务Service

    • File->New->Service->Service,通过这种方法创建AS会自动配置好,比如创建名叫MusicService的服务,在AndroidManifest.xml会生成以下代码:

      <service
                  android:name=".MusicService"
                  android:enabled="true"
                  android:exported="true"></service>
      
    • 在MusicService新创一个MyBinder继承Binder用于在主活动和服务之间联系:

      	private IBinder myBinder = new MyBinder();
          public class MyBinder extends Binder{
             
              public MusicService getService(){
             
                  return MusicService.this;
              }
          }
          @Override
          public IBinder onBind(Intent intent) {
             
              return myBinder;
          }
      
    • 点击返回键活动会销毁,但如果没有指定销毁服务,服务还是不会销毁的,所以变量MediaPlayer要在服务MusicService类里面创建,并且要设为static,由此至终只有一个MediaPlayer实例,个人感觉MusicService可以设成单例模式,但查了关于音乐播放器的其它例子,没见到有用单例模式的,所以最后还是没采用了。把MediaPlayer的相关操作封装在MusicService里面:

          //MusicService.java
       	public static MediaPlayer mediaPlayer = null;
          private static String mediaPath;
          public MusicService(){
             
              //Log.d("MusicService","Gouzhao");
              if(mediaPlayer == null){
             
                  mediaPlayer= new MediaPlayer();
                  initMediaPlayer();
              }
          }
          //TODO :播放或暂停
          public boolean playOrPause(){
             
              Log.d("MusicService","playOrPause")
  • 6
    点赞
  • 70
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值