文章目錄
- 一、專案功能要求
- 二、涉及知識點
- 三、實作思路
- 1、基于存盤卡音樂播放器V0.1
- 2、基于存盤卡音樂播放器V0.2
- 3、基于存盤卡音樂播放器V0.3
- 4、基于存盤卡音樂播放器V0.4
- 5、基于存盤卡音樂播放器V0.5
- 6、基于存盤卡音樂播放器V0.6
- 四、專案素材下載
- 1、音頻素材下載
- 2、圖片素材下載
- 五、基于存盤卡音樂播放器V0.1
- (一)功能要求
- (二)運行效果
- (三)涉及知識點
- (四)實作步驟
- 1、創建安卓應用【SDCardMusicPlayerV0.1】
- 2、將MP3音頻檔案放到存盤卡指定位置
- 3、將圖片素材拷貝到Drawable目錄
- 4、創建按鈕背景圖片選擇器
- (1)播放按鈕背景圖片選擇器 - play_button_selector.xml
- (2)暫停按鈕背景圖片選擇器 - pause_button_selector.xml
- 5、主布局資源檔案activity_main.xml
- 6、在專案清單檔案里授權讀外置存盤卡
- 7、主界面類 - MainActivity
- (1)宣告變數
- (2)通過資源識別符號獲取控制元件實體
- (3)檢查外置存盤卡讀寫權限
- (4)獲取音樂檔案存放目錄
- (5)獲取音樂檔案并設定音樂名標簽
- (6)啟動應用,查看效果
- (7)創建媒體播放器,并注冊完成監聽器
- (8)創建播放方法 - play()
- (9)撰寫暫停方法 - pause()
- (10)撰寫播放|暫停按鈕單擊事件處理方法
- (11)撰寫銷毀回呼方法,釋放資源
- (12)查看主界面完整源代碼
- 8、啟動應用,查看效果
一、專案功能要求
- 資料源來自掃描存盤卡MP3音樂獲得的串列
- 播放串列顯示音樂檔案(僅僅顯示音樂名,沒有擴展名)
- 利用自定義Service類來實作音樂的播放與暫停以及進度的更新
- 界面類(Activity)與服務類(Service)之間通過廣播接收者進行通信
- 主界面包含的要素
– 播放串列
– 可設定播放模式
– 顯示當前音樂名
– 拖拽條顯示和設定播放進度
– 顯示播放進度值和播放時長
– 包含上一首按鈕、下一首按鈕、播放|暫停按鈕 - 啟動界面 - 包含軟體名稱、版本號、作者等資訊
二、涉及知識點
- 安卓核心組件:活動(Activity)、服務(Service)、廣播接收者(BroadcastReceiver)
- 意圖(Intent),通過意圖激活Activity和Service、發送廣播
- 安卓常用控制元件:按鈕(Button)、標簽(TextView)、進度條(ProgressBar)、拖拽條(SeekBar)、串列控制元件(ListView)、單選按鈕(RadioButton)、媒體播放器(MediaPlayer)、影像視圖(ImageView)
- 繼承基配接器(BaseAdapter)創建自定義配接器
- 陣列串列(ArrayList)
- 補間影片(Tween Animation)
- 執行緒(Thread)
三、實作思路
分為六個版本,逐步增加功能,直到最后實作全部功能,
1、基于存盤卡音樂播放器V0.1
- 功能:播放存盤卡指定目錄里某一首音樂
2、基于存盤卡音樂播放器V0.2
- 功能:播放存盤卡指定目錄里某一首音樂,顯示播放進度與音樂時長
3、基于存盤卡音樂播放器V0.3
- 功能:串列顯示存盤卡指定目錄里全部音樂,顯示播放進度與音樂時長
4、基于存盤卡音樂播放器V0.4
- 功能:串列顯示存盤卡全部音樂,顯示播放進度與音樂時長
5、基于存盤卡音樂播放器V0.5
- 功能:串列顯示存盤卡全部音樂,顯示播放進度與音樂時長,播放任務交給音樂服務類來完成,利用廣播接收器實作界面類與服務類之間的通信,
6、基于存盤卡音樂播放器V0.6
- 功能:添加啟影片面,添加音樂播放模式功能:順序播放、隨機播放、單首回圈,將進度條改成拖拽條,用戶通過拖拽可自行設定音樂播放進度值,串列顯示存盤卡全部音樂,顯示播放進度與音樂時長,播放任務交給音樂服務類來完成,利用廣播接收器實作界面類與服務類之間的通信,
四、專案素材下載
1、音頻素材下載
鏈接: https://pan.baidu.com/s/1vfW-HNSpgbhgtnmvMNa-YA
提取碼: 3qav
2、圖片素材下載
鏈接: https://pan.baidu.com/s/1BtQRHNmrFUj6trqGFx_ULA
提取碼: 887h
五、基于存盤卡音樂播放器V0.1
(一)功能要求
- 播放存盤卡上一首音樂
- 播放|暫停按鈕,可切換
- 顯示要播放的音樂名
- 要求視窗有背景圖片
(二)運行效果

(三)涉及知識點
- 線性布局(LinearLayout)
- 標簽(TextView)
- 按鈕(Button)
- 媒體播放器(MediaPlayer)
(1)初始化
(2)設定播放源
(3)判斷是否播放
(4)獲取播放當前位置
(5)注冊播放完成監聽器 - 讀取存盤卡指定目錄里的檔案
- 控制元件背景選擇器
(四)實作步驟
1、創建安卓應用【SDCardMusicPlayerV0.1】


