Android本地音乐播放器的制作

article/2025/10/23 22:04:40

如何制作android本地的音乐播放器呢?步骤通常是如下:

1.在清单文件AndroidMainFest.xml文件当中添加权限。

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
2.需要找到当前module的build.gradle文件当中targetSdkVersion对应的版本号改为22.(此处与6.0的动态申请权限相关,可以在代码当中申请,此处就使用简单的一次申请方式)

3.绘制布局的内容:需要绘制的布局分为两个部分:1.activity对应的布局    2.listview的每一个item对应的布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@mipmap/bg"><ListViewandroid:id="@+id/local_music_lv"android:layout_width="match_parent"android:layout_height="match_parent"android:divider="#bbb"android:dividerHeight="1dp"></ListView><RelativeLayoutandroid:background="#eee"android:layout_width="match_parent"android:layout_height="80dp"android:focusableInTouchMode="true"android:layout_alignParentBottom="true"><ImageViewandroid:id="@+id/local_music_iv"android:layout_width="60dp"android:layout_height="60dp"android:layout_centerVertical="true"android:layout_marginLeft="20dp"android:src="@mipmap/music_icon"/><TextViewandroid:id="@+id/local_music_song"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="歌名"android:singleLine="true"android:ellipsize="end"android:textSize="16sp"android:textStyle="bold"android:layout_toRightOf="@+id/local_music_iv"android:layout_marginTop="10dp"android:layout_marginLeft="10dp"/><TextViewandroid:id="@+id/local_music_singer"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="周杰伦"android:textSize="12sp"android:layout_toRightOf="@+id/local_music_iv"android:layout_alignLeft="@+id/local_music_song"android:layout_below="@+id/local_music_song"android:layout_marginTop="5dp"/><ImageViewandroid:id="@+id/local_music_last"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignTop="@+id/local_music_singer"android:layout_centerHorizontal="true"android:onClick="onClick"app:srcCompat="@mipmap/last" /><ImageViewandroid:id="@+id/local_music_next"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentEnd="true"android:layout_alignParentRight="true"android:layout_alignTop="@+id/local_music_singer"android:layout_marginEnd="30dp"android:layout_marginRight="30dp"android:onClick="onClick"app:srcCompat="@mipmap/next" /><ImageViewandroid:id="@+id/local_music_play"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignTop="@+id/local_music_singer"android:layout_marginEnd="40dp"android:layout_marginRight="40dp"android:onClick="onClick"android:layout_toLeftOf="@+id/local_music_next"android:layout_toStartOf="@+id/local_music_next"app:srcCompat="@mipmap/play" /></RelativeLayout>
</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="wrap_content"android:orientation="vertical"android:padding="10dp"><TextViewandroid:id="@+id/item_music_id"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="1"android:textSize="24sp"android:textStyle="bold"android:layout_centerVertical="true"/><TextViewandroid:id="@+id/item_music_sing"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="玫瑰花的葬礼"android:textSize="18sp"android:textStyle="bold"android:singleLine="true"android:ellipsize="end"android:layout_marginLeft="20dp"android:layout_toRightOf="@+id/item_music_id"/><TextViewandroid:id="@+id/item_music_singer"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="许嵩"android:textSize="14sp"android:textColor="#888"android:layout_marginTop="10dp"android:layout_alignLeft="@+id/item_music_sing"android:layout_below="@+id/item_music_sing"/><TextViewandroid:id="@+id/line"android:layout_width="2dp"android:layout_height="20dp"android:background="#ccc"android:layout_toRightOf="@+id/item_music_singer"android:layout_alignTop="@+id/item_music_singer"android:layout_marginLeft="10dp"android:layout_marginRight="10dp"/><TextViewandroid:id="@+id/item_music_album"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="专辑名称"android:layout_marginTop="10dp"android:textSize="14sp"android:textColor="#888"android:ellipsize="end"android:singleLine="true"android:layout_toRightOf="@+id/line"android:layout_below="@+id/item_music_sing"/><TextViewandroid:id="@+id/item_music_time"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="14sp"android:layout_below="@+id/item_music_singer"android:text="4:30"android:layout_alignParentRight="true"/></RelativeLayout>

4.开始写java代码,首先需要写一个保存本地的音乐信息的类。

