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 |