服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Android - Android实现音乐播放进度条传递信息的两种方式(在service和activity中)

Android实现音乐播放进度条传递信息的两种方式(在service和activity中)

2022-12-15 14:42Incimo Android

这篇文章主要介绍了Android:在service和activity之中,实现音乐播放进度条传递信息的两种方式,MediaPlayer做音乐播放器采坑以及解决办法,需要的朋友可以参考下

实现播放时的进度条显示,或是定时从service获取某些信息,是我们日常开发中经常遇到的需求,下面介绍当音乐再service中运行时,activity如果获取音乐进度信息的两种方式:

一、在activity中建立消息接收机制

我们需要在activity中建立一个用于接收信息的handler(handler简单的说是在android中可以发送消息和也可以处理消息的一种机制,当然它的用途更加强大,有时间可以去自己了解)

我们需要在onCreate方法之前添加handler,这样才能保证当我们的activity被destroy之后,再重建时可以第一时间获取当前音乐的进度。

下面是代码,有的同学可能看出来了,这个Handler的handleMessage被重写了,handleMessage写在了new Handler.Callback()回调函数中,返回值变成了boolean,其实这样做是为了防止内存泄漏,当然如果你能忍受Android Studio那一坨巨大的黄色警告你也可以选择用原本的handler方法,

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//当前音乐播放进度
  private static TextView nowTime;
    //音乐进度条
  static SeekBar songseek;
  
  //运用Handler中的handleMessage方法接收service传递的音乐播放进度信息
  public static Handler handler = new Handler(new Handler.Callback() {
    @Override
    public boolean handleMessage(Message msg) {
      // super.handleMessage(msg);
      // 将SeekBar位置设置到当前播放位置,
      // msg.arg1是service传过来的音乐播放进度信息,将其设置为进度条进度
      songseek.setProgress(msg.arg1);
      //将进度时间其转为mm:ss时间格式
      nowTime.setText(new SimpleDateFormat("mm:ss",Locale.getDefault()).format(new Date(msg.arg1)));
      return false;
    }
  });
 
    //下面才是android的onCreate方法
    protected void onCreate(Bundle savedInstanceState) {
        ......
    }

二、在service中建立一个定时器来定时发送音乐进度信息

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//开始播放音乐
        mediaPlayer.start();
    //每隔50毫秒发送音乐进度
    Timer timer = new Timer();
        timer.schedule(new TimerTask() {
        @Override
            public void run() {
                //实例化一个Message对象
                Message msg = Message.obtain();
                //Message对象的arg1参数携带音乐当前播放进度信息,类型是int
        msg.arg1 = mediaPlayer.getCurrentPosition();
        //使用MainActivity中的handler发送信息
        MainActivity.handler.sendMessage(msg);
            }
    }, 0, 50);

当然你也可以使用线程的方式来发现音乐进度信息,不过在这里并不推荐,因为单纯的音乐播放进度信息而已,没有必要用到线程来传信息,而已每一次执行都会创建一个线程,这样很浪费资源

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//创建一个线程每隔100毫秒发送一次信息
    Runnable runnable = new Runnable() {
        @Override
            public void run() {
                while (true) {
                    try {
                        Thread.sleep(100);
          } catch (InterruptedException e) {
            e.printStackTrace();
          }
          Message msg = Message.obtain();
          msg.arg1 = mediaPlayer.getCurrentPosition();
          MainActivity.handler.sendMessage(msg);
          }
         }
      };
    Thread musicThread = new Thread(runnable);
    musicThread.start();

附:MediaPlayer做音乐播放器采坑以及解决办法1.千万不要把mediaPlayer.getDuration()放在定时任务里,线程和定时器都不能放

因为mediaPlayer.prepare()的执行速度很低,有概率出现mediaPlayer.prepare()还在执行中,突然定时器里刚刚好到时间该调用mediaPlayer.getDuration()这个方法,结果就是mediaPlayer.prepare()因为没有初始化成功就调用mediaPlayer.getDuration()而报下面的错误导致程序闪退。

?
1
java.lang.IllegalStateException android.media.MediaPlayer._prepare(Native Method)

(当然如果你的定时操作间隔越大出错的概率就越小,不过我强迫症就是忍不了)

2.上面提到mediaPlayer.prepare()的执行速度很低,如何解决

使用mediaPlayer.prepare()时,正常操作是:

?
1
2
mediaPlayer.prepare();
    mediaPlayer.start();

建议使用 mediaPlayer.prepareAsync()来代替mediaPlayer.prepare(),下面的代码可以取代上面

?
1
2
3
4
5
6
7
8
mediaPlayer.prepareAsync();
    //需要设置一个监听器
    mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mp) {
            mediaPlayer.start();
        }
    });

看一下效果

Android实现音乐播放进度条传递信息的两种方式(在service和activity中)

Android作业 音乐播放器

总结

到此这篇关于Android实现音乐播放进度条传递信息的两种方式(在service和activity中)的文章就介绍到这了,更多相关android 实现音乐播放进度条内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/qq_41912398/article/details/105768940

延伸 · 阅读

精彩推荐
  • AndroidAndroid实现从相册截图的功能

    Android实现从相册截图的功能

    这篇文章主要介绍了Android实现从相册截图的功能,简单介绍了Android实现从相册截图功能的步骤,供大家参考,感兴趣的小伙伴们可以参考一下...

    Kriss7032021-05-11
  • AndroidAndroid创建外部lib库及自定义View的图文教程

    Android创建外部lib库及自定义View的图文教程

    这篇文章主要给大家介绍了关于Android创建外部lib库及自定义View的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学...

    阿策神奇9312022-08-17
  • Androidandroid利用剪切板传递数据

    android利用剪切板传递数据

    这篇文章主要为大家详细介绍了android利用剪切板传递数据,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    勤劳的蚂蚁885202022-12-06
  • AndroidAndroid使用Kotlin实现多节点进度条

    Android使用Kotlin实现多节点进度条

    这篇文章主要为大家详细介绍了Android使用Kotlin实现多节点进度条,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    c13120522569052022-12-05
  • AndroidAndroid ProgressBar进度条使用详解

    Android ProgressBar进度条使用详解

    ProgressBar进度条,分为旋转进度条和水平进度条,进度条的样式根据需要自定义,这篇文章主要介绍了Android ProgressBar进度条使用方法,感兴趣的小伙伴们可...

    Android开发网9762021-05-27
  • Androidpopupwindow焦点问题解决方案

    popupwindow焦点问题解决方案

    在android 开发过程中,总会遇到一些问题,比如popupwindow焦点问题等等,我们该如何解决呢?需要的朋友可以了解下...

    Android教程网5452020-12-20
  • AndroidAndroid的异步任务AsyncTask详解

    Android的异步任务AsyncTask详解

    本文给大家介绍的是Android的异步任务AsyncTask,在Android中实现异步任务机制有两种方式,Handler和AsyncTask。今天我们先来主要谈下ASYNCTASK。...

    Android开发网5912021-03-28
  • AndroidAndroid Thread 介绍与实例

    Android Thread 介绍与实例

    Android Thread 介绍与实例,需要的朋友可以参考一下...

    Android开发网5542021-01-23