文章目錄
- 創建安卓項目
- 創建ui,service,entity,dal,bll,app,adapter子目錄
- 將圖片素材放入drawable中
- 創建按鈕背景圖片選擇器
- 編寫custom_border.xml
- 創建anim包里面創建animator.xml
- 創建menu包里面創建main.xml
- 編寫布局文件activity_splash_screen.xml
- 字符串資源文件strings.xml
- 編寫音樂名列表項模板music_list_item.xml
- 編寫主布局文件activity_main.xml
- 編寫ui子包里的SplashScreenActivity(啟動畫面)
- 在app子包里面創建音樂播放器應用程序類 - MusicPlayerApplication
- 在entity子包里面創建音樂實體類 - Music
- 編寫音樂數據訪問對象musicdao.java
- 編寫音樂業務類musicbiz.java
- 編寫音樂播放器應用程序類musicplayerapplication.java
- 在app子包里面創建常見應用程序常量接口 - AppConstants
- 編寫項目清單文件
- 在adapter子包里面創建音樂適配器 - MusicAdapter
創建安卓項目
創建ui,service,entity,dal,bll,app,adapter子目錄
將圖片素材放入drawable中
創建按鈕背景圖片選擇器
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:drawable="@drawable/next_button_pressed" android:state_pressed="true" /><item android:drawable="@drawable/next_button" android:state_pressed="false" />
</selector>
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:drawable="@drawable/play_button_pressed" android:state_pressed="true" /><item android:drawable="@drawable/play_button" android:state_pressed="false" />
</selector>
- previous_button_selector.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:drawable="@drawable/previous_button_pressed" android:state_pressed="true" /><item android:drawable="@drawable/previous_button" android:state_pressed="false" />
</selector>
- pause_button_selector.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:drawable="@drawable/pause_button_pressed" android:state_pressed="true" /><item android:drawable="@drawable/pause_button" android:state_pressed="false" />
</selector>
編寫custom_border.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="rectangle" ><corners android:radius="5dp" /><solid android:color="#eeeeee"/><strokeandroid:width="1dp"android:color="#555" /><paddingandroid:bottom="10dp"android:left="10dp"android:right="10dp"android:top="10dp" /></shape>
創建anim包里面創建animator.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"><alphaandroid:duration="3000"android:fromAlpha="0.0"android:toAlpha="1.0" /><rotateandroid:duration="3000"android:fromDegrees="0"android:pivotX="50%"android:pivotY="50%"android:repeatCount="1"android:repeatMode="reverse"android:toDegrees="+360" /></set>
創建menu包里面創建main.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"><itemandroid:id="@+id/action_settings"android:icon="@drawable/order_mode"android:orderInCategory="100"android:title=""app:showAsAction="always"><menu><itemandroid:id="@+id/action_default_order"android:icon="@drawable/default_order"android:checked="true"app:showAsAction="always"android:title="@string/default_order"/><itemandroid:id="@+id/action_title_order"android:icon="@drawable/title_order"app:showAsAction="always"android:title="@string/title_order"/><itemandroid:id="@+id/action_duration_order"android:icon="@drawable/duration_order"app:showAsAction="always"android:title="@string/duration_order"/></menu></item></menu>
編寫布局文件activity_splash_screen.xml
<?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:background="@drawable/background"android:orientation="vertical"android:gravity="center"tools:context=".ui.SplashScreenActivity"><ImageViewandroid:id="@+id/iv_music_icon"android:layout_width="200dp"android:layout_height="200dp"android:src="@drawable/music"android:layout_marginTop="20dp"/><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center"android:orientation="vertical"><TextViewandroid:id="@+id/tv_title"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="30dp"android:text="@string/title"android:textColor="#0000ff"android:textSize="25sp" /><TextViewandroid:id="@+id/tv_version"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="20dp"android:text="@string/version"android:textColor="#ff0000"android:textSize="20sp" /><TextViewandroid:id="@+id/tv_author"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="20dp"android:text="@string/author"android:textColor="#000000"android:textSize="20sp" /></LinearLayout></LinearLayout>
字符串資源文件strings.xml
<resources><string name="app_name">基于媒體庫音樂播放器V1.0</string><string name="title">基于媒體庫音樂播放器</string><string name="version">Version 1.0</string><string name="author">瀘職院信息系·華衛</string><string name="default_order">默認排序</string><string name="title_order">按標題排序</string><string name="duration_order">按時長排序</string><string name="play_mode">播放模式:</string><string name="order">順序</string><string name="loop">單曲循環</string><string name="random">隨機</string>
</resources>
編寫音樂名列表項模板music_list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"android:padding="5dp" ><ImageViewandroid:id="@+id/iv_image"android:layout_width="50dp"android:layout_height="50dp"android:layout_alignParentLeft="true"android:layout_alignParentTop="true"android:layout_marginRight="10dp"android:src="@drawable/music" /><TextViewandroid:id="@+id/tv_artist"android:layout_width="wrap_content"android:layout_height="20dp"android:layout_alignTop="@+id/iv_image"android:layout_toRightOf="@+id/iv_image"android:text="artist"android:textColor="#0000ff"android:textSize="16sp" /><TextViewandroid:id="@+id/tv_duration"android:layout_width="wrap_content"android:layout_height="20dp"android:layout_alignBaseline="@+id/tv_artist"android:layout_alignParentRight="true"android:text="duration"android:textColor="#aaaaaa"android:textSize="12sp" /><TextViewandroid:id="@+id/tv_display_name"android:layout_width="wrap_content"android:layout_height="20dp"android:layout_alignLeft="@+id/tv_artist"android:layout_below="@+id/tv_artist"android:layout_marginTop="10dp"android:text="display_name"android:textColor="#000000"android:textSize="15sp" /></RelativeLayout>
編寫主布局文件activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@drawable/background"android:orientation="vertical"android:padding="10dp"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="50dp"android:background="@drawable/custom_border"android:gravity="center"android:orientation="horizontal"android:padding="5dp"><TextViewandroid:id="@+id/tv_play_mode"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/play_mode"android:textSize="13sp" /><RadioGroupandroid:id="@+id/rg_play_mode"android:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="horizontal"><RadioButtonandroid:id="@+id/rb_order"android:layout_width="wrap_content"android:layout_height="wrap_content"android:checked="true"android:text="@string/order"android:textSize="13sp" /><RadioButtonandroid:id="@+id/rb_random"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/random"android:textSize="13sp" /><RadioButtonandroid:id="@+id/rb_loop"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/loop"android:textSize="13sp" /></RadioGroup></LinearLayout><ListViewandroid:id="@+id/lv_music_list"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="8"/><Viewandroid:layout_width="match_parent"android:layout_height="1dp"android:layout_marginBottom="5dp"android:layout_marginTop="5dp"android:background="#aaaaaa" /><TextViewandroid:id="@+id/tv_music_name"android:layout_width="wrap_content"android:layout_height="0dp"android:layout_weight="0.5"android:textColor="#0000ff"android:textSize="16sp" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="0dp"android:layout_marginBottom="10dp"android:layout_marginTop="10dp"android:layout_weight="1"android:gravity="center_vertical"android:orientation="horizontal"><TextViewandroid:id="@+id/tv_current_position"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:textColor="#ff0000" /><SeekBarandroid:id="@+id/sb_music_progress"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="6" /><TextViewandroid:id="@+id/tv_duration"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:textColor="#ff00ff" /></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"android:gravity="center"android:orientation="horizontal"><Buttonandroid:id="@+id/btn_previous"android:layout_width="60dp"android:layout_height="50dp"android:background="@drawable/previous_button_selector"android:onClick="doPrevious" /><Buttonandroid:id="@+id/btn_play_pause"android:layout_width="60dp"android:layout_height="50dp"android:background="@drawable/play_button_selector"android:onClick="doPlayOrPause" /><Buttonandroid:id="@+id/btn_next"android:layout_width="60dp"android:layout_height="50dp"android:background="@drawable/next_button_selector"android:onClick="doNext" /></LinearLayout></LinearLayout>
編寫ui子包里的SplashScreenActivity(啟動畫面)
package com.zjs.ms_music_player_v01.ui;import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;import com.zjs.ms_music_player_v01.R;/*** 啟動界面類**/public class SplashScreenActivity extends Activity {/*** 動畫對象*/private Animation animation;/*** 音樂圖標圖像控件*/private ImageView ivMusicIcon;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 利用布局資源文件設置用戶界面setContentView(R.layout.activity_splash_screen);// 通過資源標識獲得控件實例ivMusicIcon = findViewById(R.id.iv_music_icon);// 加載動畫資源文件,創建動畫對象animation = AnimationUtils.loadAnimation(this, R.anim.animator);// 讓音樂圖標圖像控件啟動動畫ivMusicIcon.startAnimation(animation);// 給動畫對象設置監聽器animation.setAnimationListener(new Animation.AnimationListener() {@Overridepublic void onAnimationStart(Animation animation) {}@Overridepublic void onAnimationEnd(Animation animation) {// 啟動主界面startActivity(new Intent(SplashScreenActivity.this, MainActivity.class));// 關閉啟動界面finish();}@Overridepublic void onAnimationRepeat(Animation animation) {}});}
}
在app子包里面創建音樂播放器應用程序類 - MusicPlayerApplication
package com.zjs.ms_music_player_v01.service;import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.media.MediaPlayer;
import android.os.IBinder;import com.zjs.ms_music_player_v01.R;
import com.zjs.ms_music_player_v01.app.AppConstants;
import com.zjs.ms_music_player_v01.app.MusicPlayerApplication;
import com.zjs.ms_music_player_v01.entity.Music;import java.io.IOException;
import java.util.List;
import java.util.Random;/*** 音樂服務類*/public class MusicPlayService extends Service implements AppConstants {/*** 媒體播放器*/private MediaPlayer mp;/*** 音樂列表(數據源)*/private List<Music> musicList;/*** 音樂文件名*/private String musicName;/*** 更新音樂播放進度的線程*/private Thread thread;/*** 線程循環控制變量*/private boolean isRunning;/*** 音樂播放器應用程序*/private MusicPlayerApplication app;/*** 音樂廣播接收器*/private MusicReceiver receiver;@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic void onCreate() {super.onCreate();// 獲取獲得音樂播放器應用程序對象app = (MusicPlayerApplication) getApplication();// 獲取音樂列表(數據源)musicList = app.getMusicList();// 創建媒體播放器mp = new MediaPlayer();// 給媒體播放器起注冊完成監聽器mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {@Overridepublic void onCompletion(MediaPlayer mp) {// 切換到下一首音樂nextMusic();}});// 設置線程循環控制變量為真isRunning = true;// 創建線程更新播放進度thread = new Thread(new Runnable() {@Overridepublic void run() {while (isRunning) {// 判斷音樂是否在播放if (mp.isPlaying()) {// 設置音樂當前播放位置app.setCurrentPosition(mp.getCurrentPosition());// 創建意圖Intent intent = new Intent();// 設置廣播頻道:更新播放進度intent.setAction(INTENT_ACTION_UPDATE_PROGRESS);// 讓意圖攜帶播放時長intent.putExtra(DURATION, mp.getDuration());// 讓意圖攜帶控制圖標(暫停圖標)intent.putExtra(CONTROL_ICON, R.drawable.pause_button_selector);// 按意圖發送廣播sendBroadcast(intent);}// 讓線程睡眠500毫秒try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}}}});// 啟動線程thread.start();// 創建音樂廣播接收者receiver = new MusicReceiver();// 創建意圖過濾器IntentFilter filter = new IntentFilter();// 通過意圖過濾器添加廣播頻道filter.addAction(INTENT_ACTION_PLAY_OR_PAUSE);filter.addAction(INTENT_ACTION_PLAY);filter.addAction(INTENT_ACTION_PREVIOUS);filter.addAction(INTENT_ACTION_NEXT);filter.addAction(INTENT_ACTION_USER_CHANGE_PROGRESS);// 注冊廣播接收者registerReceiver(receiver, filter);}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {// 返回非粘性服務return Service.START_NOT_STICKY;}/*** 上一首音樂*/private void previousMusic() {// 更新音樂索引if (app.getCurrentMusicIndex() > 0) {app.setCurrentMusicIndex(app.getCurrentMusicIndex() - 1);} else {app.setCurrentMusicIndex(musicList.size() - 1);}// 當前播放位置歸零app.setCurrentPosition(0);// 調用播放方法play();}/*** 下一首音樂*/private void nextMusic() {// 根據播放模式來更新音樂索引switch (app.getPlayMode()) {// 順序播放模式case PLAY_MODE_ORDER:if (app.getCurrentMusicIndex() < musicList.size() - 1) {app.setCurrentMusicIndex(app.getCurrentMusicIndex() + 1);} else {app.setCurrentMusicIndex(0);}break;// 隨機播放模式case PLAY_MODE_RANDOM:// 隨機設置索引app.setCurrentMusicIndex(new Random().nextInt(app.getMusicList().size()));break;// 單曲循環模式case PLAY_MODE_LOOP:// 音樂索引保持不變break;}// 當前播放位置歸零app.setCurrentPosition(0);// 調用播放方法play();}/*** 播放方法*/private void play() {try {// 重置播放器mp.reset();// 獲取當前播放的音樂名musicName = musicList.get(app.getCurrentMusicIndex()).getData();// 設置播放源mp.setDataSource(musicName);// 緩沖播放源,加載到內存mp.prepare();// 定位到暫停時的播放位置mp.seekTo(app.getCurrentPosition());// 啟動音樂的播放mp.start();} catch (IOException e) {e.printStackTrace();}}/*** 暫停方法*/private void pause() {// 暫停播放mp.pause();// 保存當前音樂播放位置app.setCurrentPosition(mp.getCurrentPosition());/* 發送廣播給前臺MainActivity,更改圖標、更改播放進度 */// 創建意圖Intent intent = new Intent();// 設置廣播頻道:更新播放進度intent.setAction(INTENT_ACTION_UPDATE_PROGRESS);// 讓意圖攜帶播放時長intent.putExtra(DURATION, mp.getDuration());// 讓意圖攜帶控制圖標(播放圖標)intent.putExtra(CONTROL_ICON, R.drawable.play_button_selector);// 按意圖發送廣播sendBroadcast(intent);}/*** 音樂廣播接收者*/private class MusicReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {// 獲取意圖動作(廣播頻道)String action = intent.getAction();// 當廣播頻道非空時進行判斷if (action != null) {// 根據不同廣播頻道執行不同的操作switch (action) {case INTENT_ACTION_PLAY:// 播放進度值歸零app.setCurrentPosition(0);// 調用播放方法play();break;case INTENT_ACTION_PLAY_OR_PAUSE:// 判斷音樂是否在播放if (mp.isPlaying()) {pause();} else {play();}break;case INTENT_ACTION_PREVIOUS:// 切換到上一首音樂previousMusic();break;case INTENT_ACTION_NEXT:// 切換到下一首音樂nextMusic();break;case INTENT_ACTION_USER_CHANGE_PROGRESS:// 根據拖拽條的進度值計算當前播放位置app.setCurrentPosition(app.getProgressChangedByUser() * mp.getDuration() / 100);// 根據音樂當前播放位置開始播放音樂play();break;}}}}/*** 銷毀回調方法*/@Overridepublic void onDestroy() {super.onDestroy();// 釋放媒體播放器if (mp != null) {mp.release();mp = null;}// 注銷廣播接收者unregisterReceiver(receiver);// 設置線程循環控制變量isRunning = false;// 銷毀子線程thread = null;}
}
在entity子包里面創建音樂實體類 - Music
package com.zjs.ms_music_player_v01.entity;/*** 音樂實體類*/public class Music {/*** 標識符*/private long id;/*** 音樂數據(完整文件名)*/private String data;/*** 音樂顯示名稱*/private String displayName;/*** 音樂標題*/private String title;/*** 音樂播放時長*/private int duration;/*** 音樂圖標鍵值*/private String albumKey;/*** 演唱者或演奏者*/private String artist;public long getId() {return id;}public void setId(long id) {this.id = id;}public String getData() {return data;}public void setData(String data) {this.data = data;}public String getDisplayName() {return displayName;}public void setDisplayName(String displayName) {this.displayName = displayName;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public int getDuration() {return duration;}public void setDuration(int duration) {this.duration = duration;}public String getAlbumKey() {return albumKey;}public void setAlbumKey(String albumKey) {this.albumKey = albumKey;}public String getArtist() {return artist;}public void setArtist(String artist) {this.artist = artist;}@Overridepublic String toString() {return "Music{" +"id=" + id +", data='" + data + '\'' +", displayName='" + displayName + '\'' +", title='" + title + '\'' +", duration=" + duration +", albumKey='" + albumKey + '\'' +", artist='" + artist + '\'' +'}';}
}
編寫音樂數據訪問對象musicdao.java
package com.zjs.ms_music_player_v01.dal;import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.provider.MediaStore;import com.zjs.ms_music_player_v01.entity.Music;import java.util.ArrayList;
import java.util.List;/*** 音樂數據訪問對象*/public class MusicDao {/*** 上下文環境*/private Context context;/*** 構造方法:指定使用該MusicDao的上下文環境** @param context*/public MusicDao(Context context) {this.context = context;}/*** 獲取音樂數據列表** @return*/public List<Music> getMusicList() {/* 1. 訪問媒體庫,獲取音頻游標對象 */// 獲取內容解析者,對媒體庫這個內容提供者進行操作ContentResolver resolver = context.getContentResolver();// 實現查詢(篩選播放時長不低于1分鐘的音頻),獲取游標對象,作為數據源Cursor cursor = resolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, // 參數1:查詢目標new String[]{MediaStore.Audio.Media._ID,MediaStore.Audio.Media.DATA,MediaStore.Audio.Media.DISPLAY_NAME,MediaStore.Audio.Media.TITLE,MediaStore.Audio.Media.DURATION,MediaStore.Audio.Media.ALBUM_KEY,MediaStore.Audio.Media.ARTIST}, // 參數2:查詢字段列表MediaStore.Audio.Media.DURATION + " >= ?", // 參數3:查詢條件,包含占位符new String[]{"60000"}, // 參數4:占位符對應的值列表null // 參數:排序字段);/* 2. 將游標對象轉換成音樂列表 */List<Music> musicList = null;if (cursor.getCount() > 0) {musicList = new ArrayList<>();while (cursor.moveToNext()) {// 實例化音樂對象Music music = new Music();// 設置音樂對象屬性music.setId(cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media._ID)));music.setData(cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA)));music.setDisplayName(cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DISPLAY_NAME)));music.setTitle(cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE)));music.setDuration(cursor.getInt(cursor.getColumnIndex(MediaStore.Audio.Media.DURATION)));music.setAlbumKey(cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_KEY)));music.setArtist(cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST)));// 將音樂對象添加到音樂列表musicList.add(music);}}// 關閉游標if (cursor != null && !cursor.isClosed()) {cursor.close();}// 返回音樂列表return musicList;}
}
編寫音樂業務類musicbiz.java
package com.zjs.ms_music_player_v01.bll;import android.content.Context;import com.zjs.ms_music_player_v01.dal.MusicDao;
import com.zjs.ms_music_player_v01.entity.Music;import java.util.List;/*** 音樂業務類*/public class MusicBiz {/*** 上下文環境*/private Context context;public MusicBiz(Context context) {this.context = context;}/*** 獲取音樂列表** @return*/public List<Music> getMusicList() {return new MusicDao(context).getMusicList();}
}
編寫音樂播放器應用程序類musicplayerapplication.java
package com.zjs.ms_music_player_v01.app;import android.app.Application;
import android.content.SharedPreferences;import com.zjs.ms_music_player_v01.bll.MusicBiz;
import com.zjs.ms_music_player_v01.entity.Music;import java.text.SimpleDateFormat;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;/*** 音樂播放器應用程序類*/public class MusicPlayerApplication extends Application implements AppConstants{/*** 簡單日期格式*/private SimpleDateFormat sdf;/*** 音樂列表(播放數據源)*/private List<Music> musicList;/*** 當前音樂索引*/private int currentMusicIndex;/*** 音樂當前播放位置*/private int currentPosition;/*** 播放模式*/private int playMode;/*** 用戶修改的播放進度*/private int progressChangedByUser;@Overridepublic void onCreate() {super.onCreate();// 實例化簡單日期對象sdf = new SimpleDateFormat("mm:ss");// 獲得音樂列表(數據源)musicList = new MusicBiz(this).getMusicList();// 讀取排序設置SharedPreferences sp = getSharedPreferences(USER_CONFIG, MODE_PRIVATE);String orderBy = sp.getString("order-by", "default");if (orderBy.equals("default")) { // 默認排序Collections.sort(musicList, new Comparator<Music>() {@Overridepublic int compare(Music lhs, Music rhs) {return (int) (lhs.getId() - rhs.getId());}});} else if (orderBy.equals("title")) { // 按標題排序Collections.sort(musicList, new Comparator<Music>() {@Overridepublic int compare(Music lhs, Music rhs) {return lhs.getTitle().compareTo(rhs.getTitle());}});} else if (orderBy.equals("duration")) { // 按音樂時長排序Collections.sort(musicList, new Comparator<Music>() {@Overridepublic int compare(Music lhs, Music rhs) {return lhs.getDuration() - rhs.getDuration();}});}}public int getCurrentMusicIndex() {return currentMusicIndex;}public void setCurrentMusicIndex(int currentMusicIndex) {this.currentMusicIndex = currentMusicIndex;}public int getCurrentPosition() {return currentPosition;}public void setCurrentPosition(int currentPosition) {this.currentPosition = currentPosition;}public int getPlayMode() {return playMode;}public void setPlayMode(int playMode) {this.playMode = playMode;}public int getProgressChangedByUser() {return progressChangedByUser;}public void setProgressChangedByUser(int progressChangedByUser) {this.progressChangedByUser = progressChangedByUser;}/*** 獲取格式化時間** @param time 單位是毫秒* @return mm:ss格式的時間*/public String getFormatTime(int time) {return sdf.format(time);}/*** 獲取音樂列表** @return*/public List<Music> getMusicList() {// 返回音樂里列表return musicList;}
}
在app子包里面創建常見應用程序常量接口 - AppConstants
package com.zjs.ms_music_player_v01.app;/*** 應用程序常量接口*/public interface AppConstants {/*** 應用程序標記*/String TAG = "net.hw.ms_music_player";/*** 廣播頻道常量:播放上一首*/String INTENT_ACTION_PREVIOUS = TAG + ".intent.action.PREVIOUS";/*** 廣播頻道常量:播放下一首*/String INTENT_ACTION_NEXT = TAG + ".intent.action.NEXT";/*** 廣播頻道常量:播放或暫停*/String INTENT_ACTION_PLAY_OR_PAUSE = TAG + ".intent.action.PLAY_OR_PAUSE";/*** 廣播頻道常量:播放*/String INTENT_ACTION_PLAY = TAG + ".intent.action.PLAY";/*** 廣播頻道常量:更新播放進度*/String INTENT_ACTION_UPDATE_PROGRESS = TAG + ".intent.action.UPDATE_PROGRESS";/*** 廣播頻道常量:用戶改變播放進度*/String INTENT_ACTION_USER_CHANGE_PROGRESS = TAG + ".intent.action.USER_CHANGE_PROGRESS";/*** 控制圖標常量:播放或暫停*/String CONTROL_ICON = "control_icon";/*** 播放時長常量*/String DURATION = "duration";/*** 播放模式:順序播放*/int PLAY_MODE_ORDER = 0;/*** 播放模式:隨機播放*/int PLAY_MODE_RANDOM = 1;/*** 播放模式:單曲循環*/int PLAY_MODE_LOOP = 2;/*** 用戶配置文件名*/String USER_CONFIG = "user-config";
}
編寫項目清單文件
在adapter子包里面創建音樂適配器 - MusicAdapter
package com.zjs.ms_music_player_v01.adapter;import android.app.Activity;
import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.provider.MediaStore;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;import com.zjs.ms_music_player_v01.R;
import com.zjs.ms_music_player_v01.app.MusicPlayerApplication;
import com.zjs.ms_music_player_v01.entity.Music;import java.util.ArrayList;
import java.util.List;/*** 音樂適配器** Created by howard on 2018/1/22.*/public class MusicAdapter extends BaseAdapter {/*** 上下文環境*/private Context context;/*** 音樂列表*/private List<Music> musicList;/*** 音樂播放器應用程序*/private MusicPlayerApplication app;/*** 構造方法** @param context* @param musicList*/public MusicAdapter(Context context, List<Music> musicList) {this.context = context;if (musicList == null) {musicList = new ArrayList<>();}this.musicList = musicList;// 獲取應用程序對象app = (MusicPlayerApplication) ((Activity)context).getApplication();}/*** 獲取列表項個數** @return*/@Overridepublic int getCount() {return musicList.size();}/*** 獲取列表項對象** @param position* @return*/@Overridepublic Object getItem(int position) {return musicList.get(position);}/*** 獲取列表項標識符** @param position* @return*/@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {// 聲明視圖容器ViewHolder holder;// 判斷轉換視圖是否為空if (convertView == null) {// 通過布局填充器將列表項模板映射成轉換視圖convertView = LayoutInflater.from(context).inflate(R.layout.music_list_item, null);// 實例化視圖容器holder = new ViewHolder();// 獲取視圖容器里控件實例holder.ivImage = convertView.findViewById(R.id.iv_image);holder.tvArtist = convertView.findViewById(R.id.tv_artist);holder.tvDisplayName = convertView.findViewById(R.id.tv_display_name);holder.tvDuration = convertView.findViewById(R.id.tv_duration);// 將視圖容器附加到轉換視圖convertView.setTag(holder);} else {// 從轉換視圖里獲取視圖容器holder = (ViewHolder) convertView.getTag();}// 獲取音樂數據final Music music = musicList.get(position);/* 設置視圖容器里控件屬性 */// 設置專輯封面圖片Bitmap cover = getAlbumCover(music.getAlbumKey());if (cover != null) {holder.ivImage.setImageBitmap(cover);} else {holder.ivImage.setImageResource(R.drawable.music);}// 設置演唱者holder.tvArtist.setText(music.getArtist());// 設置顯示名holder.tvDisplayName.setText(music.getDisplayName().substring(0, music.getDisplayName().lastIndexOf(".")));// 設置播放時長holder.tvDuration.setText(app.getFormatTime(music.getDuration()));// 返回轉換視圖return convertView;}/*** 視圖容器*/private static class ViewHolder {ImageView ivImage; // 音樂專輯圖片TextView tvArtist; // 演唱者標簽TextView tvDuration; // 音樂時長標簽TextView tvDisplayName; // 音樂顯示名標簽}/*** 按專輯鍵獲取專輯圖片** @param albumKey* @return*/private Bitmap getAlbumCover(String albumKey) {// 聲明位圖對象Bitmap bitmap = null;// 獲取內容解析者ContentResolver resolver = context.getContentResolver();// 按albumKey查詢Cursor cursor = resolver.query(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI, // 查詢目標new String[] { MediaStore.Audio.Albums.ALBUM_ART }, // 投影字段MediaStore.Audio.Albums.ALBUM_KEY + " = ?", // 篩選條件new String[] { albumKey }, // 條件參數null // 排序字段);// 移到第一條記錄if (cursor.moveToFirst()) {// 獲取專輯封面圖片路徑String albumPath = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Albums.ALBUM_ART));// 解析生成位圖對象bitmap = BitmapFactory.decodeFile(albumPath);}// 返回位圖對象return bitmap;}
}
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀
總結
以上是生活随笔為你收集整理的补14的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。