博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
安卓实训项目报告:基于存储卡音乐播放器V0.4
阅读量:3971 次
发布时间:2019-05-24

本文共 5662 字,大约阅读时间需要 18 分钟。

文章目录

项目功能

在基于存储卡音乐播放器V0.3基础上,作如下修改:

创建方法能扫描存储卡上所有mp3文件(采用递归算法)
用自定义应用程序类存放全局数据和方法
利用异步任务来完成耗时的存储卡扫描工作

实现步骤

创建安卓应用

在这里插入图片描述

将图片素材放入drawable

在这里插入图片描述

按钮背景图片选择器

在这里插入图片描述

在项目清单文件里设置安卓应用的图标和授权访问外置存储卡

在这里插入图片描述

主布局资源文件activity_main.xml

在这里插入图片描述

创建music_name_list_item.xml文件

在这里插入图片描述

创建子包

  • 创建ui子包,将MainActivity拖进ui子包
  • 创建adapter字包,在里面创建MusicAdapter
  • 创建entity子包,在里面创建Music实体类
  • 创建app子包,在里面创建MusicPlayerApplication实体类
    在这里插入图片描述

编写MusicAdapter

package com.zjs.sdcard_music_player_v04.adapter;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.zjs.sdcard_music_player_v04.R;import com.zjs.sdcard_music_player_v04.entity.Music;import java.util.List;/** * 功能:音乐适配器 */public class MusicAdapter extends BaseAdapter {    private Context context; // 上下文    private List
musicList; // 音乐列表 /** * 构造方法 * * @param context * @param musicList */ public MusicAdapter(Context context, List
musicList) { this.context = context; this.musicList = musicList; } @Override public int getCount() { return musicList.size(); } @Override public Object getItem(int position) { return musicList.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { // 声明视图容器 ViewHolder holder = null; // 判断转换视图是否为空 if (convertView == null) { // 将列表项模板映射成转换视图 convertView = LayoutInflater.from(context).inflate(R.layout.music_name_list_item, null); // 创建视图容器对象 holder = new ViewHolder(); // 实例化转换视图里的控件 holder.tvMusicName = convertView.findViewById(R.id.tvMusicName); // 将视图容器附加到转换视图 convertView.setTag(holder); } else { // 从转换视图里取出视图容器 holder = (ViewHolder) convertView.getTag(); } // 获取列表项要显示的数据 Music music = musicList.get(position); // 设置列表项控件的属性(去掉路径和扩展名) holder.tvMusicName.setText(music.getMusicName().substring( music.getMusicName().lastIndexOf("/") + 1, music.getMusicName().lastIndexOf("."))); // 返回转换视图 return convertView; } /** * 视图容器 */ private static class ViewHolder { TextView tvMusicName; }}

编写Music

package com.zjs.sdcard_music_player_v04.entity;/** * 功能:音乐实体类 */public class Music {    private String musicName; // 音乐名    public String getMusicName() {        return musicName;    }    public void setMusicName(String musicName) {        this.musicName = musicName;    }    @Override    public String toString() {        return "Music{" +                "musicName='" + musicName + '\'' +                '}';    }}

编写MusicPlayerApplition

package com.zjs.sdcard_music_player_v04.app;import android.app.Application;import android.os.Environment;import com.zjs.sdcard_music_player_v04.entity.Music;import java.io.File;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.List;/** * 功能:音乐播放器应用程序类 */public class MusicPlayerApplication extends Application {    private SimpleDateFormat sdf; // 简单日期格式    @Override    public void onCreate() {        super.onCreate();        // 实例化简单日期格式        sdf = new SimpleDateFormat("mm:ss");    }    /**     * 获取格式化时间     *     * @param time 单位是毫秒     * @return mm:ss格式的时间     */    public String getFormatTime(int time) {        return sdf.format(time);    }    /**     * 生成指定目录下某种类型的文件列表     *     * @param dir     * @param suffix     * @param typeFileList     */    public void makeTypeFileList(File dir, String suffix, List
typeFileList) { // 获取指定目录下的File数组(File既可以指向目录,也可以指向文件) File[] files = dir.listFiles(); // 遍历File数组 for (File file : files) { // 判断file是否是文件 if (file.isFile()) { // file是文件 // 按照后缀来过滤文件 if (file.getName().endsWith(suffix)) { // 将满足条件的文件添加到文件列表 typeFileList.add(file.getAbsolutePath()); } } else { // file是目录 // 目录非空,递归调用 if (file.list() != null) { makeTypeFileList(file, suffix, typeFileList); } } } } /** * 获取音乐列表 * * @return 音乐列表 */ public List
getMusicList() { // 声明音乐列表 List
musicList = null; // 获取外置存储卡根目录 File sdRootDir = Environment.getExternalStorageDirectory(); // 创建后缀字符串 String suffix = ".mp3"; // 创建音乐文件列表 List
musicFileList = new ArrayList<>(); // 调用方法,生成指定目录下某种类型文件列表 makeTypeFileList(sdRootDir, suffix, musicFileList); // 判断音乐文件列表里是否有元素 if (musicFileList.size() > 0) { // 实例化音乐列表 musicList = new ArrayList<>(); // 遍历音乐文件列表 for (String musicFile : musicFileList) { // 创建音乐实体 Music music = new Music(); // 设置实体属性 music.setMusicName(musicFile); // 将音乐实体添加到音乐列表 musicList.add(music); } } // 返回音乐列表 return musicList; }}

主界面类 - MainActivity

声明变量

在这里插入图片描述

通过资源标识符获取控件实例

在这里插入图片描述

播放器

在这里插入图片描述

存储读写权限

在这里插入图片描述

设置线程并启动

在这里插入图片描述

创建消息处理器,接收子线程发送的消息

在这里插入图片描述

给音乐列表控件注册监听器

在这里插入图片描述

给媒体播放器注册完成监听器

在这里插入图片描述

填充音乐列表异步任务类

在这里插入图片描述

在这里插入图片描述

播放方法

在这里插入图片描述

暂停方法

在这里插入图片描述

播放|暂停按钮单击事件处理方法

在这里插入图片描述

下一首音乐

在这里插入图片描述

上一首音乐

在这里插入图片描述

上一首|下一首按钮单击事件处理方法

在这里插入图片描述

销毁回调方法,释放资源

在这里插入图片描述

运行效果

在这里插入图片描述

在这里插入图片描述

总结

此版本是v0.2个版本中优化得来,以上便是此次总结

转载地址:http://fjtki.baihongyu.com/

你可能感兴趣的文章
python中字符串操作
查看>>
python中字典操作
查看>>
Python Exception
查看>>
Python输入输出
查看>>
Python中的数组
查看>>
Python模块学习 ---- thread 多线程处理
查看>>
Python模块学习 ---- threading 多线程控制和处理
查看>>
Python模块学习 ---- httplib HTTP协议客户端实现
查看>>
python模块学习 ---- smtplib 邮件发送
查看>>
Python模块学习 ---- subprocess 创建子进程
查看>>
python求时间差
查看>>
django使用uploadify上传文件
查看>>
python中解析xml
查看>>
Python调用MongoDB使用心得
查看>>
搜罗Android开发eclipse错误汇总
查看>>
wget 命令用法详解
查看>>
python--httplib模块使用
查看>>
Python模块学习 --- urllib
查看>>
用Python写的图片蜘蛛人
查看>>
python wget下载
查看>>