Android开发实战之简单音乐播放器

 最近开始学习音频相关。所以,很想自己做一个音乐播放器,于是,花了一天学习,将播放器的基本功能实现了出来。我觉得学习知识点还是蛮多的,所以写篇博客总结一下关于一个音乐播放器实现的逻辑。希望这篇博文对你的学习和生活有所帮助。效果图:

**实现逻辑**

  在市面上的音乐播放app,即时你关了。那么一样会在后台播放,所以播放的逻辑应该写在Service中。并且能够实现Service和Activity之间进行通信。那么Service是四大组件之一,所以在使用的时候一定不要忘了在配置文件中声明一下。

     <service android:name="com.yakir.services.MusicService">

        </service>

 

我们需要重写Service中的三个方法,onCreate(),onStartCommand(),onDestroy()。

onCreate():Service第一次启动的时候调用这个方法,可以做一些变量的初始化。

onStartCommand():Service每一次启动的时候调用这个方法,可以在此方法写一些业务逻辑。

onDestroy():Service销毁的时候调用,用于释放资源。

  接下来,如果需要播放一个音乐文件,可以使用安卓自带的播放器MediaPlayer,将播放逻辑封装起来:

    //开始
    public void start(String path) {
        try {
            mediaPlayer.reset();
            mediaPlayer.setDataSource(path);
            mediaPlayer.prepare();
            mediaPlayer.start();
            MediaUtils.currentState= Constants.PLAY_START;
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    //暂停
    public void pause (){
        if (mediaPlayer!=null&&mediaPlayer.isPlaying()) {
            mediaPlayer.pause();
            MediaUtils.currentState=Constants.PLAY_PAUSE;
        }
    }
    //继续播放
    public void continuePlay() {
        if (mediaPlayer!=null&&!mediaPlayer.isPlaying()) {
            mediaPlayer.start();
            MediaUtils.currentState= Constants.PLAY_START;
        }
    }
    //停止播放
    public void stop() {
        if (mediaPlayer!=null) {
            mediaPlayer.stop();
            MediaUtils.currentState=Constants.PLAY_STOP;
        }
    }

我们知道,UI是写在Activity中的,那么就涉及到Activity与Service之间进行通信,他们之间通信的方式有5种,这里我是用了Intent,调用startService()进行通信,

同时让Intent携带一组键值对数据,与Service端进行匹配。

Activity:

   private void startMusicService(String option,String path) {
        Intent intentService = new Intent(MainActivity.this, MusicService.class);
        intentService.putExtra("option", option);
        intentService.putExtra("messenger",new Messenger(handler));
        intentService.putExtra("path", path);
        startService(intentService);
    }
    private void startMusicService(String option) {
        Intent intentService = new Intent(MainActivity.this, MusicService.class);
        intentService.putExtra("option", option);
        intentService.putExtra("messenger",new Messenger(handler));
        startService(intentService);
    }
    private void startMusicService(String option,int progress) {
        Intent intentService = new Intent(MainActivity.this, MusicService.class);
        intentService.putExtra("option", option);
        intentService.putExtra("progress",progress);
        intentService.putExtra("messenger",new Messenger(handler));
        startService(intentService);
    }

 Service:

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.e("thread",Thread.currentThread().getName() );
        String option=intent.getStringExtra("option");
        if (messenger==null) {
            messenger = (Messenger) intent.getExtras().get("messenger");
        }
        if ("开始".equals(option)) {
            start(intent.getStringExtra("path"));
        } else if ("暂停".equals(option)) {
            pause();
        } else if ("继续".equals(option)) {
            continuePlay();
        } else if ("停止".equals(option)) {
            stop();
        } else if ("跳转".equals(option)) {
            seekPlay(intent.getIntExtra("progress",-1));
        }
        return super.onStartCommand(intent, flags, startId);
    }

这样,就实现了两者之间的通信,接下来,当我点击下一首的时候,那么下一个item的文字高亮,并且播放下一首歌。

先从系统中拿到所有的音频数据:

   public static void getSongList (Context context) {
        musicBeanList.clear();
        Uri uri= MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
        Cursor cursor=context.getContentResolver().query(uri,
                new String[]{
                        MediaStore.Audio.Media.TITLE,
                        MediaStore.Audio.Media.ARTIST,
                        MediaStore.Audio.Media.DATA},null,null,null);
        while (cursor.moveToNext()) {
            musicBeanList.add(new MusicBean(
                    cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE)),
                    cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST)),
                    cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA))));
        }
    }

