1. 程式人生 > 其它 >Android專案實踐(四)——音樂播放器APP

Android專案實踐(四)——音樂播放器APP

技術標籤:Androidandroidjava

關於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)的許可權,

(4)"android.permission.INTERNET"獲取程式聯網的許可權。

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