该文章主要针对 android 的音乐播放器软件进行简单的功能添加:播放、断点播放、停止、上一曲、下一曲、随机播放、显示当前播放歌曲(后续会为当前显示的播放添加动画);
软件开发流程:
1、先向内存卡导入音乐文件(文件的导入方法可以自己查找,文章类较多);
2、获取内存卡中的音乐文件;
3、将音乐文件存入集合中,便于调用,并将需要播放的文件显示在 ListView 中(点击 ListView 中的文件也可播放);
4、运用 MediaPlayer的方法实现播放、暂停、断点播放、连续播放文件;
5、通过调用写好的方法实现手动的下一曲、上一曲、随机播放、显示当前播放的音乐名;

<pre name="code" class="java">package com.wangban.yzbbanban.v10;import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.media.MediaPlayer;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.RadioButton;
import android.widget.TextView;
import android.widget.Toast;import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Random;public class MainActivity extends AppCompatActivity {//声明各个组件,集合private List<Music> musics;private ListView lvMusicList;private ImageButton ibtnPlayOrPause;private ImageButton ibtnNext;private ImageButton ibtnprevious;private ImageButton ibtnGetPosition;private RadioButton rbtnPlayRandown;private RadioButton rbtnPlaySequence;private RadioButton rbtnPlaySingle;private MusicAdapter adapter;private TextView tvTip;private Context context;//声明 MediaPlaprivate MediaPlayer player;// 记录的暂停时的播放位置private int pausePosition;// 当前播放的歌曲的索引private int currentMusicIndex;@Override//主函数protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//设置布局为 activity_mainsetContentView(R.layout.activity_main);//初始化控件initView();//获取歌曲列表loadData();//列出列表initListView();//配置监听器setListener();//重置(设置 MediaPlayer必须步骤)player.reset();}//设置各种监听器private void setListener() {InnerOnclickListener listener = new InnerOnclickListener();//暂停播放ibtnPlayOrPause.setOnClickListener(listener);//下一首ibtnNext.setOnClickListener(listener);//上一首ibtnprevious.setOnClickListener(listener);//获取当前播放音乐ibtnGetPosition.setOnClickListener(listener);InnerItemOnCLickListener listener2 = new InnerItemOnCLickListener();//给 ListView 添加点击(点击音乐即可播放)lvMusicList.setOnItemClickListener(listener2);// MediaPlay 自动播放(因为就一条,无需加变量)player.setOnCompletionListener(new InnerOnCompletionListener());}//播放ListView 点击的音乐private class InnerItemOnCLickListener implements AdapterView.OnItemClickListener {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {//获取点击的列表的中音乐的位置,赋值给当前播放音乐currentMusicIndex = position;//令暂停的进度为0(即为从头播放)pausePosition = 0;//播放play();}}//主要按钮的播放监听器private class InnerOnclickListener implements View.OnClickListener {@Overridepublic void onClick(View v) {switch (v.getId()) {// 播放/暂停按钮即执行的方法case R.id.ibtn_playorpause://当音乐在播放时if (player.isPlaying()) {//暂停pause();} else {//不在播放,则播放play();}break;//下一首按钮即执行方法case R.id.ibtn_next:next();break;//上一首按钮即执行方法case R.id.ibtn_previous:previous();break;//获取当前播放音乐即执行方法case R.id.ibtn_getposition:getPosition();break;}}}//单曲循环private void single() {currentMusicIndex++;currentMusicIndex--;pausePosition = 0;play();}//随机播放方法private void randown() {currentMusicIndex = new Random().nextInt(musics.size());Toast.makeText(MainActivity.this, "随机", Toast.LENGTH_SHORT).show();pausePosition = 0;play();}//列表循环private void sequence() {currentMusicIndex++;if (currentMusicIndex >= musics.size()) {currentMusicIndex = 0;}pausePosition = 0;play();}//获取当前播放的音乐文件的名字,必先是在另一个布局中;private void getPosition() {//声明一个意图,用来切换布局和传递数据Intent intent = new Intent();//定义要传递的数据String extra = musics.get(currentMusicIndex).getName() + "";//传递数据intent.putExtra("currentMusic", extra);//切换布局intent.setClass(MainActivity.this, Main2Activity.class);//执行此系列活动MainActivity.this.startActivity(intent);}//暂停private void pause() {//直接调用MediaPlay 中的暂停方法player.pause();//获取暂停的位置(音乐进度)pausePosition = player.getCurrentPosition();//切换为播放的按钮(按钮为android系统自带的按钮,可直接用)ibtnPlayOrPause.setImageResource(android.R.drawable.ic_media_play);}//播放上一曲private void previous() {//判断是否为第一首歌曲,若为第一首歌曲,则播放最后一首if (rbtnPlaySingle.isChecked()) {single();} else {//当前音乐播放位置--(上一曲)currentMusicIndex--;if (currentMusicIndex <= 0) {Toast.makeText(MainActivity.this, "已经是第一首了", Toast.LENGTH_SHORT).show();return;} else {//音乐进度置为0pausePosition = 0;//播放play();}}}//播放下一曲(与上一曲类似)private void next() {if (rbtnPlayRandown.isChecked()) {randown();} else if (rbtnPlaySingle.isChecked()) {single();} else if (rbtnPlaySequence.isChecked()) {sequence();} else {currentMusicIndex++;if (currentMusicIndex >= musics.size()) {Toast.makeText(MainActivity.this, "已经是最后一首了", Toast.LENGTH_SHORT).show();return;} else {pausePosition = 0;play();}}}//播放音乐private void play() {//重置player.reset();try {//设置音乐文件来源player.setDataSource(musics.get(currentMusicIndex).getPath());//准备(缓冲文件)player.prepare();//将进度设置到“音乐进度”player.seekTo(pausePosition);//获取音乐进度player.getCurrentPosition();//播放开始player.start();//用当前界面的 TextView显示当前播放的音乐tvTip.setText(musics.get(currentMusicIndex).getName() + "");//设置按钮图片为暂停图标ibtnPlayOrPause.setImageResource(android.R.drawable.ic_media_pause);} catch (IOException e) {e.printStackTrace();}}private final class InnerOnCompletionListener implements MediaPlayer.OnCompletionListener {@Overridepublic void onCompletion(MediaPlayer mp) {next();}}private void initListView() {adapter = new MusicAdapter(getApplicationContext(), musics);lvMusicList.setAdapter(adapter);}private void loadData() {//获取音乐文件的内容Cursor cursor = context.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null,MediaStore.Audio.Media.DEFAULT_SORT_ORDER);// 获取歌曲列表musics = new ArrayList<>();// 1. 检查sdcard是否可用if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {// 2. 获取sdcard下Music文件夹的File对象File musicDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC);// 3. 检查Music文件夹是否存在if (musicDir.exists()) {// 4. 通过File类的listFiles()方法,获取Music文件夹下所有子级File对象File[] files = musicDir.listFiles();// 5. 检查获取到的File列表是否有效(数组是否为null,或数组长度是否为0)if (files != null && files.length > 0) {// 6. 遍历File列表for (int i = 0; i < files.length; i++) {//下一个文件cursor.moveToNext();//获取艺术家内容String artist = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST));// 6.1. 通过File类的isFile()方法,检查是否是文件if (files[i].isFile()) {// 6.2. 通过File类的getName()方法获取文件名,// 结合String类的endsWith()方法,检查是否是mp3文件String fileName = files[i].getName();if (fileName.toUpperCase(Locale.CHINA).endsWith(".MP3")) {// 6.3. 创建Music对象,并封装必要的属性Music music = new Music();music.setName(fileName.substring(0, fileName.length() - 4));music.setArtist(artist);music.setPath(files[i].getAbsolutePath());// 6.4. 将新创建的Music对象添加到集合中musics.add(music);}}}}}}}//初始化控件级布局文件等private void initView() {player = new MediaPlayer();lvMusicList = (ListView) findViewById(R.id.lv_musiclist);ibtnPlayOrPause = (ImageButton) findViewById(R.id.ibtn_playorpause);ibtnNext = (ImageButton) findViewById(R.id.ibtn_next);ibtnprevious = (ImageButton) findViewById(R.id.ibtn_previous);ibtnGetPosition = (ImageButton) findViewById(R.id.ibtn_getposition);rbtnPlayRandown = (RadioButton) findViewById(R.id.rbtn_playrandowm);rbtnPlaySequence = (RadioButton) findViewById(R.id.rbtn_playsequence);rbtnPlaySingle = (RadioButton) findViewById(R.id.rbtn_playsingle);tvTip = (TextView) findViewById(R.id.tv_musictip);context = MainActivity.this;}
}