package com.animee.day09.demo01;
public class MusicInfo {private String id;private String singName;private String singer;private String alumb;private String time;private String path;public String getPath() {return path;}public void setPath(String path) {this.path = path;}public MusicInfo(String id, String singName, String singer, String alumb, String time, String path) {this.id = id;this.singName = singName;this.singer = singer;this.alumb = alumb;this.time = time;this.path = path;}@Overridepublic String toString() {return "MusicInfo{" +"id='" + id + '\'' +", singName='" + singName + '\'' +", singer='" + singer + '\'' +", alumb='" + alumb + '\'' +", time='" + time + '\'' +'}';}public MusicInfo() {}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getSingName() {return singName;}public void setSingName(String singName) {this.singName = singName;}public String getSinger() {return singer;}public void setSinger(String singer) {this.singer = singer;}public String getAlumb() {return alumb;}public void setAlumb(String alumb) {this.alumb = alumb;}public String getTime() {return time;}public void setTime(String time) {this.time = time;}public MusicInfo(String id, String singName, String singer, String alumb, String time) {this.id = id;this.singName = singName;this.singer = singer;this.alumb = alumb;this.time = time;}
}
然后开始写activity当中的逻辑代码:

public class LocalMusicActivity extends AppCompatActivity {private ListView lv;private List<MusicInfo>mDatas = new ArrayList<>();private LocalMusicAdapter adapter;private TextView singNameTv;private TextView singerTv;private MediaPlayer mediaPlayer;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_local_music);
//lv = (ListView) findViewById(R.id.local_music_lv);singNameTv = (TextView) findViewById(R.id.local_music_song);singerTv = (TextView) findViewById(R.id.local_music_singer);
//        设置数据源
//        设置适配器adapter = new LocalMusicAdapter(this,mDatas);lv.setAdapter(adapter);
//        加载本地音乐loadLocalData();
//      初始化媒体播放器mediaPlayer = new MediaPlayer();
//        设置点击事件lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {MusicInfo info = mDatas.get(position);singerTv.setText(info.getSinger());singNameTv.setText(info.getSingName());
//                因为有可能其他音乐正在被播放,所以要先停止在播放stopMusic();
//                播放音乐mediaPlayer.reset();try {mediaPlayer.setDataSource(info.getPath());playMusic();} catch (IOException e) {e.printStackTrace();}}});}private void loadLocalData() {
//        1.获得ContentResolver对象ContentResolver resolver = getContentResolver();
//        2.获得Uri地址Uri musicUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
//        3.查找地址中的内容Cursor cursor = resolver.query(musicUri, null, null, null, null);
//        4.遍历Cursor信息int id= 0;while (cursor.moveToNext()) {String title = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE));  //不带后缀的歌曲名String display_name = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DISPLAY_NAME)); //带后缀Log.i("xiaozhi", "loadLocalData: title==="+title+",display===="+display_name);String singer = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST));  //歌手
//            路劲String path = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA));String album = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM));long duration = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.DURATION));SimpleDateFormat sdf = new SimpleDateFormat("mm:ss");String time = sdf.format(new Date(duration));id++;String idStr = id+"";MusicInfo info = new MusicInfo(idStr,title,singer,album,time,path);mDatas.add(info);}adapter.notifyDataSetChanged();}/*** 播放音乐* */public void playMusic(){if (mediaPlayer!=null&&!mediaPlayer.isPlaying()) {try {mediaPlayer.prepare();  //准备播放,因为sd卡当中的音乐,所以不写异步准备mediaPlayer.start();} catch (IOException e) {e.printStackTrace();}}}/*** 停止音乐* */public void stopMusic(){if (mediaPlayer!=null&&mediaPlayer.isPlaying()) {mediaPlayer.pause();mediaPlayer.seekTo(0);mediaPlayer.stop();}}@Overrideprotected void onDestroy() {super.onDestroy();stopMusic();}
}
使用列表当中显示的是音乐播放器的内容,所以通过适配器添加数据,以下为适配器的代码:
package com.animee.day09.demo01;
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 com.animee.day09.R;
import java.util.List;
public class LocalMusicAdapter extends BaseAdapter{private Context context;private List<MusicInfo>mDatas;public LocalMusicAdapter(Context context, List<MusicInfo> mDatas) {this.context = context;this.mDatas = mDatas;}@Overridepublic int getCount() {return mDatas.size();}@Overridepublic Object getItem(int position) {return mDatas.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder = null;if (convertView==null) {convertView = LayoutInflater.from(context).inflate(R.layout.item_local_music,null);holder = new ViewHolder(convertView);convertView.setTag(holder);}else{holder = (ViewHolder) convertView.getTag();}MusicInfo musicInfo = mDatas.get(position);holder.idTv.setText(musicInfo.getId());holder.titleTv.setText(musicInfo.getSingName());holder.alubmTv.setText(musicInfo.getAlumb());holder.singerTv.setText(musicInfo.getSinger());holder.timeTv.setText(musicInfo.getTime());return convertView;}class ViewHolder{TextView idTv,titleTv,singerTv,alubmTv,timeTv;public ViewHolder(View itemView){idTv = (TextView) itemView.findViewById(R.id.item_music_id);titleTv = (TextView) itemView.findViewById(R.id.item_music_sing);singerTv = (TextView) itemView.findViewById(R.id.item_music_singer);alubmTv = (TextView) itemView.findViewById(R.id.item_music_album);timeTv = (TextView) itemView.findViewById(R.id.item_music_time);}}
}

