8

簡単な質問がありますが、正しい答えが見つかりません。このようなパスでデータベースに保存された曲のURLがあります。

aSound.path = [[item valueForProperty: MPMediaItemPropertyAssetURL] absoluteString];

曲名アーティストとアートワークを持つMPMediaItemオブジェクトに戻すにはどうすればよいですか?

出来ますか?

4

2 に答える 2

7

保存:

    NSNumber* persistentID = 
[mediaItem valueForProperty:MPMediaItemPropertyPersistentID];

読み込み中:

            MPMediaPropertyPredicate * predicate = 
              [MPMediaPropertyPredicate 
                predicateWithValue:persistentID 
                       forProperty:MPMediaItemPropertyPersistentID];

別の例: MPMediaItemPropertyPersistentIDのNSNumberをNSStringに変換し、再度元に戻す

どのDRM曲もnullURLを返すため、曲のURLは信頼できないことに注意してください

于 2012-03-27T14:14:56.440 に答える
5

または、Works For Me(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];
}

これがどこでうまくいかないか、またはそれを改善する方法についてコメントをいただければ幸いです。複数のメディアソースがあり、そのすべてがURLを使用できるため、PersistentIDではなくURLを渡すことを好みます。PersistentIDを使用すると、多くの「これがメディアIDの場合はこれを実行し、そうでない場合はURLを使用して実行する」ことを意味します。

于 2013-10-18T20:11:53.167 に答える