Ios5 如何在iOS上播放播放列表中的歌曲(仅限歌曲)?

Ios5 如何在iOS上播放播放列表中的歌曲(仅限歌曲)?,ios5,mpmediaitem,mpmediaquery,mpmediaitemcollection,Ios5,Mpmediaitem,Mpmediaquery,Mpmediaitemcollection,我正在尝试播放iPod播放列表中的歌曲。至于播放列表可能也有视频,我只想播放其中的歌曲 MPMusicPlayerController *mp = [MPMusicPlayerController applicationMusicPlayer]; MPMediaQuery *query = [MPMediaQuery songsQuery]; query.groupingType = MPMediaGroupingPlaylist; NSArray *pla

我正在尝试播放iPod播放列表中的歌曲。至于播放列表可能也有视频,我只想播放其中的歌曲

    MPMusicPlayerController *mp = [MPMusicPlayerController applicationMusicPlayer];

    MPMediaQuery *query = [MPMediaQuery songsQuery];

    query.groupingType = MPMediaGroupingPlaylist;

    NSArray *playlists = [query collections];

    BOOL found = NO;

    for(MPMediaPlaylist *playlist in playlists)
    {
        NSString *name = [playlist valueForProperty:MPMediaPlaylistPropertyName];
        if([name caseInsensitiveCompare:@"MyPlaylist"] == NSOrderedSame && [playlist count] > 0)
        {
            MPMediaItemCollection *collection = [MPMediaItemCollection collectionWithItems:playlist.items];
            [mp setQueueWithItemCollection:collection];
            found = YES;
            NSLog(@"items count %d", [playlist count]);
            for (MPMediaItem *item in [collection items]){
                NSLog(@"%@", [item valueForKey:MPMediaItemPropertyMediaType]);
            }
            break;
        }
    }
加载包含1首歌曲和2个视频的播放列表后,输出为:

项目计数3
256
256
1

如果查询的目的是检索歌曲,并且媒体项的媒体类型为MPMediaTypeMovie(256或1),我不明白为什么我也会得到视频 一种可能的解决方法是使用谓词创建自定义查询。这可以通过使用
MPMediaQuery
items
数组而不是
collections
数组来实现。
collections
数组是
MPMediaItemCollection
的数组。
items
数组是
MPMediaItem
s,因此您可以通过
MPMediaItemPropertyMediaType
筛选查询
MPMediaItemPropertyMediaType
仅适用于
MPMediaItem
而不适用于
MPMediaItemCollection

根据播放列表标题和媒体类型,使用一组谓词初始化查询。这将选择播放列表并从查询中筛选出任何视频:

NSString*playlame=@“MyPlaylist”;
MPMediaPropertyPredicate*播放谓词=[MPMediaPropertyPredicate谓词WithValue:播放名称
forProperty:MPMediaPlaylayPropertyName];
NSNumber*mediaTypeNumber=[NSNumber numberWithInteger:MPMediaTypeMusic];//==1
MPMediaPropertyPredicate*mediaTypePredicate=[MPMediaPropertyPredicate谓词WithValue:mediaTypeNumber
forProperty:MPMediaItemPropertyMediaType];
NSSet*predicateSet=[NSSet setWithObjects:PlayPredicate,mediaTypePredicate,nil];
MPMediaQuery*mediaTypeQuery=[[MPMediaQuery alloc]initWithFilterPredicates:predicateSet];
[mediaTypeQuery setGroupingType:MPMediaGroupingPlaylist];
如果您从
MPMediaQuery
集合
数组返回数组,这些
MPMediaPropertyPredicate
将不会过滤。您应该在日志语句中看到除1以外的媒体项类型:

NSArray*播放列表集合=[mediaTypeQuery集合];
[播放列表集合枚举对象使用块:^(MPMediaPlaylist*播放列表,整数idx,布尔*停止){
NSLog(@“播放列表标题:%@,[Playlist valueForProperty:MPMediaPlaylistPropertyName]);
NSArray*歌曲=[播放列表项];
[歌曲enumerateObjectsUsingBlock:^(MPMediaItem*歌曲,整数idx,布尔*停止){
NSString*songTitle=[song valueForProperty:MPMediaItemPropertyTitle];
NSInteger mediaValue=[[song valueForProperty:MPMediaItemPropertyMediaType]integerValue];
如果(mediaValue!=1)
NSLog(@“title:%@-媒体类型值:%d”,songTitle,mediaValue);
}];//此处应返回其他媒体类型。
}];  
如果从
MPMediaQuery
项返回数组,则
MPMediaPropertyPredicate
将进行筛选:

NSArray*playlitems=[mediaTypeQuery项];
[PlayItems enumerateObjectsUsingBlock:^(MPMediaItem*歌曲、整数idx、布尔*停止){
NSString*songTitle=[song valueForProperty:MPMediaItemPropertyTitle];
NSInteger mediaValue=[[song valueForProperty:MPMediaItemPropertyMediaType]integerValue];
如果(mediaValue!=1)
NSLog(@“title:%@-媒体类型值:%d”,songTitle,mediaValue);
}];//此处不应返回任何内容。
您还可以只使用
songsQuery
上的mediatype谓词,将媒体类型筛选器应用于整个库:

MPMediaQuery*query=[MPMediaQuery-songsQuery];
[查询设置分组类型:MPMediaGroupingPlaylist];
[mediaTypeQuery addFilterPredicate:mediaTypePredicate];
NSArray*播放列表=[查询项];

这正是我需要的。我非常感谢你的帮助。