<pre name="code" class="java">package com.wangban.yzbbanban.v10;import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;//实现显示当前播放的音乐
public class Main2Activity extends AppCompatActivity {private TextView tvCurrentMusic;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//设置当前布局为activity_main2setContentView(R.layout.activity_main2);//声明 TextView 控件tvCurrentMusic = (TextView) findViewById(R.id.tv_current_music);//获取主程序传出的“当前播放文件名字”的值Intent intent= this.getIntent();String stringValue=intent.getStringExtra("currentMusic");tvCurrentMusic.setText(stringValue);}
}
package com.wangban.yzbbanban.v10;import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;import java.util.List;//集合:显示音乐文件的名称、路径,显示在 ListView 中
public class MusicAdapter extends BaseAdapter{private Context context;private List<Music> musics;public MusicAdapter(Context context, List<Music> musics) {this.context = context;this.musics = musics;}@Overridepublic int getCount() {return musics.size();}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {//获取当个文件的位置Music music=musics.get(position);//将文件布置在模板中if (convertView==null){LayoutInflater inflater=LayoutInflater.from(context);convertView=inflater.inflate(R.layout.music_item,null);}//初始化控件TextView tvName= (TextView) convertView.findViewById(R.id.tv_music_title);TextView tvArtist= (TextView) convertView.findViewById(R.id.tv_music_path);//TextView tvPath= (TextView) convertView.findViewById(R.id.tv_music_path);//显示文件内容//显示歌曲名tvName.setText(music.getName());//tvPath.setText(music.getPath());//显示艺术家名字tvArtist.setText(music.getArtist());return convertView;}@Overridepublic Object getItem(int position) {return null;}@Overridepublic long getItemId(int position) {return 0;}
}
package com.wangban.yzbbanban.v10;//Music 类型文件,用于集合musics,声明一个类型,获取集合中的名字、路径
public class Music {//name 类型private String name;//path 类型private String path;//获取艺术家private String artist;public String getArtist() {return artist;}public void setArtist(String artist) {this.artist = artist;}public String getPath() {return path;}public void setPath(String path) {this.path = path;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Music{" +"name='" + name + '\'' +", path='" + path + '\'' +'}';}
}
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="当前播放的歌曲:"android:textSize="20sp"android:background="@color/colorPrimary"/><ImageViewandroid:id="@+id/iv_current_player"android:layout_width="200dp"android:layout_height="200dp"android:layout_centerInParent="true"android:src="@drawable/default_play_activity_bg1" /><TextViewandroid:id="@+id/tv_current_music"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_margin="50dp"android:layout_below="@id/iv_current_player"android:text="" /></RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@drawable/ic_launcher_app"android:padding="5dp"tools:context="com.wangban.yzbbanban.v10.MainActivity"><RelativeLayoutandroid:id="@+id/rl_music"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_alignParentBottom="true"><ImageButtonandroid:id="@+id/ibtn_previous"android:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@android:drawable/ic_media_previous" /><ImageButtonandroid:id="@+id/ibtn_playorpause"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_toRightOf="@id/ibtn_previous"android:src="@android:drawable/ic_media_play" /><ImageButtonandroid:id="@+id/ibtn_next"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_toRightOf="@id/ibtn_playorpause"android:src="@android:drawable/ic_media_next" /><ImageButtonandroid:id="@+id/ibtn_getposition"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentRight="true"android:src="@android:drawable/ic_menu_mylocation"/></RelativeLayout><RelativeLayoutandroid:id="@+id/rl_playstate"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginLeft="8dp"android:layout_above="@id/rl_music"android:orientation="horizontal"><RadioGroupandroid:id="@+id/rg_playstate"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_centerInParent="true"android:orientation="horizontal"><RadioButtonandroid:id="@+id/rbtn_playsequence"android:layout_width="50dp"android:layout_height="50dp"android:layout_centerInParent="true"android:background="@drawable/selector_sequence"android:button="@null" /><RadioButtonandroid:id="@+id/rbtn_playrandowm"android:layout_width="50dp"android:layout_height="50dp"android:layout_toLeftOf="@id/rbtn_playsequence"android:background="@drawable/selector_randowm"android:button="@null" /><RadioButtonandroid:id="@+id/rbtn_playsingle"android:layout_width="50dp"android:layout_height="50dp"android:layout_toRightOf="@id/rbtn_playsequence"android:background="@drawable/selector_single"android:button="@null" /></RadioGroup></RelativeLayout><TextViewandroid:id="@+id/tv_musictip"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_above="@id/rl_playstate"android:padding="10dp"android:text="您播放的歌为"android:textColor="#ffdfce"android:textSize="17sp" /><ListViewandroid:id="@+id/lv_musiclist"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_above="@id/tv_musictip"/></RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:padding="5dp"><ImageViewandroid:id="@+id/iv_artist"android:layout_width="40dp"android:layout_height="40dp"android:background="@drawable/ic_luancher_app"/><TextViewandroid:id="@+id/tv_music_title"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginLeft="10dp"android:layout_toRightOf="@id/iv_artist"android:text="歌名"android:textColor="#eeeeee"android:textSize="16sp" /><TextViewandroid:id="@+id/tv_music_path"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_below="@id/tv_music_title"android:layout_marginLeft="10dp"android:layout_toRightOf="@id/iv_artist"android:text="路径"android:textColor="#999999"android:textSize="14sp" /></RelativeLayout>

//随机图标的选择

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:state_checked="true" android:drawable="@drawable/play_list_mode_shuffle"></item><item android:drawable="@drawable/playmode_repeate_random_hover"></item>
</selector>

//顺序播放的图标的选择
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:state_checked="true" android:drawable="@drawable/play_list_mode_sequent"></item><item android:drawable="@drawable/playmode_repeate_all_hover"></item>
</selector>

//单曲循环的图标的选择
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:state_checked="true" android:drawable="@drawable/play_list_mode_repeat_one"></item><item android:drawable="@drawable/playmode_repeate_single_hover"></item>
</selector>

android 小型音乐播放器(实现播放、下一首、上一首、自动播放、随机播放按钮、当前播放歌曲界面)相关推荐

