【达内课程】音乐播放器4.0(播放详情页中)

2024-05-12 09:48

本文主要是介绍【达内课程】音乐播放器4.0(播放详情页中),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 效果图
  • 更新进度条
  • 上一曲、下一曲
  • 显示标题和专辑

效果图

在这里插入图片描述

更新进度条

要更新进度条,需要 PlayMusicService 中发送广播,每秒发送广播,广播中携带播放进度信息,因此在 PlayMusicService 的 onCreate 方法中开启一个线程,写在 onCreate 中保证只起一条线程

private boolean isLoop = true;/*** 当service实例创建时执行*/@Overridepublic void onCreate() {super.onCreate();//给mediaPlayer加监听......//启动工作线程,每隔1s发送一次更新进度的广播new updateProgressThread().start();}/*** 更新进度的线程* 每秒发送广播,广播中携带播放进度信息*/class updateProgressThread extends Thread{@Overridepublic void run() {while (isLoop){try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}//发送自定义广播if(mediaPlayer.isPlaying()){int total = mediaPlayer.getDuration();int currentPosition = mediaPlayer.getCurrentPosition();Intent intent = new Intent(Globalconsts.ACTION_UPDATE_MUSIC_PROGRESS);intent.putExtra("total",total);intent.putExtra("current",currentPosition);sendBroadcast(intent);}}}}

Activity 中修改广播接收器的代码

    private SeekBar seekBar;private TextView tv_play_music_total_time;private TextView tv_play_music_current_time;private void setViews() {......seekBar = findViewById(R.id.sk_play_music_progress);tv_play_music_total_time = findViewById(R.id.tv_play_music_total_time);tv_play_music_current_time = findViewById(R.id.tv_play_music_current_time);}/*** 注册广播接收器*/private void registMusicReceiver() {receiver = new MusicInfoBroadCastReceiver();IntentFilter intentFilter = new IntentFilter();intentFilter.addAction(Globalconsts.ACTION_MUSIC_STARTED);intentFilter.addAction(Globalconsts.ACTION_UPDATE_MUSIC_PROGRESS);this.registerReceiver(receiver, intentFilter);}....../*** 接收音乐信息的广播接收器*/class MusicInfoBroadCastReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();if (action.equals(Globalconsts.ACTION_UPDATE_MUSIC_PROGRESS)) {//获取广播中的total\currentint total = intent.getIntExtra("total", 0);int current = intent.getIntExtra("current", 0);//更新seekbarseekBar.setMax(total);seekBar.setProgress(current);String totalStr = Globalconsts.FORMAT.format(new Date(total));String currentStr = Globalconsts.FORMAT.format(new Date(current));tv_play_music_total_time.setText(totalStr);tv_play_music_current_time.setText(currentStr);} else if (action.equals(Globalconsts.ACTION_MUSIC_STARTED)) {......}}}

同时,Globalconsts 增加

    public static final SimpleDateFormat FORMAT = new SimpleDateFormat("mm:ss");//音乐开始播放 广播actionpublic static final String ACTION_MUSIC_STARTED = "ACTION_MUSIC_STARTED";

给进度条增加拖拽事件,MainActivity 中修改 bindMusicService() 中的 binder 对象为全局变量

    private PlayMusicService.MusicBinder binder;private void setListeners() {//给seekbar加监听seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {@Overridepublic void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {if (fromUser) {//由用户引起//seektobinder.seekTo(progress);}}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {}@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {}});......}

PlayMusicService 中 MusicBinder 里增加 seekTo方法

public class MusicBinder extends Binder{//定义供客户端调用的方法/*** 跳转到相应位置 继续播放/暂停*/public void seekTo(int position){mediaPlayer.seekTo(position);}......}

上一曲、下一曲

实现上一曲和下一曲,首先给三个图片(上一首,下一首,暂停图片)增加点击事件,同时在
MusicBinder 中 MusicBinder 中增加播放或暂停的方法

首先给 MusicBinder 中的 MusicBinder 中增加播放或暂停的方法

        //暂停或开始播放public void playOrPause(){if(mediaPlayer.isPlaying()){mediaPlayer.pause();}else {mediaPlayer.start();}}

Activity 给三个图片(上一首,下一首,暂停图片)增加点击事件

public class TestActivity extends AppCompatActivity implements View.OnClickListener {......private MusicApplication app;private ImageView img_pre_music;private ImageView img_pause_music;private ImageView img_next_music;private MusicModel musicModel = new MusicModel();......private void setViews() {......img_pre_music = findViewById(R.id.img_pre_music);img_pause_music = findViewById(R.id.img_pause_music);img_next_music = findViewById(R.id.img_next_music);}......private void setListeners() {......imgMusicThumb.setOnClickListener(this);img_pre_music.setOnClickListener(this);img_pause_music.setOnClickListener(this);img_next_music.setOnClickListener(this);}@Overridepublic void onClick(View v) {switch (v.getId()) {......case R.id.img_pre_music:app.setPosition(app.getPosition() == 0 ? 0 : app.getPosition() - 1);//这里会出空指针,当前歌曲只有在点击播放后才能拿到currentmusic的信息final MusicItem music = app.getCurrentMusic();if (music.url != null) {//基本信息已经加载过//播放音乐binder.playMusic(music.url);} else {//通过songid获取基本信息musicModel.loadMusicInfoBySongId(music.id, new MusicInfoCallback() {@Overridepublic void onMusicInfoLoaded(MusicItem musicItem) {music.url = musicItem.url;music.id = musicItem.id;binder.playMusic(musicItem.url);}});}break;case R.id.img_pause_music:binder.playOrPause();break;case R.id.img_next_music:app.setPosition(app.getPosition() == app.getMusicList().size() - 1 ? 0 : app.getPosition() + 1);final MusicItem music2 = app.getCurrentMusic();if (music2.url != null) {//基本信息已经加载过//播放音乐binder.playMusic(music2.url);} else {//通过songid获取基本信息musicModel.loadMusicInfoBySongId(music2.id, new MusicInfoCallback() {@Overridepublic void onMusicInfoLoaded(MusicItem musicItem) {music2.url = musicItem.url;music2.id = musicItem.id;binder.playMusic(musicItem.url);}});}break;}}......
}

解决点击上一曲下一曲按钮时,触发listview的onclick事件,给rlPlayMusic加上onTouch事件,返回true即可

private void setListeners() {//给rlPlayMusic注册onTouch事件(触摸执行)rlPlayMusic.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View view, MotionEvent motionEvent) {//如果返回truereturn true;//如果返回false//return false;}});......
}

显示标题和专辑

这一步很简单,在 Activity 中,广播接收器接收到开始的通知时,显示标题和专辑即可

/*** 接收音乐信息的广播接收器*/class MusicInfoBroadCastReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();if (action.equals(Globalconsts.ACTION_UPDATE_MUSIC_PROGRESS)) {......} else if (action.equals(Globalconsts.ACTION_MUSIC_STARTED)) {//开始播放音乐,获取当前音乐对象app = MusicApplication.getApp();MusicItem music = app.getCurrentMusic();String pic = music.albumPic;final String title = music.name;tv_play_music_title.setText(title);tv_play_music_singer.setText(music.albumName);......}}}

这篇关于【达内课程】音乐播放器4.0(播放详情页中)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/982283

相关文章

流媒体平台/视频监控/安防视频汇聚EasyCVR播放暂停后视频画面黑屏是什么原因?

视频智能分析/视频监控/安防监控综合管理系统EasyCVR视频汇聚融合平台,是TSINGSEE青犀视频垂直深耕音视频流媒体技术、AI智能技术领域的杰出成果。该平台以其强大的视频处理、汇聚与融合能力,在构建全栈视频监控系统中展现出了独特的优势。视频监控管理系统EasyCVR平台内置了强大的视频解码、转码、压缩等技术,能够处理多种视频流格式,并以多种格式(RTMP、RTSP、HTTP-FLV、WebS

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

EasyPlayer.js网页H5 Web js播放器能力合集

最近遇到一个需求,要求做一款播放器,发现能力上跟EasyPlayer.js基本一致,满足要求: 需求 功性能 分类 需求描述 功能 预览 分屏模式 单分屏(单屏/全屏) 多分屏(2*2) 多分屏(3*3) 多分屏(4*4) 播放控制 播放(单个或全部) 暂停(暂停时展示最后一帧画面) 停止(单个或全部) 声音控制(开关/音量调节) 主辅码流切换 辅助功能 屏

一款支持同一个屏幕界面同时播放多个视频的视频播放软件

GridPlayer 是一款基于 VLC 的免费开源跨平台多视频同步播放工具,支持在一块屏幕上同时播放多个视频。其主要功能包括: 多视频播放:用户可以在一个窗口中同时播放任意数量的视频,数量仅受硬件性能限制。支持多种格式和流媒体:GridPlayer 支持所有由 VLC 支持的视频格式以及流媒体 URL(如 m3u8 链接)。自定义网格布局:用户可以配置播放器的网格布局,以适应不同的观看需求。硬

《数字图像处理(面向新工科的电工电子信息基础课程系列教材)》P98

更改为 差分的数学表达式从泰勒级数展开式可得: 后悔没听廖老师的。 禹晶、肖创柏、廖庆敏《数字图像处理(面向新工科的电工电子信息基础课程系列教材)》 禹晶、肖创柏、廖庆敏《数字图像处理》资源二维码

UniApp实现漂亮的音乐歌词滚动播放效果

在现代的音乐播放应用中,歌词的展示和滚动播放已经成为了一个非常常见的功能。今天,我们将通过UniApp来实现一个漂亮的歌词滚动播放功能。我们将使用UniApp提供的组件和API来完成这个任务。 页面结构 在页面的模板部分,我们需要创建一个音频播放器和歌词展示区域。使用<scroll-view>组件来实现歌词的滚动效果。 <template><view class="audio-co

Mongodb最新版本安装(4.0以上)

最近学习Mongodb数据库 总结了一下心得分享给大家 一,首先需要去官网下载Mongodb  网址https://www.mongodb.com/download-center/community   如下图所示 选择版本号、对应的操作系统、安装包后 点击download  开始下载  下载完成后双击安装就行 安装步骤 1.双击之后如图所示 直接next 2.由于笔者没有保存这张

QT项目实战之音乐播放器2.0版本

该版本相较于1.0版本最主要的不同在于连接数据库实现类似于歌曲收藏和取消收藏的功能。 详细情况看我的这篇文章http://t.csdnimg.cn/WS5s8。 效果展示 VSMyMusicShow2.0 define.h UseMySQL.h   musicInfo.h   VSMyMusicPlayer.h

Vue 中实现视频播放的艺术

随着前端技术的飞速发展,视频播放在 Web 应用中已经成为了一个不可或缺的功能。从社交媒体平台到教育网站,再到在线购物平台,视频元素无处不在。而 Vue.js 作为当今最流行的前端框架之一,在实现视频播放时提供了很多强大的工具和技巧。在这篇博客中,我们将深入探讨如何使用 Vue.js 实现视频播放功能,不仅仅是简单地嵌入视频,还要添加一些高级功能,如自定义播放器控件、播放进度条、视频切换、事件处理

《黑神话:悟空》专题合集MOD/修改器/壁纸/音乐/CG剧情

《黑神话:悟空》专题合集」 链接:https://pan.quark.cn/s/d67857f4e308 包含内容: 《黑神话:悟空》MOD合集 《黑神话:悟空》修改器(风灵月影) 《黑神话:悟空》壁纸合集 《黑神话:悟空》3小时CG完整剧情合集 4K120帧最高画质!国语 简中字幕 附:4K 结尾动画合集 ​​​国语 简中字幕 《黑神话:悟空》主题曲 《黑神话