IOS::如何获取 MPMediaquery Songsquery Artwork

Posted

技术标签:

【中文标题】IOS::如何获取 MPMediaquery Songsquery Artwork【英文标题】:IOS::How to get the MPMediaquery Songsquery Artwork 【发布时间】:2014-09-08 09:57:46 【问题描述】:

我正在使用此代码获取艺术品,但这对我来说不是锻炼。这段代码有什么问题。建议我。 谢谢。

MPMediaQuery *mySongsQuery = [MPMediaQuery songsQuery];
            NSArray *SongsList = [mySongsQuery collections];
            for (MPMediaItemCollection *SongsArt in SongsList) 
NSArray *songs = [SongsArt items];
                for (MPMediaItem *song in songs) 

                    if ([(MPMediaItem*)item valueForProperty:MPMediaItemPropertyAssetURL] != nil) 
                    CGSize artworkImageViewSize = CGSizeMake(40, 40);
                    MPMediaItemArtwork *artwork = [song valueForProperty:MPMediaItemPropertyArtwork];
                    UIImage * image = [artwork imageWithSize:artworkImageViewSize];
                    if (image!= nil)
                    
                        imgv_songImageView.image = image;
                    
                    else
                    
                        imgv_songImageView.image = [UIImage imageNamed:@"musicD-jpeg.png"];
                    
       
    

【问题讨论】:

【参考方案1】:

我假设您只想循环播放音乐库中的所有歌曲,因此我认为不需要收藏:

MPMediaQuery *mySongsQuery = [MPMediaQuery songsQuery];

for (MPMediaItem *item in mySongsQuery.items) 
  if (![[item valueForProperty:MPMediaItemPropertyIsCloudItem]boolValue]) 

    CGSize artworkImageViewSize = CGSizeMake(40, 40);
    MPMediaItemArtwork *artwork = [song valueForProperty:MPMediaItemPropertyArtwork];
    UIImage *image = [artwork imageWithSize:artworkImageViewSize];

    if (image) 
      imgv_songImageView.image = image;
     else 
      imgv_songImageView.image = [UIImage imageNamed:@"musicD-jpeg.png"];
    
  

我不知道你为什么要检查资产 URL,但我把它留在里面了。

【讨论】:

改用MPMediaItemPropertyIsCloudItem 它也给出了相同的输出。 你到底是什么意思?即使设备上没有所有歌曲,您也会收到0?尝试更改 if 语句,查看更新的答案。 我得到了歌曲名和歌手名,很好,但没有得到艺术作品。【参考方案2】:

在这里,我发布了获取曲目并按字母顺序排序的代码。它是用swift3编写的。

    /// Get all the songs in the device and display in the tableview
///
func getAllSongs() 
    let query: MPMediaQuery = MPMediaQuery.songs()
    let allSongs = query.items

    allSongItems?.removeAll()

    guard allSongs != nil else 
        return
    

    var index = 0
    for item in allSongs! 
        let pathURL: URL? = item.value(forProperty: MPMediaItemPropertyAssetURL) as? URL
        if pathURL == nil 
            print("@Warning!!! Track : \(item) is not playable.")
         else 
            let trackInfo = SongItem()
            trackInfo.index = index
            trackInfo.mediaItem = item

            let title = item.value(forProperty: MPMediaItemPropertyTitle) as? String ?? "<Unknown>"
            let artistName = item.value(forProperty: MPMediaItemPropertyArtist) as? String ?? "<Unknown>"
            trackInfo.songName = title
            trackInfo.artistName = artistName

            trackInfo.isSelected = false
            trackInfo.songURL = item.value(forProperty: MPMediaItemPropertyAssetURL) as? URL
            allSongItems?.append(trackInfo)
            index += 1
        
    

    // Sort the songs alphabetically
    let sortedArray: [SongItem]? = allSongItems?.sorted 
        $0.songName!.localizedCompare($1.songName!) == .orderedAscending
    
    allSongItems?.removeAll()
    if let arr = sortedArray 
        allSongItems?.append(contentsOf: arr)
    



【讨论】:

以上是关于IOS::如何获取 MPMediaquery Songsquery Artwork的主要内容,如果未能解决你的问题,请参考以下文章

iOS 模拟器中的 MPMediaQuery

获取当前的 MPMediaQuery 或 MPMediaItemCollection

快速使用 MPMediaQuery 获取索引 uitableview 的专辑标题?

我可以使用 MPMediaQuery 来获取歌曲的年份吗?

在 iOS7 上获取流派列表

无法理解 MPMediaQuery 的行为