android 第三次作业
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下载:
六:录屏链接:
由于未知原因,上传后声音不同步,有点遗憾。
android 第三次作业的更多相关文章
- Android第三次作业
制作音乐播放器 实现的功能: 歌曲的播放.暂停.停止.上一首.下一首.歌单列表的显示(获取本地歌曲). 成品图: 功能代码实现: 实现歌曲的播放.暂停.停止.上一首.下一首: public void ...
- 2017-2018-1 JaWorld 第三周作业
2017-2018-1 JaWorld 第三周作业 团队展示 队员学号 队名 团队项目描述 队员风采 团队的特色 团队合照 团队初步合作 前两周的反思与总结 需要改进的地方 团队选题 *采访老师或有开 ...
- 2017-2018-1 JAVA实验站 第三周作业
2017-2018-1 JAVA实验站 第三周作业 团队展示 队名 JAVA实验站 拟作的团队项目描述 (2048)增加其他模式,使得2048更加丰富多彩 团队的首次合照 团队的特色描述 团队内部很团 ...
- 耿丹CS16-2班第三次作业汇总
-- Deadline: 2016-10-12 22:48 -- 作业内容: 1.实验2-6 猜数字游戏 2.实验2-7 判断能否为三角形 3.实验2-8 个人所得税计算器 -- 第三次作业总结: 1 ...
- JAVA第三周作业(从键盘输入若干数求和)
JAVA第三周作业(从键盘输入若干数求和) 在新的一周,我学习了JAVA的IO编程.下面的代码实现了从键盘输入若干数求和的目标.import java.util.Scanner; public cla ...
- 第三次作业:caculator
第三次作业 作业链接 ********* 遇到的问题: Scan类: 队列的使用方法不了解,上网查询并自己练习了一下才初步了解,才运用到作业 . 判断数字用的 if (input[i] >= ' ...
- HTML第三天作业做的表格
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xht ...
- 第三次作业——《K米评测》
第三次作业--<K米评测> 一.调研.评测 上手体验 APP的图标做的不错,一眼就知道和KTV唱歌相关的 点进去就是连接包箱的界面和直播界面,把软件最重要的两个功能展示出来了,一目了然 热 ...
- 软件工程(QLGY2015)第三次作业点评(含成绩)
相关博文目录: 第一次作业点评 第二次作业点评 第三次作业点评 团队信息 本页点评团队1-22,其他组见:http://www.cnblogs.com/xiaozhi_5638/p/4490764.h ...
随机推荐
- 关于macOS 管理员(Admin)权限问题。
最近突然想改下用户名,于是在用户与组里解锁,然后两个手指点击用户那一行,更改fullname,不过出于好奇把uid和uuid也改了. 之后发现current user等级由Admin变成Standar ...
- 中文 Tex
\documentclass{article} \usepackage{ctex} \begin{document} 中文English \[E = m c^2\] \end{document} \d ...
- web前端效率提升-nginx+nodejs搭建本地生态
1.起因 编写的项目是一个偏向于后台管理的web系统,使用了angular框架,在绑定数据的时候就依赖于后台的接口格式. 以前是后台写好接口后,我在绑定,在这之前一些逻辑是没法做的,有时候后台接口给的 ...
- 使用ansible实现轻量级的批量主机管理
作者:邓聪聪 查看ansible配置文件下的hosts的文件 [root@ansible-server scripts]# cat /etc/ansible/hosts [test] 172.16.1 ...
- session前后台交互
下面是需求需要,不同的人群进来显示不同,但是还必须是这个走到哪都的存在,不能说点击别的页面,下面红框处的数据就没有了,必须是存在的并且登陆的类型不一样,显示的也不一样,开始的时候想到的是直接调用方法, ...
- js性能的进阶
为了说明js性能方面的差异用一个简单的例子说明下, <style> #ul1{ padding: 5px; overflow: hidden; } #ul1 li{ list-style: ...
- 基于Https协议返回Jason字符串
一:代码结构 二:框架结果: spring+springMvc+springJdbc 三:源代码 1:Ctrl 层 package com.todaytech.yth.gdsd.base.DataIn ...
- Python判断输入字符类型
"""从键盘上输入 一个字符,判断其字符类型.""" while True: char = input("请输入需要判断的字符:& ...
- Java生日计算年龄工具
package com.web.backend.util; import java.util.Calendar;import java.util.Date; /** * @Author: SongZS ...
- 【玩转开源】基于Docker搭建Bug管理系统 MantisBT
环境Ubuntu18.04 + Docker 1. Docker Hub 链接:https://hub.docker.com/r/vimagick/mantisbt 这里直接使用docker命令的方式 ...