iOS 8专辑封面艺术

8
自iOS 8以来,iPad和iPhone设备的所有专辑封面数据数组都返回空数组。我可以从本地文件(NSBundle)获取专辑封面,但从iTunes购买或设备本身上的任何歌曲都会返回空值。
我已经升级到最新的XCode、最新的iOS,在iPad 4、iPad Air、iPhone 5和iPhone 6上进行了测试,也更新了iTunes。希望有人知道发生了什么,这似乎是iOS 8中已知的一个bug。此外,我可以播放资产并检索诸如歌曲名称和艺术家之类的信息。
MPMediaQuery *songQuery = [MPMediaQuery songsQuery];
NSArray *itemsFromGenericQuery = [songQuery items];
NSMutableArray *songsList = [[NSMutableArray alloc] initWithArray:itemsFromGenericQuery];
MPMediaItem *mediaItem = (MPMediaItem *)[songsList objectAtIndex:0];

NSURL *url = [mediaItem valueForProperty:MPMediaItemPropertyAssetURL];
AVAsset *asset = [[AVURLAsset alloc] initWithURL:url options:nil];
NSArray *commonArray = [assets commonMetadata];

//Test A
NSArray *albumArray = [AVMetadataItem metadataItemsFromArray:commonArray filteredByIdentifier:AVMetadataIdentifieriTunesMetadataCoverArt];
NSLog(@"commonArray = %lu",(unsigned long)[commonArray count]); //Returns 3
NSLog(@"albumArray has %lu",(unsigned long)[albumArray count]); //Returns 0 or null

//Test B
for (AVMetadataItem *metadataItem in asset.commonMetadata) {

    if ([metadataItem.commonKey isEqualToString:@"artwork"]){
        NSDictionary *imageDataDictionary = (NSDictionary *)metadataItem.value;
        NSData *imageData = [imageDataDictionary objectForKey:@"data"];
        UIImage *image = [UIImage imageWithData:imageData];
        coverArtImage.image = image;
    }
}

//Test C
for (AVMetadataItem *item in commonArray) {

    if ([item.keySpace isEqualToString:AVMetadataKeySpaceiTunes]) {
        NSData *newImage = [item.value copyWithZone:nil];
        coverArtImage.image = [UIImage imageWithData:newImage];
    }

}

//Test D
for (AVMetadataItem *item in asset.metadata) {

    if ([item.commonKey isEqualToString:@"artwork"]){
        NSDictionary *imageDataDictionary = (NSDictionary *)item.value;
        NSData *imageData = [imageDataDictionary objectForKey:@"data"];
        UIImage *image = [UIImage imageWithData:imageData];
        coverArtImage.image = image;
    }

    if ([item.keySpace isEqualToString:AVMetadataKeySpaceiTunes]) {
        NSData *newImage = [item.value copyWithZone:nil];
        coverArtImage.image = [UIImage imageWithData:newImage];
    }

}

所有封面图像都返回null或从未被调用。此外,按照苹果建议从直接文件中拉取封面艺术是异步的,但无论我在什么设备上尝试它,似乎至少需要10秒钟。 iOS 7允许我们直接从mediaItem中提取封面艺术,这是即时的,我不明白为什么他们会削弱那个功能。

你在这里有进展吗? - newenglander
你尝试过使用 MPMediaQuery.songsQuery() 吗? - Aabglov
2个回答

1
NSString *queryString = [url query];
if (queryString == nil) // shouldn't happen
    return nil;

NSArray *components = [queryString componentsSeparatedByString:@"="];
if ([components count] < 2) // also shouldn't happen
    return nil;

id trackId = [components objectAtIndex:1];

MPMediaQuery *query = [[MPMediaQuery alloc] init];
[query addFilterPredicate:[MPMediaPropertyPredicate predicateWithValue:trackId forProperty:MPMediaItemPropertyPersistentID]];

NSArray *items = [query items];

[query release];

if ([items count] < 1) // still shouldn't happen
    return nil;

MPMediaItem* mpitem= [items objectAtIndex:0];

MPMediaItemArtwork* mpArt = [mpitem valueForProperty:MPMediaItemPropertyArtwork];

UIImage* mpImage = [mpArt imageWithSize:mpArt.bounds.size];

请在您的答案中添加一些解释! - ρss

0
我建议尝试新的Swift实现:
let query = MPMediaQuery.songsQuery()
let mediaCollection = MPMediaItemCollection(items: query.items!)
print(mediaCollection.items)

对于已下载歌曲的物理设备,此函数应返回一个非空数组。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接