然后简单的音乐播放器就完成了,但是只能够显示和播放,在下一篇博客中,添加播放,暂停,以及上一曲和下一曲的功能。

效果图如下:效果图
 
 




http://chatgpt.dhexx.cn/article/FeQAruvR.shtml

相关文章

Android 编程案例-本地音乐播放器源码及使用注意事项

说一下代码在用的时候注意事项以及在运行的时候可能遇到的问题&#xff1a; 首先代码可以在创建相应文件后直接复制&#xff0c;这个案例用到了RecyclerView&#xff0c;所以需要先添加依赖。添加下面两个&#xff1a; implementation ‘com.android.support:recyclerview-v7…

Android开发之本地音乐播放器(二)

此次音乐播放器是针对上一个&#xff1a;https://blog.csdn.net/qq_43433255/article/details/88084420 开发出来的一个功能增强型&#xff0c;基本实现功能为&#xff1a; 通过列表管理SD中的音乐文件。通过seekbar可以显示一首音乐的播放进度。通过seekbar实现音乐播放的进度…

Android音乐播放器源码

转载自&#xff1a;https://blog.csdn.net/xch_yang/article/details/103916201 android开发音乐播放器&#xff0c;能够很好的应用Android基础知识&#xff0c;是个不错的开发选择&#xff0c;部分界面如下 这个项目很好的结合了Android的四大组件知识。其中音乐来源于手机本…

本地音乐播放器+android8.1,APlayer v1.5.6.8-15681 安卓本地音乐播放器 | 智享阁

应用简介 APlayer是一款安卓本地音乐播放器&#xff0c;遵循 Material Design 设计&#xff0c;UI清新简洁、操作简单、功能齐全。 应用特点 首页Tab可配置&#xff0c;最多支持五个,包括歌曲、艺术家、专辑、文件夹、播放列表 专辑、艺术家封面自动补全 支持显示本地和在线歌词…

大作业---Android本地音乐播放器开发知识点19145120

步骤 系列文章前言1. 简述程序、进程、线程的区别和联系。&#xff08;10分&#xff09;2. 什么是UI线程&#xff1f;&#xff1f;什么是工作线程&#xff1f;&#xff08;10分&#xff09;3. 如何定义1个结构良好可控的工作线程&#xff08;源代码说明&#xff09;&#xff1f…

Android入门之本地音乐播放器

功能简介 读取模拟器中音乐文件&#xff1b;列表展示&#xff0c;获取歌曲详细信息&#xff1a;歌名、歌手名、专辑名、专辑封面、播放时间等&#xff1b;基本功能&#xff1a;上下切歌&#xff0c;播放暂停、进度条显示与点击跳转。成品效果图&#xff1a; Mediaplayer基本…

大学生安卓期末设计之本地音乐播放器

作为一个热爱设计交互性产品的男大学生&#xff0c;我真的不太爱听课&#xff0c;所以很多时候&#xff0c;需要一个人学会阅读搜索资料并不停尝试&#xff0c;我希望大家也多多热爱这样持之以恒的尝试。 先看产品的一个模拟机测试效果&#xff08;b站南阳洛信也有视频) 安卓A…

Android本地音乐播放器

UI界面模仿QQ音乐 实现一个简单的本地播放器&#xff0c;功能包括&#xff1a;播放&#xff0c;暂停&#xff0c;上一曲&#xff0c;下一曲&#xff0c;进度条。 功能实现 读取本地音乐 1.创建一个Song类 public class Song {public String song;//歌曲名public String sing…

毕业设计- 基于Android的本地音乐播放器

—— 木叶飞舞之处&#xff0c;火亦生生不息。 项目介绍 本系统支持扫瞄本地音乐播放、暂停、上一首、下一首&#xff0c;点击播放栏跳转到播放页面&#xff0c;可查看当前播放列表&#xff0c;设置播放模式如顺序播放、随机播放&#xff0c;标记为我的喜欢&#xff0c;可以创…

