android studio音乐播放器

一、实现功能:

1.读取本地SD中的所有音频文件

2.歌单列表展示,并显示音频具体信息

3.进度条显示当前播放进度,可滑动加速

4.点击歌单进行播放

5.实现暂停、播放、下一曲、上一曲

二、页面截图:

。。。。。。。。。。。。。。。。。。

三、关键代码实现

1.首先获取从SD卡中读取本地文件的权限:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

2.Android系统会在SD卡有更新的时候自动将SD卡文件分类并存入SQLite数据库,而我们要做的只是像正常读取数据库一样去读数据库的信息

新建MusicMedia类进行详细信息的保存:

package com.example.pc.music;

public class MusicMedia {
private int id;
private String title;
private String artist;
private String url;
private String time;
private String size;
private int albumId;
private String album;

在主类中获取详细信息

  /*加载媒体库里的音频*/
public ArrayList<MusicMedia> scanAllAudioFiles(){
//生成动态数组,并且转载数据
ArrayList<MusicMedia> mylist = new ArrayList<MusicMedia>();
Cursor cursor = getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
//遍历媒体数据库
if(cursor.moveToFirst()){
while (!cursor.isAfterLast()) {
    //歌曲标题
String tilte = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE));
//歌曲的歌手名: MediaStore.Audio.Media.ARTIST
String artist = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST));
//歌曲的总播放时长 :MediaStore.Audio.Media.DURATION
int duration = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION));
//歌曲文件的大小 :MediaStore.Audio.Media.SIZE
Long size = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.SIZE));
if (size >1024*800){//大于800K
MusicMedia musicMedia = new MusicMedia();
musicMedia.setId(id);
musicMedia.setArtist(artist);
musicMedia.setSize(size);
musicMedia.setTitle(tilte);
musicMedia.setTime(duration);
musicMedia.setUrl(url);
musicMedia.setAlbum(album);
musicMedia.setAlbumId(albumId); mylist.add(musicMedia); }
cursor.moveToNext();
}
}
return mylist;
}

3.使用MediaPlayer进行点击播放:使用mediaplayer传一个地址过去,这些信息在刚读取音频的方法里都有,传一个地址过去使用一个service先播放起来

musicListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//点击播放音乐,不过需要判断一下当前是否有音乐在播放,需要关闭正在播放的 currentposition = position;
player(currentposition);
}
});

新建service

<service
android:name=".MusicPlayerService"
android:enabled="true"
android:exported="true">
<intent-filter >
<action android:name="player"></action>
</intent-filter>
</service>

4.进度条显示当前进度:service使用静态的变量,activity里也是使用静态的变量,然后开一个线程,1s更新一次状态,在service里直接修改seekbar

