获取当前的MPMediaQuery或MPMediaItemCollection

时间:2011-12-20 15:01:32

标签: iphone objective-c ios

我正试图获取队列中下一首歌曲的封面,

我一直在使用这个

MPMediaQuery* assetQuery = [[MPMediaQuery alloc] init];

    NSArray *arrayOfItems = [assetQuery items];

    MPMediaItem *mediaItem = [arrayOfItems objectAtIndex:[musicPlayer indexOfNowPlayingItem] + 1];

    NSLog(@"%@", [mediaItem valueForProperty:MPMediaItemPropertyTitle]);

但今天我发现播放列表有自己的队列,因为我使用的是iPodMusicPlayer,

如果用户来自播放播放列表中的歌曲的iPod音乐播放器,则对于我的应用,他/她将看到下一个项目的错误封面。

有没有办法获得当前的MPMediaQuery或MPMediaItemCollection?

喜欢

  

[musicPlayer nowPlayingSong];

可能像

  

[musicPlayer nowPlayingQuery];

请回答,谢谢

2 个答案:

答案 0 :(得分:0)

没有。 Apple不提供对当前播放列表的访问权限。这使编码成为内置音乐播放器的一个不错的替代品。

我不知道为什么Apple会为ipod音乐库提供SDK但不能完全访问音乐控制器。

这也很麻烦。

答案 1 :(得分:0)

我......有点......找到了一个半工作的解决方法。

您可以访问播放列表,并且您可以在某些播放列表中了解当前的歌曲索引。很可能,如果在多个播放列表中确实找到了歌曲 - 它的索引更可能是不同的......(但可能是相同的!)

所以 - 我找出当前歌曲的持久性ID:

_nowPlayingIPodItemPersistantID = [[[[MPMusicPlayerController iPodMusicPlayer] nowPlayingItem]
        valueForProperty:MPMediaItemPropertyPersistentID] stringValue];

然后尝试通过比较indexOfNowPlayingItem与每首歌曲来找出哪个播放列表是活动的,其中的persistentID等于当前歌曲的持久ID:

    MPMediaQuery *query = [MPMediaQuery playlistsQuery];

    int count = 0;

    for (MPMediaPlaylist *playlist in [query collections])
    {
        if(_nowPlayingIPodCollectionItemPersistantID)
        {
            break;
        }

        count = 0;

        for(MPMediaItem *item in [playlist items])
        {
            if([[[item valueForProperty:MPMediaItemPropertyPersistentID] stringValue] isEqualToString:_nowPlayingIPodItemPersistantID]
                && [[MPMusicPlayerController iPodMusicPlayer] indexOfNowPlayingItem] == count)
            {
                _nowPlayingIPodCollectionItemPersistantID = [playlist valueForProperty: MPMediaPlaylistPropertyName];

                break;
            }

            count++;
        }
    }
    //===

不完美,但是嘿..要做点什么,对吗?