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 ...
随机推荐
- Spring.Net 入门学习笔记-----one
一. 基本概念 Spring.Net是一个轻量级的控制反转(Ioc)和面向切面的(Aop)的容器框架: Ioc:控制反转:简单的说就是将创建对象的控制权转交给外部容器(IApplicationC ...
- jquery的datatables第二次加载报错
"destroy":true, "scrollX": true, "ordering": false, "sScrollXInne ...
- JavaFX - 富互联网应用
JavaFX教程™ --必看https://www.yiibai.com/javafx /================= 富互联网应用 是那些提供与Web应用程序类似的功能,并可作为桌面应用程序体 ...
- vueSSR全栈(项目实战 mac)
1.准备安装及指定版本 参考安装类中的 安装部分(node,npm,webpack) nuxt 官网下载nuxt脚手架(可以自定义版本) 需要下载MongoDB redis 以及数据库可视化工具 具 ...
- 分布式系列十二: Redis高级主题
持久化 Redis 支持持久化, 其持久化数据有两种方式. 两种可以同时使用. 如果同时使用, Reids 在重启时将使用 AOF 方式来还原数据. RDB 按照一定策略定时同步内存的数据到磁盘.文件 ...
- SQLAlchemy使用(三)搭配Flask框架使用
前言 本章应该是SQLAlchemy使用系列的最后一篇了,本章简单讲一下如何搭配Flask使用.下一篇应该是写Flask_restful相关内容了 正文 我们简单使用前两章的model,两张表 # - ...
- 三, 练习 python索引 (list和tuple)
(1) 练习 请用索引取出下面list的指定元素: 1, # -*- coding: utf-8 -*- L = [ ['Apple', 'Google', 'Microsoft'], ['Java' ...
- 移动端rem与px适应js
方法一: (function (doc, win) { var docEl = doc.documentElement, resizeEvt = "orientationchange&quo ...
- 洛谷P4774 [NOI2018]屠龙勇士 [扩欧,中国剩余定理]
传送门 思路 首先可以发现打每条龙的攻击值显然是可以提前算出来的,拿multiset模拟一下即可. 一般情况 可以搞出这么一些式子: \[ atk_i\times x=a_i(\text{mod}\ ...
- 基于物品的协同过滤item-CF 之电影推荐 python
推荐算法有基于协同的Collaboration Filtering:包括 user Based和item Based:基于内容 : Content Based 协同过滤包括基于物品的协同过滤和基于用户 ...