Android專案實踐(四)——音樂播放器APP
關於Android製作音樂播放器APP的幾點建議
1.許可權獲得
1.在AndroidManifest.xml檔案中,做如下宣告:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android: name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.INTERNET"/>
其中:
(1)"android.permission.READ_EXTERNAL_STORAGE"獲取讀取外部儲存的許可權,
(2)"android.permission.WRITE_EXTERNAL_STORAGE"獲取寫入外部儲存的許可權
(3)"android.permission.ACCESS_FINE_LOCATION"獲取程式訪問精良位置(如GPS)的許可權,
2.歌曲存放
1.對於本地歌曲,需要存放在SD卡下的Music目錄下。找到Android Studio右側的Device File Explorer(需要保證Android模擬機為開啟狀態),具體路徑為:mnt–>sdcard–>Music(其餘路徑也可以,這個比較合適而已),右鍵Music目錄,選擇Upload上傳.mp3檔案;
2. 對於下載歌曲,下載完成後同樣可以放在這個位置。首先定義路徑如下:
public static final File PATH = Environment. getExternalStoragePublicDirectory("/Music");
此方法獲得了到Music一級的目錄,在之後下載歌曲的儲存用到此地址,
File file = new File(PATH, fileName + ".mp3");
新建一個以.mp3為名字的檔案,這個檔案是在Music/下。當我們下載成功一首歌曲時,獲取歌曲名字為fileName.mp3並存儲在此位置,之後經過讀取,可將下載好的歌曲同本地歌曲一起讀取到歌曲列表中。
3.歌曲下載
1.歌曲下載可以申請QQ音樂等API,但需要進行返回的json資料解析,此處不深度分析;
2.對於此APP的音樂下載功能,是通過網址直接下載,歌曲瀏覽及下載網址為:Free Music Archive
但在APP中下載時,我們並不是開啟這個網址進行點選下載,而是通過輸入歌曲名稱進行下載,因此我們需要了解網站下載的地址規律。觀察可以發現一部分歌曲的下載格式為:
"https://freemusicarchive.org/track/" + path +"/download";
其中path為輸入的歌曲名稱經轉換後的格式(舉例:輸入的歌曲名稱為"Love is Here",轉化後的path=“Love-is-Here”),具體轉換如下,當接收到輸入框輸入的歌曲名稱時:
String pathOld = song.getText().toString();
String pathNew=null;
int index = pathOld.indexOf(" ");
if(index == -1){
pathNew = pathOld;
}else{
String[] x = pathOld.split(" ");
pathNew = x[0];
for(int i=1; i<x.length;i++) {
pathNew = pathNew + "-" + x[i];
}
}
String pathLast = "https://freemusicarchive.org/track/" + pathNew +"/download";
當下載完成,需要儲存到SD卡下的Music目錄時,需要將歌曲名稱提取出來,轉換如下:
final String url = intent.getStringExtra("path");
String str = url.substring(0,url.indexOf("/download"));
fileName=str.substring(str.lastIndexOf("/")+1);
int index = fileName.indexOf("-");
if(index == -1){
fileNameNew = fileName;
}else{
String[] x = fileName.split("-");
fileNameNew = x[0];
for(int i=1; i<x.length; i++){
fileNameNew = fileNameNew + " " + x[i];
}
}
File file = new File(PATH, fileNameNew + ".mp3");
4.服務宣告
1.音樂播放器需要用到服務(Service),比如我的APP寫了2個service:一個用於歌曲的播放、暫停、進度條等功能的實現,命名為MusicService,另一個用於下載歌曲功能的實現,命名為DownMusicService。這兩個service需要在AndroidManifest.xml中進行宣告,才可應用,宣告如下:
<service android:name="com.example.musicplayer.MusicService"
tools:ignore="Instantiatable">
</service>
<service android:name="com.example.musicplayer.DownMusicService">
</service>
其中"com.example.musicPlayer"為自己的包名,及為Service所在的絕對路徑。
5.頁面跳轉
1.由於此APP只有主介面,通過搜尋下載歌曲之後,仍然需要返回到主介面,所以可以通過對“搜尋”按鈕進行點選事件的宣告,點選“搜尋”後跳轉到DownMusicService進行歌曲下載的處理,程式碼如下:
Intent intent = new Intent(MainActivity.this, DownMusicService.class);
intent.putExtra("path",pathLast);
startService(intent);
其中path為下載路徑,通過intent.putExtra函式傳到DownMusicService服務,當歌曲下載完成後,需要返回到主介面,程式碼如下:
Intent intentNew = new Intent(DownMusicService.this, MainActivity.class);
intentNew.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK );
startActivity(intentNew);
通過重啟MianActivity,實現對Music目錄的重新掃描,這樣下載的歌曲便也會顯示在主介面(由於歌曲下載需要一定時間,但從DownMusicService返回到MainActivity的時間較短,有時候返回到主介面新下載的歌曲並不能及時顯示,因此設定一個重新整理按鈕)。重新整理按鈕的點選響應事件如下:
Button refresh = findViewById(R.id.refresh);
refresh.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
Intent intent1 = getIntent();
finish();
startActivity(intent1);
}catch (Exception e){
Log.i("TAG","重新整理失敗!");
}
}
});
6.下載連結
最後,附上音樂播放器APP的github地址,程式碼仍不完善,歡迎借鑑和指正。
MusicPlayer