Android大作业——音乐播放器
1、团队成员:
计算机161班 1600802010 韩 璐 博客地址:https://www.cnblogs.com/hanlulu/
计算机161班 1600802036 朱永霞 博客地址:https://www.cnblogs.com/zyxboke/
2、APK 链接:
https://git.dev.tencent.com/Air_Amy/FinalHomework.git
3、作业代码链接:
https://git.dev.tencent.com/Air_Amy/FinalHomework.git
4、介绍团队项目
4、1 团队项目的总体效果截图
视频:
4、2 实现的功能及其效果的描述
实现功能:
4.2.1、上一曲、下一曲、播放、暂停
4.2.2、进步条
4.2.3、清除最近听得列表歌曲
4.2.4、播放列表
4.2.5、显示歌曲信息
5、项目关键代码
5.1、上一曲、下一曲、播放、暂停
public void onClick(View v){
switch (v.getId()) {
case R.id.play:
musicService.start();
break;
case R.id.localmusic:
Intent intent = new Intent(MainActivity.this,LocalMusicActivity.class);
startActivity(intent);
break;
case R.id.playlist:
Intent intent3 = new Intent(MainActivity.this,playlist.class);
startActivity(intent3);
break;
case R.id.playnext:
SQLiteDatabase db = dbHelper.getWritableDatabase();
Cursor cursor = db.query("login",null,null,null,null,null,null);
cursor.moveToFirst();
do{
Log.e("music","CurrentTitle = "+CurrentTitle); //播放列表不会有同名歌曲,所以根据标题对比
if(CurrentTitle.equals(cursor.getString(cursor.getColumnIndex("title")))) {
Log.e("music","找到匹配");
cursor.moveToNext();
if(cursor.isAfterLast()) {
Log.e("music","当前歌曲在最后一行返回第一行");
cursor.moveToFirst();
String url = cursor.getString(cursor.getColumnIndex("url"));
String title = cursor.getString(cursor.getColumnIndex("title"));
String artist = cursor.getString(cursor.getColumnIndex("artist"));
Intent intent2 = new Intent("startnew");
intent2.putExtra("url",url);
intent2.putExtra("title",title);
intent2.putExtra("artist",artist);
final Intent eiiintent = new Intent(createExplicitFromImplicitIntent(MainActivity.this,intent2));
bindService(eiiintent,conn, Service.BIND_AUTO_CREATE);
startService(eiiintent);
break;
} else{
Log.e("music","当前歌曲不是在最后一行");
String url = cursor.getString(cursor.getColumnIndex("url"));
String title = cursor.getString(cursor.getColumnIndex("title"));
String artist = cursor.getString(cursor.getColumnIndex("artist"));
cursor.moveToLast();
Intent intent2 = new Intent("startnew");
intent2.putExtra("url",url);
intent2.putExtra("title",title);
intent2.putExtra("artist",artist);
final Intent eiintent = new Intent(createExplicitFromImplicitIntent(MainActivity.this,intent2));
bindService(eiintent,conn, Service.BIND_AUTO_CREATE);
startService(eiintent);
break;
}
}
}while(cursor.moveToNext());
cursor.close();
break;
case R.id.playlast:
SQLiteDatabase dbb = dbHelper.getWritableDatabase();
Cursor cursorr = dbb.query("login",null,null,null,null,null,null);
cursorr.moveToFirst();
do{
if(CurrentTitle.equals(cursorr.getString(cursorr.getColumnIndex("title")))) {
cursorr.moveToPrevious();
if(cursorr.isBeforeFirst()){
cursorr.moveToLast();
String url = cursorr.getString(cursorr.getColumnIndex("url"));
String title = cursorr.getString(cursorr.getColumnIndex("title"));
String artist = cursorr.getString(cursorr.getColumnIndex("artist"));
Intent intent8 = new Intent("startnew");
intent8.putExtra("url",url);
intent8.putExtra("title",title);
intent8.putExtra("artist",artist);
final Intent eeiintent = new Intent(createExplicitFromImplicitIntent(MainActivity.this,intent8));
bindService(eeiintent,conn, Service.BIND_AUTO_CREATE);
startService(eeiintent);
break;
}
else{
String url = cursorr.getString(cursorr.getColumnIndex("url"));
String title = cursorr.getString(cursorr.getColumnIndex("title"));
String artist = cursorr.getString(cursorr.getColumnIndex("artist"));
cursorr.moveToNext();
Intent intent8 = new Intent("startnew");
intent8.putExtra("url",url);
intent8.putExtra("title",title);
intent8.putExtra("artist",artist);
final Intent eeiintent = new Intent(createExplicitFromImplicitIntent(MainActivity.this,intent8));
bindService(eeiintent,conn, Service.BIND_AUTO_CREATE);
startService(eeiintent);
break;
}
}
}while(cursorr.moveToNext());
cursorr.close();
break;
default:
break;
}}
5.2、获得歌曲信息
public class Music {
private int id;
private long album_id;
private String title;
private String artist;
private long duration;
private String url;
public void setId(int id){
this.id = id;
}
public long getId(){return this.id;}
public void setTitle(String title){
this.title = title;
}
public String getTitle(){return this.title;}
public void setArtist(String artist){
this.artist = artist;
}
public String getArtist(){return this.artist;}
public void setDuration(long duration){this.duration = duration;}
public long getDuration(){return this.duration;}
public void setUrl(String url){this.url = url;}
public String getUrl(){return this.url;}
public void setAlbum_id(long album_id){this.album_id = album_id;}
public long getAlbum_id(){return this.album_id;}
public class Findmusic {
public List<Music> getmusics(ContentResolver contentResolver) {
Cursor cursor = contentResolver.query(
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
List<Music> musics = new ArrayList<Music>();
for (int i = 0; i < cursor.getCount(); i++) {
Music music = new Music();
cursor.moveToNext();
String title = cursor.getString((cursor.getColumnIndex(MediaStore.Audio.Media.TITLE)));
String artist = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST));
long duration = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.DURATION));
String url = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA));
String album = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM));
long album_id = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID));
int isMusic = cursor.getInt(cursor.getColumnIndex(MediaStore.Audio.Media.IS_MUSIC));
if (isMusic != 0 && duration/(1000 * 60) >= 1) {//筛选歌曲
music.setTitle(title);
music.setArtist(artist);
music.setDuration(duration);
music.setUrl(url);
musics.add(music);
}
}
cursor.close();
return musics;
}
}
5.3返回键退出
public boolean onTouchEvent(MotionEvent event) { mGestureDetector.onTouchEvent(event); return super.onTouchEvent(event); }
5.4主页面布局
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:background="@drawable/bg1" tools:context="com.example.administrator.musicplayer.MainActivity" android:orientation="vertical"> <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/top" android:layout_alignParentStart="true" android:layout_weight="3"> <Button android:layout_width="50dp" android:layout_height="50dp" android:id="@+id/localmusic" android:background="@drawable/localmusic" android:layout_gravity="right|top" /> </FrameLayout> <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="10"> <Button android:layout_width="50dp" android:layout_height="50dp" android:id="@+id/playnext" android:background="@drawable/playnextbg" android:layout_alignParentTop="true" android:layout_alignParentEnd="true" android:layout_gravity="right|center_vertical" android:layout_marginRight="40dp" /> <Button android:layout_width="50dp" android:layout_height="50dp" android:id="@+id/play" android:background="@drawable/buttonbg" android:layout_gravity="center" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:layout_marginLeft="5dp" /> <Button android:layout_width="50dp" android:layout_height="50dp" android:id="@+id/playlast" android:background="@drawable/playpreviousbg" android:layout_alignParentTop="true" android:layout_alignParentStart="true" android:layout_gravity="left|center_vertical" android:layout_marginLeft="40dp" /> </FrameLayout> <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="10" android:layout_alignParentStart="true" android:layout_alignParentTop="true" android:id="@+id/bottom"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="left|center_vertical" android:orientation="vertical"> <LinearLayout android:orientation="horizontal" android:layout_width="match_parent" android:layout_weight="1" android:layout_height="match_parent"> <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:gravity="top" android:hint="Title" android:id="@+id/textView" android:layout_gravity="center" android:textColor="#ffffff" android:textSize="20dp" android:textColorHint="#ffffff" /> <Button android:layout_width="30dp" android:layout_height="30dp" android:background="@drawable/playlist" android:id="@+id/playlist" android:layout_gravity="top" /> </LinearLayout> <SeekBar android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="2" android:id="@+id/seekBar" android:maxHeight="1dp" android:maxWidth="1dp" android:progressDrawable="@drawable/seekbarbg" android:thumb="@drawable/currentprogress3" android:indeterminate="false" android:layout_gravity="center_horizontal|bottom" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:hint="artist" android:textAppearance="?android:attr/textAppearanceLarge" android:id="@+id/textView2" android:textColor="#ffffff" android:textColorHint="#ffffff" android:textSize="15dp" /> </LinearLayout> </FrameLayout> <FrameLayout android:layout_width="match_parent" android:layout_weight="10" android:layout_height="match_parent"></FrameLayout> </LinearLayout>
6、前五(并列排序,先后顺序按照我下载APK的顺序排列)
6.1 汤文涛组的校园易
描述:实现的功能有登录、注册、密码修改、查看个人信息、上传商品、查看我的发布、查看所有商品、查看某个商品的详细信息、给商家留言
优点:界面优美,App贴近生活,登录注册页面让人舒适,感觉商品分类很清楚,价格明确,可以自行发布信息,对信息进行查插删改更新等,还有给商家留言互动的功能,让我大吃一惊。个人信息修改也很到位。个人发布信息的管理很清晰。
缺点:分类中有Bug,留言添加不了
我所提倡:我发布的添加到页面,填写信息增加格式限制。
6.2 孟凡锚组音乐播放器
描述:孟凡锚组音乐播放器实现了音乐播放器的基本功能,特别是音量调节。
优点:界面美观,上部分的图片播放很让人惊叹,音量调节这部分我十分喜欢,相对于我们写的音乐播放器来说,高大上了不少,上面的音乐图片循环很是美观,基本上和我使用的播放器达到了一致的效果,音乐信息的获取也很不错。
缺点:播放暂停偶尔状态切换不到位,音量调节按钮有点小。
我所提倡:增加列表键,不将音乐列表直接袒露在主页面。
6.3 贺鸿坤组音乐播放器
描述:贺鸿坤组音乐播放器实现了音乐播放器的基本功能。
优点:界面堪称我看到的音乐播放器中最美观的了,实在是梦幻。而且歌曲界面播放的美观大方,功能方面,上一曲下一曲切换自如。基本的播放器功能都实现了,而且个人认为在添加几个功能就和市面上的音乐播放器一样了
缺点:没有实现音量调节
我所提倡:实现音量调节。
6.4 李凌龙组简易账本
描述:李凌龙组简易账本实现了账本的基本功能,记账时间选择,金额,记账记录的插入删改。
优点:界面简洁大方,给予一种视觉的舒适感,记账时间的选择方便记录忘记记录的账目,日历式的选择让人耳目一新,优于自己的时间填入。账本最令我开心的是编辑功能,可以对写错的账目进行再次修改。
缺点:时间无法选择具体,时分不能进行选择。
我所提倡:建议账目背景可以添加一下,使得界面跟家美观,字体有点小。可以更改填入内容为选项,常规项目,例如吃饭购物就可以选择而不用自己填入。
6.5 洪居兴组旅游攻略
描述:洪居兴组旅游攻略本实现了旅游攻略的基本功能,登录注册,验证码验证,查看攻略等。
优点:界面十分美观,验证码功能是最惊艳,手机验证码验证功能是我不会的,希望以后讨教。APP贴近现实,很有用处。服务协议也很赞。
缺点:密码未加密,同意服务协议那的框框看不清在哪
我所提倡:联网搜索酒店等功能服务。
7、问题及解决方法
7.1、上一曲到第一曲时如何跳到最后一曲————1600802010韩璐
解决办法:
上一曲到第一曲时,获取文件总个数,另其播放位置变成最后一曲,从最后一曲播放
7.2、下一曲到最后一曲时如何跳到第一曲————160802010韩璐
解决办法:
下一曲到最后一曲时,获取文件总个数,另其播放位置变成第一首,及0,从第一首播放。
7.3、如何实现几个播放模式改变。————1600802010韩璐
解决办法:
给他们指定为1,2,3.不同情况下转换。
单曲循环,另播放位置始终为当前歌曲。
全部循环,另其结束在开始。
随机播放,随机获取播放位置,开始播放。
7.4、如何获取信息————1600802036朱永霞
解决办法:
创建一个歌曲类,定义变量,这些变量用来储存需要获取的内容
定义一个工具类,在这个类中获取音频文件,并且对歌曲名、歌手和时间等进行格式规范
7.5、如何存储歌曲————1600802036朱永霞
解决办法:
定义一个布局用于展示每一个音频文件的内容,并把这个布局添加到主布局文件中的ListView中去.
读取手机中所有的音频文件,然后将文件信息显示在listView中。
8、团队分工
姓名 | 分工 | 工作比例 | 分数 |
韩璐 | 上一曲下一曲、列表清除 | 50% | 10 |
朱永霞 | 界面实现,播放列表实现 | 50% | 10 |