  1. Python—实现本地音乐播放器(添加/播放/暂停/下一首/上一首/音量/打开超链接)

    Python-实现本地音乐播放器(添加/播放/暂停/下一首/上一首/音量/打开超链接) 1.样例 2.分析 1.播放器界面 2.功能 2.1播放器界面 button:添加/播放/暂停/下一首/上一首 ...

  2. sony android mp3播放器,入手一年,详细聊聊 索尼ZX505、艾利和SR15 两款安卓播放器的使用体验...

    入手一年,详细聊聊 索尼ZX505.艾利和SR15 两款安卓播放器的使用体验 2020-12-04 16:00:21 113点赞 179收藏 28评论 创作立场声明:本文所测商品为自费购入.如参加张大 ...

  3. 鸿蒙系统怎样去掉下拉音乐播放器,windows10系统下怎样取消音乐播放器默认播放器...

    一位用户反馈自己的windows10系统电脑中,默认音乐播放器是百度音乐,因为自己并不喜欢用百度音乐来播放歌曲,就想将其取消掉.这该如何操作呢?接下来,就随小编看看windows10系统下取消音乐播放 ...

  4. html mp3默认播放器,Win7系统下设置默认音乐播放器的两种方法

    可能很多新手用户不知道Win7系统下怎么设置默认音乐播放器?我们习惯将某一程序设置为默认打开方式,音乐播放器也可以这样子的.一些用户想把酷狗播放器.或者qq音乐设置为默认音乐播放器,只要打开音乐文件, ...