Selenium自动化测试设计模式-PO模式

前言&#xff1a; 在python自动化过程中&#xff0c;Selenium自动化测试中有一个名字常常被提及PageObject&#xff08;思想与面向对象的特性相同&#xff09;&#xff0c;通过PO模式可以大大提高测试用例的维护效率。 不了解po设计模式的可自行百度 面向对象的特性&#xf…

电商项目测试实战(十一)后台业务场景测试设计

后台订单处理业务场景测试设计 流程步骤&#xff1a; 设计测试用例&#xff1a; 第一步&#xff1a;绘制流程图 1、确认业务中的操作 2、分析执行的顺序 3、按照业务方向进行连线 收到前台订单&#xff08;商城->订单->订单列表&#xff09;订单确认发货&#xff0…

电商项目测试实战(十)前台下单业务场景测试设计

前台下单业务场景测试设计 流程步骤&#xff1a; 设计测试用例&#xff1a; 第一步&#xff1a;需求分析 第二步&#xff1a;绘制流程图 1、确定业务中的操作 2、分析执行的顺序 3、按照业务方向进行连线 登录->选购商品->加入购物车->支付->确认订单->等待…

空调测试用例设计

** 空调测试用例设计 ** 界面测试 功能测试 可靠性测试 易用性测试 可维护性测试 兼容性测试 竞品测试 负载压力测试 稳定性测试 文档测试 界面测试&#xff1a; 空调外观的美观性空调外观尺寸是否和设计尺寸一致遥控按钮是否清晰和易懂显示温度及模式的显示屏是否显示设备…

测试场景设计-登录设计

来一波广告&#xff1a;欢迎关注测者说&#xff0c;测试理论知识尽在此处 面试中经常被问到有一个登录页面&#xff0c;你怎么设计测试场景&#xff0c;原来可以做到这么细致。 具体需求&#xff1a; 有一个登陆页面&#xff0c;&#xff08;假如上面有2个textbox,一个提交按钮…

基于微信小程序的大学生心理健康测试设计与实现 .docx

目录 1 绪论 3 1.1 项目开发背景 3 1.2 项目开发意义 3 1.3 项目主要的内容 4 2 相关技术介绍及系统环境开发条件 5 2.1相关技术介绍 5 2.2系统环境开发条件 6 3 系统的需求分析与设计 6 3.1可行性分析 7 3.2需求分析 7 3.2.1系统总体概述 8 3.2.2功能性需求 8 3.2.3非功能性需…

测试设计技术

本文是根据测试架构师修炼之道&#xff08;第二部分 突破&#xff1a;向软件测试架构师的目标迈进&#xff09;整理的&#xff0c;主要分为5个小部分&#xff1a;测试设计四步走、测试设计软技能、设计技术之控制用例粒度、设计技术之自动化测试、设计技术之探索式测试。学习的…

数字系统的测试与可测试设计(DFT)

数字系统的测试与可测试设计&#xff08;DFT&#xff09; 背景介绍1 Defects1.1 名词解释1.2 缺陷种类1.2.1 Physical Defects物理缺陷1.2.2 Shorting Defects1.2.2.1 Gate-Oxide-Shorts1.2.2.2 Bridge1.2.2.1 Open1.2.2.1 Post-fabrication failures 2 Fault Modelling&#x…

2. 测试分析与测试设计

1. 为什么要做好测试分析和测试设计 以业务驱动测试&#xff1a;当下的测试圈子内&#xff0c;大家一直在强调自动化技术、DevOps等&#xff0c;这些是提高效率和质量的利器&#xff0c;但是所有有效的测试行为&#xff0c;都是建立在对业务需求有正确的理解和分析的基础上的。…

软件测试之---测试设计方法

二、测试设计方法&#xff08;黑盒测试设计方法&#xff1b;白盒测试设计方法&#xff09; 1、等价类划分法 1.1等价类划分法概念 将输入&#xff08;输出&#xff09;域划分成若干个子集合&#xff0c;从划分的子集合中选取代表数据&#xff0c;如果选取的数据测试没有问题&…

测试用例:四步测试设计法

读者提问&#xff1a; 阿常&#xff0c;上节我们讲到测试点不等同于测试用例&#xff0c;想请教你一下&#xff0c;如何把测试点加工成测试用例呢&#xff1f; 目前团队中测试人员针对同样的测试点&#xff0c;编写出来的测试用例各不相同&#xff0c;一千个人就有一千个哈姆雷…