iOS 藍(lán)牙實現(xiàn)音樂播放

  • 簡介

在寫一個藍(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)后臺播放姻几,如下圖所示,音樂播放后臺打開就行了:

屏幕快照 2016-10-28 11.58.26 AM.png

在使用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了萍恕。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市车要,隨后出現(xiàn)的幾起案子允粤,更是在濱河造成了極大的恐慌,老刑警劉巖翼岁,帶你破解...
    沈念sama閱讀 211,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件类垫,死亡現(xiàn)場離奇詭異,居然都是意外死亡琅坡,警方通過查閱死者的電腦和手機(jī)悉患,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來榆俺,“玉大人售躁,你說我怎么就攤上這事∏聪桑” “怎么了迂求?”我有些...
    開封第一講書人閱讀 157,435評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長晃跺。 經(jīng)常有香客問我揩局,道長,這世上最難降的妖魔是什么掀虎? 我笑而不...
    開封第一講書人閱讀 56,509評論 1 284
  • 正文 為了忘掉前任凌盯,我火速辦了婚禮,結(jié)果婚禮上烹玉,老公的妹妹穿的比我還像新娘驰怎。我一直安慰自己,他們只是感情好二打,可當(dāng)我...
    茶點故事閱讀 65,611評論 6 386
  • 文/花漫 我一把揭開白布县忌。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪症杏。 梳的紋絲不亂的頭發(fā)上装获,一...
    開封第一講書人閱讀 49,837評論 1 290
  • 那天,我揣著相機(jī)與錄音厉颤,去河邊找鬼穴豫。 笑死,一個胖子當(dāng)著我的面吹牛逼友,可吹牛的內(nèi)容都是我干的精肃。 我是一名探鬼主播,決...
    沈念sama閱讀 38,987評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼帜乞,長吁一口氣:“原來是場噩夢啊……” “哼司抱!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起黎烈,我...
    開封第一講書人閱讀 37,730評論 0 267
  • 序言:老撾萬榮一對情侶失蹤状植,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后怨喘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體津畸,經(jīng)...
    沈念sama閱讀 44,194評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,525評論 2 327
  • 正文 我和宋清朗相戀三年必怜,在試婚紗的時候發(fā)現(xiàn)自己被綠了肉拓。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,664評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡梳庆,死狀恐怖暖途,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情膏执,我是刑警寧澤驻售,帶...
    沈念sama閱讀 34,334評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站更米,受9級特大地震影響欺栗,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜征峦,卻給世界環(huán)境...
    茶點故事閱讀 39,944評論 3 313
  • 文/蒙蒙 一迟几、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧栏笆,春花似錦类腮、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽缸逃。三九已至,卻和暖如春厂抽,著一層夾襖步出監(jiān)牢的瞬間察滑,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評論 1 266
  • 我被黑心中介騙來泰國打工修肠, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人户盯。 一個月前我還...
    沈念sama閱讀 46,389評論 2 360
  • 正文 我出身青樓嵌施,卻偏偏與公主長得像,于是被迫代替她去往敵國和親莽鸭。 傳聞我的和親對象是個殘疾皇子吗伤,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,554評論 2 349

推薦閱讀更多精彩內(nèi)容