  5. android 以音频播放器为例实现通知栏显示通知,并实现切歌、暂停、播放,并实现加载网络图片,并实现关闭第三方APP音频

    首先先给大家看下效果 接下来我们看下具体如何实施 1.首先我们创建一个音频的单例对象,这样能保证每次在播放的的音频是唯一的(类名如:MediaPlayerUtil.java) package xxx; ...

  6. JQuery播放器代理--IE下支持wma格式

    Jplayer代理类   1/**//**   2*   3* Media 代理   4* @param Object p_play:播放器   5*/   6var media_player_pro ...

  7. 播放器SkeyeWebPlayer多分屏(九宫格)、拖动(拖入分屏播放)、双击分屏放大缩小等功能的使用

    免费视频直播.点播H5播放器SkeyeWebPlayer多屏(九宫格).双击分屏放大缩小.拖动(拖入分屏播放)等功能的使用. 1.SkeyeWebPlayer多屏(九宫格)布局切换,一般采用1.4.9 ...

  8. vue 播放器视频插件 之 vue-video-player 铺满全屏自动播放

    1.安装video.js npm install video.js 2.在main.js中引入 import Video from 'video.js' import 'video.js/dist/v ...

  9. 优酷在线播放器 html5,GitHub - esterTion/Youku-HTML5-Player: 一个适配优酷的简单易用的HTML5播放器...