通过内容提供者,拿到系统的所有音频数据,以及音频的相关信息。DATA就是音频路径,拿到音频路径后就可以根据现实位置进行播放切换了。(这里很简单,不细说)

处理文字高亮:

我们需要知道当前的item位置和下一个item位置,当点击下一首歌曲,下个位置高亮,其他位置不亮。所以,需要我们定义一个常量记录当前位置,并且,当点击下一首,常量增加,上一首,常量减少。

   case R.id.ib_bottom_last:
                  setColor(Color.BLUE);
                  MediaUtils.currentPosition--;
                  setColor(Color.RED);
                  startMusicService("开始",MediaUtils.musicBeanList.get(MediaUtils.currentPosition).path);
                  imgBottomPlay.setImageResource(R.drawable.appwidget_pause);
              break;
          case R.id.ib_bottom_next:
                  setColor(Color.BLUE);
                  MediaUtils.currentPosition++;
                  setColor(Color.RED);
                  startMusicService("开始",MediaUtils.musicBeanList.get(MediaUtils.currentPosition).path);
                  imgBottomPlay.setImageResource(R.drawable.appwidget_pause);
              break;

需要在改变颜色时做一下逻辑处理:

当到最后一个item时点击下一个高亮变为第一个,当位于第一个时,点击上一首,高亮位于最后一个位置。

  private void setColor(int color) {
        if (MediaUtils.currentPosition==MediaUtils.musicBeanList.size()) {
            MediaUtils.currentPosition=0;
        }
        if (MediaUtils.currentPosition==-1) {
            MediaUtils.currentPosition=MediaUtils.musicBeanList.size()-1;
        }
        TextView textView= (TextView) songList.findViewWithTag(MediaUtils.currentPosition);
        if (textView!=null) {
            textView.setTextColor(color);
        }

    }

接下来,需要实现一个更随音乐播放进度的进度条,这就需要实现Service向Activity的通信,可以通过消息机制,让Service发送消息给Activity,将播放信息传递给Activity.

拿着这个Intent传一个信使(Messager).

intentService.putExtra("messenger",new Messenger(handler));

从而Service:

                                Message message=Message.obtain();
                                message.arg1=currentPostion;
                                message.arg2=duration;
                                message.what=Constants.MUSIC_PREPARE;
                                messenger.send(message);

Activity再处理:

    private Handler handler=new Handler(){
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case Constants.MUSIC_PREPARE:
                    int curduration=msg.arg1;
                    int totalduration=msg.arg2;
                    tv_curduration.setText(MediaUtils.duration2Str(curduration));
                    tv_totalduration.setText(MediaUtils.duration2Str(totalduration));
                    sk_duration.setMax(totalduration);
                    sk_duration.setProgress(curduration);
                    break;
            }
        }
    };

在SeekBar中设置监听,当拖动停止时把当前进度传给Service,让音乐就当前位置播放:

   sk_duration.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {

            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
                 sk_duration.setProgress(seekBar.getProgress());
                startMusicService("跳转",seekBar.getProgress());
            }
        });

同时,我们需要注意到一个情况,当启动电话时,音乐应该是停止状态,可以通过AudioManager获得音频焦点,当焦点失去时,音乐也应该停止:

     AudioManager audioManager= (AudioManager) getSystemService(Context.AUDIO_SERVICE);
        audioManager.requestAudioFocus(new AudioManager.OnAudioFocusChangeListener() {
            @Override
            public void onAudioFocusChange(int focusChange) {
                switch (focusChange) {
                    case AudioManager.AUDIOFOCUS_GAIN:
                        mediaPlayer.start();
                        mediaPlayer.setVolume(1.f,2.0f);
                        break;
                    case AudioManager.AUDIOFOCUS_LOSS:
                        if (mediaPlayer.isPlaying())
                            mediaPlayer.stop();
                            mediaPlayer.release();
                            mediaPlayer=null;
                        break;
                    case AudioManager.AUDIOFOCUS_GAIN_TRANSIENT:
                        if (mediaPlayer.isPlaying());
                        mediaPlayer.pause();
                        break;
                }

            }
        },AudioManager.STREAM_MUSIC,AudioManager.AUDIOFOCUS_GAIN);

