一、簡介
1. 因?yàn)閰⒖嫉氖荙Q音樂的樣子搭建界面颅夺,
而目前QQ音樂的底部是一個(gè)進(jìn)行音樂播放管理的自定義UITabBar忘衍,
所以我們就不用Storyboard,而是使用純代碼來搭建界面
2. 我首先要做的是播放本地音樂的播放功能铺纽,
而我們播放的音樂來源是來自iPhone自帶的APP--“音樂”中的音樂柬帕。。狡门。
不知道這么說大家懂不懂陷寝,但是跟著我一起做一做就知道我在這里想表達(dá)什么了。
O(∩_∩)O哈哈~
二其馏、獲取本地音樂庫中的音樂
1.首先還是簡單一點(diǎn)凤跑,
先在Storyboard里拖一個(gè)TableViewController作為根視圖,
用來顯示我們從音樂庫中獲取到的音樂名,不需要任何的布局
2.創(chuàng)建一個(gè)繼承自UITableViewController的類叛复,并在該類中import媒體播放框架-MediaPlayer
"#import <MediaPlayer/MediaPlayer.h>"
3.下面我們就來探究一下MPMusicPlayerController
首先MPMusicPlayerController是一個(gè)蘋果官方源生的用于播放本地音樂庫音樂的控制器仔引,
它一共有兩種類型:
(1)applicationMusicPlayer,
官方文檔注釋的意思是:通過applicationMusicPlayer播放的音樂在應(yīng)用退出后將還原用戶的播放狀態(tài)
實(shí)際效果是:用戶退出應(yīng)用界面后,音樂無法后臺(tái)播放褐奥。
(2)systemMusicPlayer咖耘,
官方文檔注釋的意思是:通過systemMusicPlayer播放的音樂將替換用戶當(dāng)前播放音樂的狀態(tài)。
實(shí)際效果是:用戶退出應(yīng)用界面后撬码,音樂可以后臺(tái)播放
并且可以通過蘋果自帶的功能儿倒,在鎖屏模式下切換音樂并控制音樂的播放和暫停。
OK呜笑,下面我們先申明一個(gè)MPMusicPlayerController夫否,命名為musicPlayer
@property (strong,nonatomic) MPMusicPlayerController *musicPlayer;
在這里要說的是,MPMusicPlayerController是一個(gè)單例類叫胁,
我們在viewDidLoad中可以直接通過下面的代碼對(duì)musicPlayer進(jìn)行初始化慷吊,設(shè)置我們需要的播放形式,
在這里我就直接用systemMusicPlayer了
self.musicPlayer = [MPMusicPlayerController systemMusicPlayer];
然后我們開始寫一個(gè)獲取音樂庫中的音樂信息的方法,并返回一個(gè)播放隊(duì)列
"-(MPMediaItemCollection *)getMusicListFromMusicLibrary { }"
在開始之前曹抬,我們還需要知道"音樂"這個(gè)實(shí)體的類名是什么溉瓶,
我們能夠從蘋果開放的API中獲得什么屬性。
在MPMusicPlayerController.h文件中谤民,我們看見了這個(gè)類還關(guān)聯(lián)了三個(gè)類堰酿,
@class MPMediaItem,MPMediaQuery,MPMusicPlayerControllerInternal;
然后我在后面的內(nèi)容中,看到了三個(gè)方法:
/*
這三個(gè)方法都是設(shè)置播放隊(duì)列的函數(shù)张足,只有設(shè)置了触创,我們的播放器才能播放音樂,并可以使用蘋果提供的上一首为牍、下一首等接口 */
// 第一個(gè)方法是播放一首哼绑,參數(shù)就是要播放的音樂對(duì)象;
"- (void)setQueueWithQuery:(MPMediaQuery ***)query;"
// 第二個(gè)方法就是播放獲取到的音樂集(或者數(shù)組的意思);
"-(void)setQueueWithItemCollection:(MPMediaItemCollection ***)itemCollection;"
// 第三個(gè)方法是根據(jù)音樂在商店的ID數(shù)組播放...這個(gè)不是很懂岩馍,暫時(shí)跳過
"- (void)setQueueWithStoreIDs:(NSArray ***)storeIDs;"
因此,我猜測抖韩,要獲取到音樂信息蛀恩,就需要用到MPMediaQuery類,
然后我進(jìn)入到了MPMediaQuery.h文件茂浮,查看是否有接口可供我獲取音樂信息双谆,
然后我看到了一堆實(shí)例方法
這些方式是蘋果向開發(fā)者提供的一些預(yù)先設(shè)置的一個(gè)或多個(gè)查詢條件,
讓開發(fā)者用來獲取到滿足這些條件的音樂信息席揽。
所以不管三七二十一顽馋,我選了songsQuery,
因?yàn)閺淖置嫔侠斫饣闲撸ㄟ^該方法寸谜,我能獲取到?jīng)]有經(jīng)過查詢條件篩選的音樂信息
那么MPMediaItem又是干什么的呢?其實(shí)代碼寫多了,
從字面意思上的了解就是"媒體實(shí)體"的意思属桦,
在該類的頭文件中程帕,有著許許多多的屬性,其中包括了這個(gè)實(shí)體的標(biāo)題地啰,專輯名愁拭,作者等屬性。
了解了這么多亏吝,我們試著寫一下代碼岭埠,如下:
- (MPMediaItemCollection *)getMusicListFromMusicLibrary{
// 申明一個(gè)Collection便于下面給MusicPlayer賦值
MPMediaQuery *mediaQueue = [MPMediaQuery songsQuery];
MPMediaItemCollection *mediaItemCollection;
if (mediaQueue.items.count == 0) {
return 0;
} else {
// 獲取本地音樂庫文件
self.musicArray= [NSMutableArray array];
for(MPMediaItem *item in mediaQueue.items) {
[self.musicArray addObject:item];
// 打印一下,看看能不能顯示音樂名
NSLog(@"%@",item.title);
}
// 將音樂信息賦值給musicPlayer
mediaItemCollection = [[MPMediaItemCollection alloc] initWithItems: [self.musicArray copy]];
[self.musicPlayer setQueueWithItemCollection:mediaItemCollection];
}
return mediaItemCollection;
}
這里需要申明一個(gè)可供全局調(diào)用的可變數(shù)組蔚鸥,名為musicArray惜论,用來存放獲取到的一個(gè)個(gè)音樂信息實(shí)體
其中MPMediaItemCollection也就是我們通過刷選后獲得的實(shí)體集,
這是因?yàn)镸PMusicPlayerController加載音樂需要一個(gè)播放隊(duì)列止喷,
所以才支持開發(fā)者使用上一首馆类,下一首的函數(shù)調(diào)用。
#注意:只有當(dāng)“音樂”里有音樂時(shí)弹谁,我們才能獲取到音樂信息乾巧,所以得使用真機(jī)測試才能看到打印出來的信息。
而我們的音樂信息需要通過鍵值對(duì)進(jìn)行訪問预愤,比如獲歌手名:
MPMediaItem *item;
NSString*musicSinger = [item valueForKey:MPMediaItemPropertyAlbumArtist];
// 具體的Key值請參考MPMediaItem.h中的內(nèi)容
---iPhone自帶的APP---
---APP里的音樂列表---
---打印出來的內(nèi)容---
(SOS:誰能告訴我這些圖片怎么弄小點(diǎn)沟于,讓它們可以并排顯示啊V部怠?跆!~~~)
然后我們就可以將相關(guān)的音樂信息顯示到tableview里了,代碼會(huì)上傳到我的GitHub上供璧,
歡迎大家與我一起探索學(xué)習(xí)存崖,共同成長!