    本扩展将不再维护 目前的可用性状态(19/03/16): firefox 65 基本正常使用 chrome 73 已确认无法使用 This extension is no longer maintai ...

最新文章

  1. 在VMware Workstation上安装Ubuntu 16.04 Server操作系统
  2. 教你用一行Python代码实现并行(附代码)
  3. SQL模糊查询 LIKE
  4. Provided path doesn't exist. pylama Please fix pylama path or install latest version(UBuntu版本下的情况)
  5. Csharp 打印Word文件默認打印機或選擇打印機設置代碼
  6. 如何解决EDM邮件营销中的图片难题
  7. CAT 3.0 开源发布,支持多语言客户端及多项性能提升
  8. MyBatisPlus_查询篇_入门试炼_01
  9. 计算机辅助设计b实验目的,上海电力学院电路计算机辅助设计1--含有受控源电路辅助分析...
  10. 发红包案例(RedPacketFrame简介)
  11. MiniDao_1.6-SNAPSHOT 版本发布,轻量级Java持久化框架
  12. 在博客中插入emoji表情
  13. share——Alpha版(内部测试版)发布
  14. 《WebGL编程指南》学习笔记——4.绘制一个点
  15. 转:在windows中将tree命令加入git-bash中
  16. android x86 5.1 .iso,凤凰OS5.1通用ISO1.5.0
  17. 为什么全局钩子必须写到dll里面?
  18. 什么是驻点和拐点_临界点、驻点、拐点的定义是什么?
  19. python统计套利_【独家发布】期货市场内外盘低频统计套利基于Python
  20. 木纹OCA一体显示屏

热门文章

  1. 仙剑类游戏系统分析第二篇
  2. 5年积淀,Mapmost打造连接无限的数字孪生平台
  3. 图像变换——向前映射和向后映射
  4. c语言程序设计实验报告金陵科技学院,金陵科技学院C语言程序设计 - 图文
  5. ios微信小程序canvas动态给宽高的bug
  6. 设置linearlayout最大高度_标识不得超过招牌总长2/3,这个城市出台招牌设置标准...
  7. Vue调试工具的安装
  8. Bluetooth--蓝牙开发扫描设备,及蓝牙设备类型
  9. 微模块机房效果图制作|场景创建过程详细步骤
  10. 面试官:作为架构师,请你谈谈Saas 应用如何搭建?