好了,这样一个简单的音乐播放器就完成了,虽然说代码不是很困难,但是还是有很多知识点,比如Activity中Service中的通信,以及ListView相关,还有程序的逻辑性,所以我把几个重要的点总结了一下。希望这篇博文对你的生活和学习有所帮助,如果有什么疑问可以在下方留言,如果你想要源码,可以私聊我~

转载于:https://www.cnblogs.com/lovelyYakir/p/5815866.html

【源码+文档】基于Android的手机音乐播放器的设计与实现 在本章中,本系统主要采用Retrofit和Rxjava作为Android客户端访问网络的的框架,使用MVP的设计模式,使用Android Studio 开发Android端,Idea作为后台的开发工具,使用JavaEE技术,使用MySQL作为后台数据库,Spring-Boot框架。 阅读详情

相关推荐

Android开发 : 音乐播放器的实现

一、前言: 第一次做安卓的个人项目,还是比较轻松的,将平时学的知识用到点子上就好容易,遇到自己想实现的而且还不会的就上网自己查,或者去官网的安卓开发者手册读老英文,这一块是最耗实践的,我在项目中在添加随机播放,加入歌曲时间,用什么数据结构存储歌曲信息等地方花了很大精力去学习,毕竟网上的东西查到10篇有3篇是符合的,就一篇详细而且有用的,所以遇到自己不会的时候效率还是蛮低的。 二、功能介绍: 音乐播放器可以将手机SD卡中的音乐读取后加入到音乐播放器中,列出列表共听者欣赏,在音...

Aquarius_1的博客 3617

Android程序设计之音乐播放器实现

基于MediaPlayer技术实现在线音乐播放器,播放在线音乐,后端使用SpringBoot将音乐存放在Tomcat服务器。app通过网络请求获取音乐,从而实现在线音乐播放。该项目分为用户端和管理员端。

商城app+新闻app+备忘录记事本app视频教程在某站【浩宇软件开发】 8781

基于android的音乐播放器的设计与开发

根据Android开发平台自身所存在的结构特点,把音乐播放器的设计与开发分为两个部分来进行分析和设计,第一部分是进行窗口的设计,主要是对窗口的属性进行定义以及对关联窗口的处理函数进行定义;而另外的一部分是进行功能的实现,主要是把Android平台给我们提供的资源以及对音乐播放器功能分析最终实现所定义的功能。所以,这使手机开发了具有了很好的自主能动性,工作量不多,周期不长,且能够以较快的速度成型,并且能够一下子到位,同时用户可以自己随意定义手机,从而使来丰富手机的功能,在市场上的竞争力手机能够有一席之地。

安卓精品项目源码 1314

基于 Android Studio 音乐播放器App

基于 Android Studio 实现的简易 音乐播放器App Android初学者开发第一个完整的实例项目应该就属《音乐播放器》了,项目包含SQLlit数据库的使用、listview、Fragment、等。用户进行注册数据使用SQLite存储,用户登录时根据数据库的内容来核对用户名和密码是否正确。主要用于音乐的显示以及点击对应的音乐跳转到对应的音乐播放页面。用于播放音乐,对音乐进行暂停,上一首、下一首功能的实现。

编程乐学的博客 2万+

安卓音乐播放器开发实战教程

在开发安卓音乐播放器时,Android提供的多媒体框架是核心基础设施。这一框架支持各种媒体类型,包括音乐播放器所关注的音频播放。多媒体框架能够访问和控制设备上的多媒体硬件,为应用提供了播放音频和视频、录制音频和视频以及处理音视频数据的能力。音频焦点管理是框架中一个重要的功能,它确保音乐播放器在适当的时机能够播放音乐,在不应该发出声音的时候静音或降低音量,例如来电时。为了提供个性化的用户体验,视图组件的自定义是不可或缺的。

weixin_42103128的博客 1146

Android studio开发的音乐播放器.zip

用Android studio编写的一个小小的音乐的播放器,可以实现对本地音乐的播放,界面还不是特别美观,之后还会更新,之后还会继续更新,有什么问题也欢迎大家交流。

Android开发之音乐播放器

Android开发之音乐播放器

不服输的小乌龟 5908

不经意传输(OT)协议 - Mike Rosulek教授课堂笔记

OT扩展协议-IKNP

qq_43569221的博客 1850

android音乐播放器的开发实例,Android开发实战之简单音乐播放器(示例代码)

