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 ...
随机推荐
- git体验
(1)git初始化配置#配置用户名git config --global user.name "azcode"#配置邮箱git config --global user.email ...
- 浅入深出Vue:工具准备之PostMan安装配置及Mock服务配置
浅入深出Vue之工具准备(二):PostMan安装配置 由于家中有事,文章没顾得上.在此说声抱歉,这是工具准备的最后一章. 接下来就是开始环境搭建了~尽情期待 工欲善其事必先利其器,让我们先做好准备工 ...
- 查询SQL Server执行过的SQL语句
SELECT TOP 1000 ST.text AS '执行的SQL语句', QS.execution_count AS '执行次数', QS.total_ ...
- word20170107当地交通 Local transportation有用的词和句子
有用的词: transportation: 交通 airport express: 机场快线 shuttle bus: 班车 taxi/cab: 出租车 meter: 打表 limousine:专车. ...
- 记事本:js简介
引用js和css很类似,大致有三种方式: 第一种: 在行内引用js, <div onclick="alert(111);"> </div> 第二种: 在行外 ...
- Filebeat 启动关闭流程
启动阶段: instance/beat.go #打印home路径.配置路径.数据路径和日志路径 seccomp #Syscall filter检查 instance/beat.go #beat inf ...
- eclipse:插件安装总结
1.SVN插件 首先安装SVNKIT,下载地址:https://svnkit.com/download.php 再安装Subclipse,这个在marketplace安装即可. 2.安装时报错:Una ...
- Java小程序练习
1.选择排序法所谓的选择排序,就是把当前数据与它后面所有的数据做个比较,假如满足比较条件,则进行交换操作,直到最后二个数比较完毕,这样重新输出的数据就已经由大到小或者由小到大排好序了.for(int ...
- GIt -- git push 远程分支老是需要重新输入公钥密码问题处理?
步骤: 先查看远程有哪些分支 删除远程分支,重新关联远程分支 最后再git push 到远程分支 git remote -v git remote rm RedisNote git remote a ...
- vscode中tab键无法触发emmet快捷生成
1.file——preference——setting 2.点击user setting的extensions 3.点击emmet 4.emmet下的edit in settings.json.添加代 ...