MPMediaItem的URL

fla*_*nka 6 objective-c mpmediapickercontroller mpmediaitem ios4 ios5

我有一个简单的问题,但我找不到正确的答案.我有一个保存到我的数据库的歌曲网址.像这样的道路.

aSound.path = [[item valueForProperty: MPMediaItemPropertyAssetURL] absoluteString];
Run Code Online (Sandbox Code Playgroud)

如何转换回具有歌曲名称艺术家和艺术品的MPMediaItem对象?

可能吗?

谢谢你的回答.

aml*_*szk 6

保存:

    NSNumber* persistentID = 
[mediaItem valueForProperty:MPMediaItemPropertyPersistentID];
Run Code Online (Sandbox Code Playgroud)

加载:

            MPMediaPropertyPredicate * predicate = 
              [MPMediaPropertyPredicate 
                predicateWithValue:persistentID 
                       forProperty:MPMediaItemPropertyPersistentID];
Run Code Online (Sandbox Code Playgroud)

另一个例子: NSNumber for MPMediaItemPropertyPersistentID to NSString又返回

注意歌曲URL不可靠,因为任何DRM歌曲都返回空URL


Ian*_*son 5

或者,一个对我有用的讨厌的黑客(tm)。

- (MPMediaItem *)getMediaItemForURL:(NSURL *)url {
    // We're going to assume that the last query value in the URL is the media item's persistent ID and query off that.

    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];

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

    return [items objectAtIndex:0];
}
Run Code Online (Sandbox Code Playgroud)

对于可能出错的地方或如何改进它的评论表示赞赏。我更喜欢传递 URL 而不是 PersistentID,因为我有多个媒体源,所有媒体源都可以使用 URL。使用 PersistentID 意味着很多“如果这是媒体 ID,则执行此操作,否则,使用 URL 执行此操作”。