public class MusicPlayerService extends Service implements Runnable {
private static final String TAG = "MusicPlayerService";
private static final int NOTIFICATION_ID = 1; // 如果id设置为0,会导致不能设置为前台service
public static MediaPlayer mediaPlayer = null;
private String url = null;
private String MSG = null;
private static int curposition;//第几首音乐
private musicBinder musicbinder = null;
private int currentPosition = 0;// 设置默认进度条当前位置
public MusicPlayerService() {
Log.i(TAG,"MusicPlayerService......1");
musicbinder = new musicBinder();
}
//通过bind 返回一个IBinder对象,然后改对象调用里面的方法实现参数的传递
@Override
public IBinder onBind(Intent intent) {
Log.i(TAG,"onBind......");
return null;
} @Override
public void onCreate() {
Log.i(TAG, "onCreate......2");
super.onCreate();
if (mediaPlayer == null) {
/* mediaPlayer.reset();
mediaPlayer.release();
mediaPlayer = null;*/
mediaPlayer = new MediaPlayer();
}
// 监听播放是否完成
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) { }
}); } @Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i(TAG, "onStartCommand......3");
// /storage/emulated/0/Music/Download/Selena Gomez - Revival/Hands to Myself.mp3
if(intent != null){
MSG = intent.getStringExtra("MSG");
if(MSG.equals("0")){
url = intent.getStringExtra("url");
Log.i(TAG, url + "......." + Thread.currentThread().getName());
palyer();
}else if(MSG.equals("1")){
mediaPlayer.pause();
}else if(MSG.equals("2")){
mediaPlayer.start();
} } return super.onStartCommand(intent, flags, startId);
} private void palyer() {
Log.i(TAG,"palyer......"); //用户在暂停是点击其他的音乐,所以不管当前状态,都重置一下
//下面这段代码可以实现简单的音乐播放
try {
// Log.i(TAG,"palyer......new....");
mediaPlayer.reset(); mediaPlayer.setDataSource(url);
mediaPlayer.setLooping(true);
// mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.prepare();
mediaPlayer.start();
// 设置进度条最大值
MusicActivity.audioSeekBar.setMax(mediaPlayer.getDuration());
//开启新线程
new Thread(this).start();
} catch (IOException e) {
e.printStackTrace();
}
}
// 刷新进度条 ,时间 @Override
public void run() { Log.i(TAG,Thread.currentThread().getName()+"......run..."); int total = mediaPlayer.getDuration();// 总时长
while (mediaPlayer != null && currentPosition < total) {
try {
Thread.sleep(1000);
if (mediaPlayer != null) {
currentPosition = mediaPlayer.getCurrentPosition();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
MusicActivity.audioSeekBar.setProgress(CurrentPosition);
}
}
@Override
public void onDestroy() {
Log.i(TAG,"onDestroy......");
super.onDestroy();
if (mediaPlayer != null) {
mediaPlayer.stop();
mediaPlayer.release();
mediaPlayer = null;
}
//关闭线程
Thread.currentThread().interrupt();
stopForeground(true);
}
public String toTime(int time){
time /= 1000;
int minute = time / 60;
int hour = minute / 60;
int second = time % 60;
minute %= 60;
return String.format("%02d:%02d", minute, second);
}
}

还有一些播放按钮点击更改样式、判断在第一首或最后一首时点击上一首或下一首的提示等功能

四、coding链接:

https://coding.net/u/dsy1600802076/p/android3/git

五:APK下载:

apk下载

 六:录屏链接:

手机录屏已上传至优酷

由于未知原因,上传后声音不同步,有点遗憾。

android 第三次作业的更多相关文章

  1. Android第三次作业

    制作音乐播放器 实现的功能: 歌曲的播放.暂停.停止.上一首.下一首.歌单列表的显示(获取本地歌曲). 成品图: 功能代码实现: 实现歌曲的播放.暂停.停止.上一首.下一首: public void ...

  2. 2017-2018-1 JaWorld 第三周作业

    2017-2018-1 JaWorld 第三周作业 团队展示 队员学号 队名 团队项目描述 队员风采 团队的特色 团队合照 团队初步合作 前两周的反思与总结 需要改进的地方 团队选题 *采访老师或有开 ...

  3. 2017-2018-1 JAVA实验站 第三周作业

    2017-2018-1 JAVA实验站 第三周作业 团队展示 队名 JAVA实验站 拟作的团队项目描述 (2048)增加其他模式,使得2048更加丰富多彩 团队的首次合照 团队的特色描述 团队内部很团 ...

  4. 耿丹CS16-2班第三次作业汇总

    -- Deadline: 2016-10-12 22:48 -- 作业内容: 1.实验2-6 猜数字游戏 2.实验2-7 判断能否为三角形 3.实验2-8 个人所得税计算器 -- 第三次作业总结: 1 ...

  5. JAVA第三周作业(从键盘输入若干数求和)

    JAVA第三周作业(从键盘输入若干数求和) 在新的一周,我学习了JAVA的IO编程.下面的代码实现了从键盘输入若干数求和的目标.import java.util.Scanner; public cla ...

  6. 第三次作业:caculator

    第三次作业 作业链接 ********* 遇到的问题: Scan类: 队列的使用方法不了解,上网查询并自己练习了一下才初步了解,才运用到作业 . 判断数字用的 if (input[i] >= ' ...

  7. HTML第三天作业做的表格

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xht ...

  8. 第三次作业——《K米评测》

    第三次作业--<K米评测> 一.调研.评测 上手体验 APP的图标做的不错,一眼就知道和KTV唱歌相关的 点进去就是连接包箱的界面和直播界面,把软件最重要的两个功能展示出来了,一目了然 热 ...

  9. 软件工程(QLGY2015)第三次作业点评(含成绩)

    相关博文目录: 第一次作业点评 第二次作业点评 第三次作业点评 团队信息 本页点评团队1-22,其他组见:http://www.cnblogs.com/xiaozhi_5638/p/4490764.h ...

随机推荐

  1. git体验

    (1)git初始化配置#配置用户名git config --global user.name "azcode"#配置邮箱git config --global user.email ...

  2. 浅入深出Vue:工具准备之PostMan安装配置及Mock服务配置

    浅入深出Vue之工具准备(二):PostMan安装配置 由于家中有事,文章没顾得上.在此说声抱歉,这是工具准备的最后一章. 接下来就是开始环境搭建了~尽情期待 工欲善其事必先利其器,让我们先做好准备工 ...

  3. 查询SQL Server执行过的SQL语句

    SELECT TOP 1000         ST.text AS '执行的SQL语句',        QS.execution_count AS '执行次数',        QS.total_ ...

  4. word20170107当地交通 Local transportation有用的词和句子

    有用的词: transportation: 交通 airport express: 机场快线 shuttle bus: 班车 taxi/cab: 出租车 meter: 打表 limousine:专车. ...

  5. 记事本:js简介

    引用js和css很类似,大致有三种方式: 第一种: 在行内引用js, <div onclick="alert(111);"> </div> 第二种: 在行外 ...

  6. Filebeat 启动关闭流程

    启动阶段: instance/beat.go #打印home路径.配置路径.数据路径和日志路径 seccomp #Syscall filter检查 instance/beat.go #beat inf ...

  7. eclipse:插件安装总结

    1.SVN插件 首先安装SVNKIT,下载地址:https://svnkit.com/download.php 再安装Subclipse,这个在marketplace安装即可. 2.安装时报错:Una ...

  8. Java小程序练习

    1.选择排序法所谓的选择排序,就是把当前数据与它后面所有的数据做个比较,假如满足比较条件,则进行交换操作,直到最后二个数比较完毕,这样重新输出的数据就已经由大到小或者由小到大排好序了.for(int ...

  9. GIt -- git push 远程分支老是需要重新输入公钥密码问题处理?

     步骤: 先查看远程有哪些分支 删除远程分支,重新关联远程分支 最后再git push 到远程分支 git remote -v git remote rm RedisNote git remote a ...

  10. vscode中tab键无法触发emmet快捷生成

    1.file——preference——setting 2.点击user setting的extensions 3.点击emmet 4.emmet下的edit in settings.json.添加代 ...