当iPhone连接到配件时,有没有办法访问当前播放的曲目?

时间:2012-02-06 08:08:10

标签: ios cocoa-touch audio-player

我正在尝试接收有关iOS应用中当前播放曲目的信息。当iPhone 连接到配件时,这非常好用。如果我将它连接到我的汽车(欧宝雅特,iPhone插孔),以下代码将停止工作as described in the documentation

  

如果您创建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];

我甚至试过“hacky”之类的东西,比如访问“私有”属性(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];

它也是 no 解决方案,可以随时访问新的MPNowPlayingInfoCenternil

[MPNowPlayingInfoCenter defaultCenter].nowPlayingInfo

我的车直接播放我的音乐而不使用iPhone应用程序似乎我的iPhone知道汽车当前正在播放什么,因为它在锁定屏幕上显示标题,艺术家和封面图标(仅限那里)。内部播放次数也会增加。

如果我检查播放状态,如果汽车播放音乐,它还会返回YES

[[MPMusicPlayerController iPodMusicPlayer] playbackState] == MPMusicPlaybackStatePlaying 

那么,有没有办法(可能是通过调用私人方法)来访问该歌曲,该车目前正在播放?

4 个答案:

答案 0 :(得分:2)

你在使用线程吗?如果是这样的话,在主线程上运行代码。如果没有,则注册item change的MPMusicPlayerController通知。这样,当歌曲改变你的应用程序将知道新歌是什么。另外请确保它在main thread as well上运行。

如果您的播放状态在连接时正在更新,但您的nowPlayingItem不是,则会确认这是一个错误。我会为此问题提交bug report

编辑: 访问https://developer.apple.com/support/resources/bug-reporting.html并滚动到底部。最后一个问题是你可以联系TSI进行bug工作。您可以免费获得2个TSI请求作为开发人员,因此您可以使用其中一个来询问他们是否有使用私有库的工作,直到修复错误。

答案 1 :(得分:2)

在我将其报告为错误后,Apple在iOS 6.1中“修复了”。当我的iPhone连接到我的车时,以下代码现在可以使用了:

MPMediaItem *nowPlayingMediaItem = [iPod nowPlayingItem];

NSString *title = [nowPlayingMediaItem valueForProperty:MPMediaItemPropertyTitle];

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

而且,我真正喜欢的是:也可以使用iPod应用程序更改播放曲目 - 应用程序按预期显示,而不是大白色“连接到配件”屏幕。所以这也可能以编程方式工作。

答案 2 :(得分:0)

我很确定答案是否定的,至少你不能使用任何公共API,但你应该提交苹果错误有两个原因:

MPNowPlayingInfoCenter没有提供信息的原因是因为它必须由播放音乐的应用程序专门实现,如果苹果的应用程序正在播放,那么它应该已经实现,因此提交了一个错误。

现在,如果你说[[MPMusicPlayerController iPodMusicPlayer] playbackState]反映了播放的变化,那么这意味着iPodMusicPlayer仍然是负责播放的应用程序,所以MPZiaItemPropertyTitle也应该向你报告为错误。

此外,MFi NDA可能会涵盖有关该主题的非公开信息,并且没有人会冒他的风险。

答案 3 :(得分:0)

实际上你不会得到任何MPMediaItem,因为你的iPhone没有播放歌曲,但连接到iPhone的汽车配件正在访问媒体库。在这样做时,它负责更新所访问的对象(歌曲)的所有元数据,尤其是递增播放计数并更新歌曲的最后访问日期。它还存储一些关于歌曲在iTunes库中的位置(位置)的信息。

锁定屏幕会读取此信息以更新封面。这也是帮助iPod应用程序在汽车配件离开的地方继续运行的原因。

然后点击图书馆并从那里获取最新信息。看看TopSongs示例项目即可开始。