最近开始学习音频相关。所以,很想自己做一个音乐播放器,于是,花了一天学习,将播放器的基本功能实现了出来。我觉得学习知识点还是蛮多的,所以写篇博客总结一下关于一个音乐播放器实现的逻辑。希望这篇博文对你的学习和生活有所帮助。效果图:**实现逻辑**在市面上的音乐播放app,即时你关了。那么一样会在后台播放,所以播放的逻辑应该写在Service中。并且能够实现Service和Activity之间进行通信...

weixin_39553705的博客 837

QTableView为例:Qt模型视图委托(MVD)(Model-View-Delegate)

QT中的MVD(模型-视图-委托)模式是一种类似于MVC的设计模式,将数据、界面和交互逻辑分离。模型负责数据管理,视图负责显示界面,而委托则嵌入在视图中处理数据的显示和编辑。QT提供了多种视图组件(如QListView、QTreeView、QTableView)和模型类(如QStandardItemModel、QAbstractItemModel),支持数据的多样化呈现。委托(Delegate)通过定制显示和编辑行为增强了视图的灵活性。该模式适用于各类数据结构展示(列表、表格、树形),能够高效处理数据与界面

菜一头包的博客 1989

使用TinyProxy搭建代理服务器

背景 办公电脑所在网络无法连接外网,机房服务器可以连接外网,通过服务器代理上网; 一、CentOS下TinyProxy安装–搭建代理服务器 TinyProxy是个轻量级简单的HTTP/HTTPS代理程序,GitHub和官网,安装方式这里主要介绍两种 CentOS下yum安装,参考:TinyProxy安装 Docker安装 先安装docker环境yum install docker -y 二、Win10下使用 ...

椰汁菠萝 1万+

一个基于Android开发的简单的音乐播放器

一个基于Android开发的简单的音乐播放器 记得当时老师让我们写因为播放器时,脑子一头雾水,网上杂七杂八的资料也很少有用,因此索性就自己写一篇,希望对有缘人有用。 效果图 首先先上效果图,原本我是拍了个视频的,但是没法上传,因此就只能上个效果图,图中有的功能都已实现。 编写流程 1.因为我是用真机调试的,所以先在手机的根目录下创建一个二级目录,往里面添加mp3文件。 2.使用List链表数组存...

qq_40991992的博客 7157

数字逻辑Fundamentals of Digital Logic with Verilog Design | 3rd Edition Solutins Chapter 6(step by step)

第六章6-1~6-42习题详解,缺少6-39和6-40

weixin_62651190的博客 1468

Android开发---MediaPlayer简单音乐播放器

Android开发—MediaPlayer简单音乐播放器功能介绍 实现一个简单的播放器,类似网易云音乐形式,功能包括:播放、暂停,停止,退出功能; 后台播放功能; 进度条显示播放进度、拖动进度条改变进度功能; 播放时图片旋转,显示当前播放时间功能; 界面样式 功能实现1. MediaPlayer的实现 MediaPlayer常用方法介绍 MediaPlayer的实现包括初始化MediaPlaye

keep studying 3万+

地图自定义编码CSV转换成ini文件

创 建 schema.ini 文件:有时,当您尝试使用 .csv 文件将自定义地理信息导入 Tableau 时,您可能会看到“无法使用.csv,因为它不包含唯一列”错误消息。这是因为您的 .csv 文件可能包含数值数据,例如数值邮政编码。对于新的地理角色,Tableau 将只接受文本字段。但是,您可以创建一个 schema.ini 文件,以指示 Tableau 应将您要导入的数值字段视为文本字段。...

wenyusuran的专栏 1975

RK3588 部署 YOLO26-Pose 人体姿态检测:Windows Docker 环境全流程

YOLO26-Pose 在 RK3588 上的部署流程是 PC 端 ONNX 导出 → RKNN 转换(INT8 量化)→ 板端推理。INT8 量化后 YOLO26s-Pose 约 35ms,YOLO26n-Pose 约 15ms,可以覆盖实时姿态检测的需求。后处理是 Python 实现的常见瓶颈——如果帧率不达标,先用 npy 保存模型输出在 PC 上验证解析逻辑的正确性,确认无误后再迁移到 C++ 实现。

m0_64661770的博客 544

Android Studio如何实现音乐播放器(简单易上手)

