2014-06-16 29 views
1

我在本地iOS音樂應用中遇到了一些問題以獲取當前正在播放的歌曲信息,如(標題,藝術家...)。在原生iOS音樂應用中檢測當前正在播放的歌曲信息

這是確切的問題,我的應用程序使用MPMusicPlayerControlleriPodMusicPlayer此屬性是調用myPlayer。當用戶控制我的應用程序中,我能夠顯示當前歌曲以這種方式播放信息的音樂...

- (void)getTrackDescription { 

    // getting whats currently playing 
    self.nowPlayingItem = [myPlayer nowPlayingItem]; 

    // song title currently playing 
    self.title = [self.nowPlayingItem valueForProperty:MPMediaItemPropertyTitle]; 

    // if title is not fund Unknown will be displayed 
    if (title == (id)[NSNull null] || title.length == 0) { 
     title = @"Unknown"; 
    } 

    // artist currently playing 
    self.artist = [self.nowPlayingItem valueForProperty:MPMediaItemPropertyArtist]; 

    // if artist is not fund Unknown will be displayed 
    if (artist == (id)[NSNull null] || artist.length == 0) { 
     artist = @"Unknown"; 
    } 

    //[self.currentlyPlaying setLineBreakMode:NSLineBreakByWordWrapping]; 

    // displaying current artist and title song playing 
    [self.currentlyPlaying setText:[NSString stringWithFormat:@"%@ - %@", artist, title]]; 
} 

但是,問題就來了,當用戶離開應用程序在後臺或只是使用控制中心更改歌曲。如果用戶繼續使用控制中心或音樂應用程序本身,我的應用程序仍會顯示上一首歌曲信息,並且沒有任何更新。

我試圖解決這個問題這樣...

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    if (self.myPlayer.playbackState == MPMusicPlaybackStatePlaying || self.myPlayer.playbackState == MPMusicPlaybackStateSeekingForward || self.myPlayer.playbackState == MPMusicPlaybackStateSeekingBackward){ 
     // updating track name regardless the user uses app controllers or not 
     [self getTrackDescription]; 
    } 
} 

我甚至嘗試註釋如果條件看,如果我得到了這樣的歌曲信息,但它是同樣的問題。

嗯,我希望有人能幫助我解釋我在做什麼錯..提前

謝謝...!

UPDATE

這是我目前所面對的...我getTrackDescription邏輯是相同的,但簽名改成這- (void)getTrackDescription:(id)notification

- (void)viewWillAppear:(BOOL)animated{ 

    NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; 

    [notificationCenter addObserver:self 
          selector:@selector(getTrackDescription:) 
           name:MPMusicPlayerControllerPlaybackStateDidChangeNotification 
          object:self.myPlayer]; 
    [self.myPlayer beginGeneratingPlaybackNotifications]; 

} 

-(void)viewWillDisappear:(BOOL)animated{ 

    [[NSNotificationCenter defaultCenter] removeObserver:self 
               name:MPMusicPlayerControllerPlaybackStateDidChangeNotification 
               object:self.myPlayer]; 
    [self.myPlayer endGeneratingPlaybackNotifications]; 
} 

回答

3

你會想要做什麼將您的視圖控制器作爲觀察者添加到MPMusicPlayerControllerNowPlayingItemDidChangeNotification通知中,聽起來每當音樂播放器中的音軌更改時都會被調用。不要忘記指定玩家何時應該使用以下方法開始/結束生成這些通知。

[[MPMusicPlayerController iPodMusicPlayer] beginGeneratingPlaybackNotifications]; 
[[MPMusicPlayerController iPodMusicPlayer] endGeneratingPlaybackNotifications]; 
+0

我應該在我的getTrackDescription或viewDidLoad內執行該操作嗎? – NorthBlast

+0

您應該在viewWillAppear:中添加自己作爲觀察者,並在viewDidDisappear:中移除觀察者。您需要在通知回調中調用'getTrackDescription'。 –

+0

好的,我試圖實現你的建議,但我沒有得到它正常工作,你能看到我的更新部分的帖子,讓我知道最新的問題..或任何建議.. @ 0x7fffffff – NorthBlast

0

這是我的完整答案的問題..

1)我設置這兩種方法..並設置Observer MPMusicPlayerControllerNowPlayingItemDidChangeNotification這會照顧無論更新我的歌曲信息的。與getTrackDescription仍然同我以前的帖子..

- (void)viewWillAppear:(BOOL)animated{ 

    // creating simple audio player 
    self.myPlayer = [MPMusicPlayerController iPodMusicPlayer]; 

    // assing a playback queue containing all media items on the device 
    [self.myPlayer setQueueWithQuery:[MPMediaQuery songsQuery]]; 

    self.notificationCenter = [NSNotificationCenter defaultCenter]; 

    [self.notificationCenter addObserver:self 
           selector:@selector(getTrackDescription:) 
            name:MPMusicPlayerControllerNowPlayingItemDidChangeNotification 
            object:self.myPlayer]; 

    [self.notificationCenter addObserver:self 
           selector:@selector(handle_PlayBackNotification:) 
            name:MPMusicPlayerControllerPlaybackStateDidChangeNotification 
            object:self.myPlayer]; 


    [self.myPlayer beginGeneratingPlaybackNotifications]; 

} 

-(void)viewWillDisappear:(BOOL)animated { 

    [self.notificationCenter removeObserver:self 
           name:MPMusicPlayerControllerNowPlayingItemDidChangeNotification 
           object:self.myPlayer]; 

    [self.notificationCenter removeObserver:self 
            name:MPMusicPlayerControllerPlaybackStateDidChangeNotification 
            object:self.myPlayer]; 

    [self.myPlayer endGeneratingPlaybackNotifications]; 

} 

再神奇會自然而然地發生..它只是基本上是@推薦爲0x7FFFFFFF我做的,但我不得不做一些挖掘,因爲我不熟悉的通知所有..

所以,以防萬一,如果你想看到我是如何切換我的播放/暫停按鈕的Observer MPMusicPlayerControllerPlaybackStateDidChangeNotification這是我做到了..

- (void)handle_PlayBackNotification:(id)notification{ 

    if(myPlayer.playbackState == 1){ 

     // sets the pause image in play button 
     [self.pauseBtn setBackgroundImage:[UIImage imageNamed:@"pauseBtn2.png"] forState:(UIControlStateNormal)]; 

    } else { 

     // resets the image to normal play image 
     [self.pauseBtn setBackgroundImage: nil forState:(UIControlStateNormal)]; 


    } 

} 

以防萬一這是我getTrackDescription ...

- (void)getTrackDescription:(id)notification { 

    // getting whats currently playing 
    self.nowPlayingItem = self.myPlayer.nowPlayingItem; 

    // song title currently playing 
    self.title = [self.nowPlayingItem valueForProperty:MPMediaItemPropertyTitle]; 

    // if title is not fund Unknown will be displayed 
    if (title == (id)[NSNull null] || title.length == 0) { 
     title = @"Unknown"; 
    } 

    // artist currently playing 
    self.artist = [self.nowPlayingItem valueForProperty:MPMediaItemPropertyArtist]; 

    // if artist is not fund Unknown will be displayed 
    if (artist == (id)[NSNull null] || artist.length == 0) { 
     artist = @"Unknown"; 
    } 

    // displaying current artist and title song playing 
    [self.currentlyPlaying setText:[NSString stringWithFormat:@"%@ - %@", artist, title]]; 

} 
相關問題