2、將MP3音頻檔案放到存盤卡指定位置
- 啟動DDMS

- 找到Music目錄

- 從電腦上添加MP3音頻檔案到Music目錄


3、將圖片素材拷貝到Drawable目錄

4、創建按鈕背景圖片選擇器
(1)播放按鈕背景圖片選擇器 - play_button_selector.xml

<?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>
(2)暫停按鈕背景圖片選擇器 - 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>
5、主布局資源檔案activity_main.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:padding="20dp"
tools:context=".MainActivity">
<TextView
android:id="@+id/tvMusicName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="25sp"
android:textColor="#0000ff"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center">
<Button
android:id="@+id/btnPlayOrPause"
android:layout_width="60dp"
android:layout_height="50dp"
android:onClick="doPlayOrPause"
android:background="@drawable/play_button_selector"/>
</LinearLayout>
</LinearLayout>
6、在專案清單檔案里授權讀外置存盤卡

7、主界面類 - MainActivity

(1)宣告變數

(2)通過資源識別符號獲取控制元件實體

(3)檢查外置存盤卡讀寫權限

(4)獲取音樂檔案存放目錄
- Environment類包含目錄常量

- 其中,Environment.DIRECTORY_MUSIC對應的就是外置存盤卡上的/storage/emulated/0/Music目錄

(5)獲取音樂檔案并設定音樂名標簽

(6)啟動應用,查看效果


(7)創建媒體播放器,并注冊完成監聽器

(8)創建播放方法 - play()

(9)撰寫暫停方法 - pause()

(10)撰寫播放|暫停按鈕單擊事件處理方法

(11)撰寫銷毀回呼方法,釋放資源

(12)查看主界面完整源代碼
package net.hw.sdcard_musicplayer_v01;
import android.Manifest;
import android.content.pm.PackageManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import java.io.File;
import java.io.IOException;
/**
* 功能:基于存盤卡音樂播放器V0.1
* 作者:華衛
* 日期:2020年12月31日
*/
public class MainActivity extends AppCompatActivity {
private MediaPlayer mp; // 媒體播放器
private File musicDir; // 音樂存放目錄
private String musicName; // 音樂檔案名
private TextView tvMusicName; // 音樂名標簽
private Button btnPlayOrPause; // 播放|暫停按鈕
private int currentPosition; // 音樂當前播放位置
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 利用布局資源檔案設定用戶界面
setContentView(R.layout.activity_main);
// 通過資源識別符號獲取控制元件實體
tvMusicName = findViewById(R.id.tvMusicName);
btnPlayOrPause = findViewById(R.id.btnPlayOrPause);
// 定義存盤讀寫權限陣列
String[] PERMISSIONS_STORAGE = {
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
};
// 檢查是否有讀權限
int permission = ActivityCompat.checkSelfPermission(this, PERMISSIONS_STORAGE[0]);
// 如果沒有授權,那么就請求讀權限
if (permission != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, PERMISSIONS_STORAGE, 0);
}
// 獲取音樂檔案存放目錄
musicDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC);
try {
// 獲取音樂檔案存放目錄里的第一首音樂檔案名
musicName = musicDir.list()[0];
// 設定音樂名標簽,要去掉擴展名
tvMusicName.setText("音樂名:" + musicName.substring(0, musicName.lastIndexOf(".")));
} catch (Exception e) {
Toast.makeText(this, "存盤卡Music目錄里沒有音樂檔案!", Toast.LENGTH_SHORT).show();
}
// 實體化媒體播放器
mp = new MediaPlayer();
// 給媒體播放器注冊完成監聽器
mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
// 提示用戶當前音樂播放完畢
Toast.makeText(MainActivity.this, "當前音樂播放完畢!", Toast.LENGTH_SHORT).show();
// 當前播放位置清零
currentPosition = 0;
// 按鈕圖示由【暫停】圖示切換到【播放】圖示
btnPlayOrPause.setBackgroundResource(R.drawable.play_button_selector);
}
});
}
/**
* 播放方法
*/
private void play() throws IOException {
// 重置媒體播放器
mp.reset();
// 設定播放源(完整音樂名 = 音樂目錄 + 音樂名)
mp.setDataSource(musicDir.getAbsolutePath() + "/" + musicName);
// 緩沖播放源(從存盤卡加載到記憶體)
mp.prepare();
// 定位到暫停時的播放位置
mp.seekTo(currentPosition);
// 啟動音樂的播放
mp.start();
// 按鈕圖示由【播放】圖示切換到【暫停】圖示
btnPlayOrPause.setBackgroundResource(R.drawable.pause_button_selector);
}
/**
* 暫停方法
*/
private void pause() {
// 暫停播放
mp.pause();
// 保存音樂播放的當前位置
currentPosition = mp.getCurrentPosition();
// 按鈕圖示由【暫停】圖示切換到【播放】圖示
btnPlayOrPause.setBackgroundResource(R.drawable.play_button_selector);
}
/**
* 播放|暫停按鈕單擊事件處理方法
*
* @param view
*/
public void doPlayOrPause(View view) throws IOException {
// 判斷音樂是否在播放
if (mp.isPlaying()) {
// 暫停音樂
pause();
} else {
// 播放音樂
play();
}
}
/**
* 銷毀回呼方法,釋放資源
*/
@Override
protected void onDestroy() {
super.onDestroy();
// 判斷音樂是否在播放
if (mp.isPlaying()) {
mp.stop();
}
// 釋放媒體播放器
mp.release();
// 銷毀媒體播放器
mp = null;
}
}
8、啟動應用,查看效果

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/243336.html
標籤:其他