我们大家平时长时间打代码的时候肯定会感到疲惫和乏味,这个时候一边播放自己喜欢的音乐,一边继续打代码,心情自然也愉快很多。音乐带给人的听觉享受是无可比拟的,动听的音乐可以愉悦人的身心,让人更加积极地去热爱生活。大家平常应该会用QQ音乐、网易云音乐或者酷狗音乐等音乐APP来听歌,想不想拥有属于自己的音乐播放器。那么接下来就教大家如何用Android Studio自己制作一个音乐播放器APP。

振华OPPO的博客世界 22万+

【软件测试】- 公有云、私有云、混合云简介以及如何在公有云与私有云上分别搭建测试环境

公有云、私有云以及混合云是目前云计算领域的三种主要模式。它们之间的区别主要在于部署方式、数据访问和管理控制的不同。在阿里云或腾讯云上使用 Kubernetes 和 Docker 搭建测试环境可以提供高度的可伸缩性和灵活性。这样的环境非常适合于需要在多种配置和条件下进行测试的复杂应用。通过云服务提供的工具和服务,可以轻松管理和监控整个测试过程。在云服务上搭建测试环境涉及选择合适的云提供商、配置云资源、安装和设置所需软件等步骤。### 1. 选择云服务提供商。

weixin_46453070的博客 2342

关于我的安卓音乐播放器程序该如何使用的问题

本文旨在介绍我写的程序--安卓音乐播放器该如何使用的问题,如果想要了解播放器的源码,请进入我的主页查看相关文章。

cun的博客 6613

SAP-MM-采购过账接口(与WMS集成)-代码

1、判断传入值非空检验; 2、判断过账日期是否允许在当前期间; 3、判断是否为集采订单业务,是否审批完成; 4、判断是否发布标准成本发布(此业务场景与价格控制3+S有关) 5、保存日志表; 6、判断业务公司订单审批状态; 7、创建STO交货单、集采公司订单过账、STO公司间创建交货单、交货单过账(两步法)、过账失败回滚(冲销交货、删除交货单、冲销集采入库)

qq_32198063的博客 421

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Android开发--简单音乐播放器(附源码)

文章目录1.效果图2.功能说明1.登录功能说明2.主界面功能的实现3.音乐播放功能实现 1.效果图 我编写的程序的功能不单单是只有音乐播放,还有几个其他的功能,都是当时在学android的时候编写的。最近突然看到这个程序,觉得不能就这么把它放在自己电脑上的android项目中,因为以后能再看到的机会就更少了,哈哈哈!!。所以我决定写点东西来纪念一下当时编写这个小程序的那段岁月。看完后又稍微改了改,最终我个人觉得就音乐播放和记事本的功能还可以,我这里就只给大家伙看看我的音乐播放器的大致功能,如果有想要源码的小

a_ittle_pan的博客 1万+

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Android简单音乐播放器

话不多说先上效果 前言 写这个音乐播放器实在是迫不得已。因为我们Andoird课程要求写一个音乐播放器。所以就有了此项目。这个项目比较简单,实现了最基本的音乐播放功能,然后界面是仿照着网易云音乐的样式写的想写成一样但是技术不够QWQ。 基本的音乐播放 设置播放音乐文件 Android播放媒体文件大概都是使用MediaPlayer这个类来操作的。 在播放音乐前,必须要给这个MediaPlayer设...

当你在抱怨为什么没有时,请记住,这是你的机会! 5105

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

小项目开发——Android 音乐播放器

Android原生开发音乐播放器

Re.Gin的博客 5836

android音乐播放器实现,Android实现简单音乐播放器(MediaPlayer)

Android实现简单音乐播放器(MediaPlayer),供大家参考,具体内容如下开发工具:Andorid Studio 1.3运行环境:Android 4.4 KitKat工程内容实现一个简单的音乐播放器,要求功能有:播放、暂停功能;进度条显示播放进度功能拖动进度条改变进度功能;后台播放功能;停止功能;退出功能;代码实现导入歌曲到手机SD卡的Music目录中,这里我导入了4首歌曲:仙剑六里面的...

weixin_33508642的博客 4935

kivy制作安卓APP--简单音乐播放器

python kivy库制作的安卓简单音乐播放器,是一个简单小demo,本来用来年会节目控制音乐流程的,分享出来给大家参考。

悟叭鸽 1万+
上一篇: Android开发实战之补间动画和属性动画
下一篇: Android开发实战之拥有Material Design风格的折叠布局
diebing0439
博客等级 码龄11年 0粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值