2012-02-06 28 views
22

我試圖在iOS應用程序中接收有關當前播放曲目的信息。這工作得很好,而iPhone是而不是連接到附件。如果我把它連接到我的車(歐寶雅特,iPhone插孔),下面的代碼將停止工作as described in the documentation當iPhone連接到附件時,有沒有辦法訪問當前播放的曲目?

如果您創建了一個iPod音樂播放器和用戶使用家庭共享,從其他圖書館承擔着一個項目的該房產的價值是nil

代碼:

// nil while connected to an accessory 
MPMediaItem *nowPlayingMediaItem = 
       [[MPMusicPlayerController iPodMusicPlayer] nowPlayingItem]; 

// Works while not connected to an accessory 
NSString *title = [nowPlayingMediaItem valueForProperty:MPMediaItemPropertyTitle]; 

我甚至嘗試 「哈克」 這樣的東西訪問 「私人」 性質(original code):

MPMediaQuery *query=nil; 
MPMediaItemCollection *collection=nil; 
id internalPlayer=nil; 
Ivar internalPlayeriVar = object_getInstanceVariable(iPod, "_internal", NULL); 
internalPlayer = object_getIvar(iPod, internalPlayeriVar); 
NSLog(@"internalPlayer: %@", internalPlayer); 
Ivar queryIvar = object_getInstanceVariable(internalPlayer, "_query", NULL); 
query = object_getIvar(internalPlayer, queryIvar); // nil everytime 
Ivar collectionIvar = object_getInstanceVariable(internalPlayer, 
               "_itemCollection", NULL); 
collection = object_getIvar(internalPlayer, collectionIvar); // nil everytime 

或調用私有方法:

// Same behaviour like [iPod nowPlayingItem], works 
// only while no accessory is connected 
MPMediaItem *nowPlayingMediaItem = 
       [iPod nowPlayingItemAtIndex:[iPod indexOfNowPlayingItem]]; 

// Works while not connected to an accessory 
NSString *title = [nowPlayingMediaItem valueForProperty:MPMediaItemPropertyTitle]; 

其還解決方案一直訪問新的MPNowPlayingInfoCenter,其nil

[MPNowPlayingInfoCenter defaultCenter].nowPlayingInfo 

我的車可以直接播放我的音樂,而無需使用iPhone應用程序看來我的iPhone知道車上正在播放什麼,因爲它顯示在鎖屏上的標題,藝術家和覆蓋圖標(只有有)。內部玩法也增加了。

如果我檢查播放狀態下,如果車裏放着音樂也返回YES

[[MPMusicPlayerController iPodMusicPlayer] playbackState] == MPMusicPlaybackStatePlaying 

那麼,有沒有什麼辦法(可能是通過調用私有方法)來訪問這首歌,車目前在玩?

+11

OT:當我看到您將您的汽車視爲手機的配件時,我不得不微笑:-) – Matthias 2012-02-22 14:53:15

+0

您能解釋一下,如果您是通過耳機插孔或iPhone插孔連接的嗎?我還假設你的車正在從iPhone上播放音樂?如果iPhone正在播放歌曲,那麼我認爲iPhone實際上是播放音樂而不是汽車的人。您是否想通過應用程序播放音樂,並將其連接至汽車,以便將汽車揚聲器發出? – Bot 2012-02-23 00:52:50

+0

我通過iPhone插孔連接iPhone。我不知道誰會在音樂播放器中播放音樂,但是我可以從我車內的信息顯示屏中選擇音樂。我只想在第三方應用程序中知道當前正在播放哪首歌曲。 (用第三方應用程序播放音樂也是可能的,但汽車音響控制僅適用於真正的「音樂」應用程序) – 2012-02-23 08:18:19

回答

2

蘋果只是在iOS 6.1中「修正了這個問題」,之後我將其報告爲一個錯誤。下面的代碼現在的作品,而我的iPhone連接到我的車:

MPMediaItem *nowPlayingMediaItem = [iPod nowPlayingItem]; 

NSString *title = [nowPlayingMediaItem valueForProperty:MPMediaItemPropertyTitle]; 

NSLog(@"Playing title: %@", title); 

而且,我真的很喜歡:也可以改變使用iPod應用播放曲目 - 如你期望它出現的應用程序,而不是「連接到附件」屏幕的大白色。所以這也可能以編程方式工作。

+0

很高興聽到..謝謝你的更新:) – Bot 2013-02-18 16:20:05

2

你使用線程嗎?如果是這樣的話,在主線程上運行代碼。如果不是,則爲item change註冊MPMusicPlayerController通知。這種方式當歌曲改變你的應用程序將知道新歌是什麼。另外可以確定這是在main thread as well上運行。

如果您的播放狀態在連接時正在更新,但您的nowPlayingItem不是,則會確認這是一個錯誤。我會爲此問題提交bug report

編輯: 訪問https://developer.apple.com/support/resources/bug-reporting.html並滾動到底部。最後一個問題說你可以聯繫TSI尋找bug。您可以獲得2個TSI免費開發者的請求,所以您可以使用其中一個來詢問他們是否有解決方案,直到問題得到解決爲止。

+0

如何訪問有關播放歌曲的信息?就像文檔說的那樣,沒有userInfo字典,所以我仍然需要使用[[MPMusicPlayerController iPodMusicPlayer] nowPlayingItem]什麼是零時間? – 2012-02-24 07:37:11

+0

@Blauesocke你使用線程? – Bot 2012-02-24 14:59:38

+0

不,我不認爲這很重要:-) – 2012-02-24 16:06:34

0

我敢肯定的答案是否定的,你不能有任何公開的API至少,但你應該提交與蘋果的錯誤,原因有二:

原因MPNowPlayingInfoCenter不給你的信息是因爲它必須由播放音樂的應用程序專門實現,如果蘋果的應用程序正在播放,那麼它應該已經實現了,因此發出了一個錯誤。

現在如果你說[[MPMusicPlayerController iPodMusicPlayer] playbackState]反映了播放的變化,那麼這意味着iPodMusicPlayer仍然是負責播放的應用程序,所以給你零MPMediaItemPropertyTitle也應該報告給蘋果作爲一個錯誤。

此外,關於該主題的非公開信息很可能涵蓋在MFi NDA之內,沒有人會冒着他的屁股冒險。

0

其實你不會得到任何MPMediaItem,因爲你的iPhone不是在播放歌曲,而是你的汽車的附件連接到iPhone正在訪問媒體庫。在此過程中,它負責更新所訪問對象(歌曲)的所有元數據,尤其是增加播放計數並更新歌曲的最後訪問日期。它還會在iTunes資料庫中存儲歌曲中的位置(位置)的某些信息。

鎖定屏幕讀取此信息以更新封面。這也是幫助iPod應用程序繼續您的汽車配件離開的地方。

因此,進入圖書館,並從那裏獲取最新信息。查看TopSongs示例項目以開始使用。

+0

這是不正確的。他表示不贊成Music.app實際上是在播放音樂。 – Bot 2012-03-20 22:53:11

+1

是的,我非常確定music.app正在播放音樂。幾周前我報告這是一個bug。 – 2012-03-21 08:08:02

相關問題