- 簡介
在寫一個藍(lán)牙的項目里邊,需要實現(xiàn)一個功能椭坚,按外設(shè)的按鈕實現(xiàn)音樂的播放暫停等功能,以及后臺播放搏色。搜索資料了解到
無論是iPod善茎、iTouch、iPhone還是iPad都可以在iTunes購買音樂或添加本地音樂到音樂庫中同步到你的iOS設(shè)備继榆。在MediaPlayer.frameowork中有一個MPMusicPlayerController用于播放音樂庫中的音樂巾表。
關(guān)于MPMusicPlayerController有兩種播放器:applicationMusicPlayer和systemMusicPlayer,前者在應(yīng)用退出后音樂播放會自動停止略吨,后者在應(yīng)用停止后不會退出播放狀態(tài)集币。但是通過操作,我發(fā)現(xiàn)使用applicationMusicPlayer的時候翠忠,退出后臺音樂停止鞠苟,但是如果打開音樂播放的后臺,并且開啟后臺任務(wù)秽之,那么在退出后臺当娱,音樂停止,可以通過按設(shè)備按鈕再次操作音樂播放考榨。systemMusicPlayer在退出到后臺的情況下跨细,只需要把音樂后臺打開,音樂播放就不會終止河质,但是這個類在8.0之前的系統(tǒng)使用時候冀惭,會報錯,只能是8.0之后的系統(tǒng)使用掀鹅。
MPMusicPlayerController加載音樂不同于前面的AVAudioPlayer是通過一個文件路徑來加載散休,而是需要一個播放隊列。在MPMusicPlayerController中提供了兩個方法來加載播放隊列:- (void)setQueueWithQuery:(MPMediaQuery *)query和- (void)setQueueWithItemCollection:(MPMediaItemCollection *)itemCollection乐尊,正是由于它的播放音頻來源是一個隊列戚丸,因此MPMusicPlayerController支持上一曲、下一曲等操作扔嵌。
以下是實現(xiàn)代碼限府,導(dǎo)入框架
#import <MediaPlayer/MediaPlayer.h>
初始化音樂播放器,在獲取本地音樂庫的文件的時候痢缎,可以獲取音樂的名字胁勺、時長等。
- (void)music{
NSLog(@"systemVersion==%f",[[UIDevice currentDevice] systemVersion].floatValue);
if ([[UIDevice currentDevice] systemVersion].floatValue >= 8.0) {
self.musicPlayerController = [MPMusicPlayerController systemMusicPlayer];//初始化系統(tǒng)音樂播放器
}else{
self.musicPlayerController = [MPMusicPlayerController applicationMusicPlayer];
}
self.musicPlaybackState = self.musicPlayerController.playbackState;
if (![self isPlayingItem] ) {
[self getMusicListFromMusicLibrary];
}
isPlayMusic = YES;
}
// 判斷有沒有正在播放的媒體項目
- (BOOL)isPlayingItem {
if ([self.musicPlayerController indexOfNowPlayingItem] == NSNotFound) {
return NO;
} else {
return YES;
}
}
- (MPMediaItemCollection *)getMusicListFromMusicLibrary {
self.query = [MPMediaQuery songsQuery];
// 申明一個Collection便于下面給MusicPlayer賦值
MPMediaItemCollection *mediaItemCollection;
if (self.query.items.count == 0) {
return 0;
} else {
//獲取本地音樂庫文件
NSMutableArray *musicArray= [NSMutableArray array];
for(MPMediaItem *item in self.query.items) {
[musicArray addObject:item];
NSLog(@"%@",item.title);
}
// 將音樂信息賦值給musicPlayer
mediaItemCollection = [[MPMediaItemCollection alloc] initWithItems:[musicArray copy]];
[self.musicPlayerController setQueueWithItemCollection:mediaItemCollection];
}
return mediaItemCollection;
}
幾種音樂播放器的狀態(tài):
MPMusicPlaybackStateStopped,
MPMusicPlaybackStatePlaying,
MPMusicPlaybackStatePaused,
MPMusicPlaybackStateInterrupted,
MPMusicPlaybackStateSeekingForward,
MPMusicPlaybackStateSeekingBackward
暫臀或者播放音樂的代碼實現(xiàn):
- (void)musicPlay{
[self music];
NSLog(@"%lu",(unsigned long)self.musicPlayerController.indexOfNowPlayingItem);
if (self.musicPlaybackState == MPMusicPlaybackStatePlaying) {
[self.musicPlayerController pause];//暫停
self.musicPlaybackState = MPMusicPlaybackStatePaused;
}else if (self.musicPlaybackState == MPMusicPlaybackStateStopped || self.musicPlaybackState == MPMusicPlaybackStatePaused || self.musicPlaybackState == MPMusicPlaybackStateInterrupted) {
[self.musicPlayerController play]; //播放
self.musicPlaybackState = MPMusicPlaybackStatePlaying;
}
}
實現(xiàn)上一曲的代碼:
- (void)musicBack{
if (self.musicPlaybackState != MPMusicPlaybackStatePlaying) {
[self music];
}
[self.musicPlayerController play];
[self.musicPlayerController skipToPreviousItem];
self.musicPlaybackState = MPMusicPlaybackStatePlaying;
}
實現(xiàn)下一曲的代碼:
- (void)musicNext{
if (self.musicPlaybackState != MPMusicPlaybackStatePlaying) {
[self music];
}
[self.musicPlayerController play];
isPause = NO;
[self.musicPlayerController skipToNextItem];
self.musicPlaybackState = MPMusicPlaybackStatePlaying;
}
在使用systemMusicPlayer播放器的時候?qū)崿F(xiàn)后臺播放姻几,如下圖所示,音樂播放后臺打開就行了:
在使用applicationMusicPlayer势告,想要實現(xiàn)后臺播放蛇捌,首先要把藍(lán)牙后臺打開,然后在appdelegate里添加后臺支持接收遠(yuǎn)程控制事件咱台,代碼如下:
- (void)applicationWillResignActive:(UIApplication *)application {
//后臺支持接收遠(yuǎn)程控制事件
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
//核心代碼
AVAudioSession *session = [AVAudioSession sharedInstance];
[session setCategory:AVAudioSessionCategoryPlayback error:nil]; //后臺播放
[session setActive:YES error:nil];
}
要想了解更多關(guān)于MPMusicPlayerController播放器的屬性络拌,可以參考地址:http://www.cnblogs.com/kenshincui/p/4186022.html
http://blog.csdn.net/zhonggaorong/article/details/51597483
另外,使用音樂播放器的時候回溺,打開音樂播放后臺春贸,審核的時候可能會被拒,需要錄制關(guān)于實現(xiàn)此功能的視頻發(fā)給蘋果遗遵,就OK了萍恕。