android 小型音乐播放器(实现播放、下一首、上一首、自动播放、随机播放按钮、当前播放歌曲界面)
该文章主要针对 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 小型音乐播放器(实现播放、下一首、上一首、自动播放、随机播放按钮、当前播放歌曲界面)相关推荐
- Python—实现本地音乐播放器(添加/播放/暂停/下一首/上一首/音量/打开超链接)
Python-实现本地音乐播放器(添加/播放/暂停/下一首/上一首/音量/打开超链接) 1.样例 2.分析 1.播放器界面 2.功能 2.1播放器界面 button:添加/播放/暂停/下一首/上一首 ...
- sony android mp3播放器,入手一年,详细聊聊 索尼ZX505、艾利和SR15 两款安卓播放器的使用体验...
入手一年,详细聊聊 索尼ZX505.艾利和SR15 两款安卓播放器的使用体验 2020-12-04 16:00:21 113点赞 179收藏 28评论 创作立场声明:本文所测商品为自费购入.如参加张大 ...
- 鸿蒙系统怎样去掉下拉音乐播放器,windows10系统下怎样取消音乐播放器默认播放器...
一位用户反馈自己的windows10系统电脑中,默认音乐播放器是百度音乐,因为自己并不喜欢用百度音乐来播放歌曲,就想将其取消掉.这该如何操作呢?接下来,就随小编看看windows10系统下取消音乐播放 ...
- html mp3默认播放器,Win7系统下设置默认音乐播放器的两种方法
可能很多新手用户不知道Win7系统下怎么设置默认音乐播放器?我们习惯将某一程序设置为默认打开方式,音乐播放器也可以这样子的.一些用户想把酷狗播放器.或者qq音乐设置为默认音乐播放器,只要打开音乐文件, ...
- android 以音频播放器为例实现通知栏显示通知,并实现切歌、暂停、播放,并实现加载网络图片,并实现关闭第三方APP音频
首先先给大家看下效果 接下来我们看下具体如何实施 1.首先我们创建一个音频的单例对象,这样能保证每次在播放的的音频是唯一的(类名如:MediaPlayerUtil.java) package xxx; ...
- JQuery播放器代理--IE下支持wma格式
Jplayer代理类 1/**//** 2* 3* Media 代理 4* @param Object p_play:播放器 5*/ 6var media_player_pro ...
- 播放器SkeyeWebPlayer多分屏(九宫格)、拖动(拖入分屏播放)、双击分屏放大缩小等功能的使用
免费视频直播.点播H5播放器SkeyeWebPlayer多屏(九宫格).双击分屏放大缩小.拖动(拖入分屏播放)等功能的使用. 1.SkeyeWebPlayer多屏(九宫格)布局切换,一般采用1.4.9 ...
- vue 播放器视频插件 之 vue-video-player 铺满全屏自动播放
1.安装video.js npm install video.js 2.在main.js中引入 import Video from 'video.js' import 'video.js/dist/v ...
- 优酷在线播放器 html5,GitHub - esterTion/Youku-HTML5-Player: 一个适配优酷的简单易用的HTML5播放器...
本扩展将不再维护 目前的可用性状态(19/03/16): firefox 65 基本正常使用 chrome 73 已确认无法使用 This extension is no longer maintai ...
最新文章
- 在VMware Workstation上安装Ubuntu 16.04 Server操作系统
- 教你用一行Python代码实现并行(附代码)
- SQL模糊查询 LIKE
- Provided path doesn't exist. pylama Please fix pylama path or install latest version(UBuntu版本下的情况)
- Csharp 打印Word文件默認打印機或選擇打印機設置代碼
- 如何解决EDM邮件营销中的图片难题
- CAT 3.0 开源发布,支持多语言客户端及多项性能提升
- MyBatisPlus_查询篇_入门试炼_01
- 计算机辅助设计b实验目的,上海电力学院电路计算机辅助设计1--含有受控源电路辅助分析...
- 发红包案例(RedPacketFrame简介)
- MiniDao_1.6-SNAPSHOT 版本发布,轻量级Java持久化框架
- 在博客中插入emoji表情
- share——Alpha版(内部测试版)发布
- 《WebGL编程指南》学习笔记——4.绘制一个点
- 转:在windows中将tree命令加入git-bash中
- android x86 5.1 .iso,凤凰OS5.1通用ISO1.5.0
- 为什么全局钩子必须写到dll里面?
- 什么是驻点和拐点_临界点、驻点、拐点的定义是什么?
- python统计套利_【独家发布】期货市场内外盘低频统计套利基于Python
- 木纹OCA一体显示屏
热门文章
- 仙剑类游戏系统分析第二篇
- 5年积淀,Mapmost打造连接无限的数字孪生平台
- 图像变换——向前映射和向后映射
- c语言程序设计实验报告金陵科技学院,金陵科技学院C语言程序设计 - 图文
- ios微信小程序canvas动态给宽高的bug
- 设置linearlayout最大高度_标识不得超过招牌总长2/3,这个城市出台招牌设置标准...
- Vue调试工具的安装
- Bluetooth--蓝牙开发扫描设备,及蓝牙设备类型
- 微模块机房效果图制作|场景创建过程详细步骤
- 面试官:作为架构师,请你谈谈Saas 应用如何搭建?