iOS 通过专辑 MPMediaEntityPersistentID 查询有时找不到歌曲
iOS Query via Album MPMediaEntityPersistentID sometimes brings back no songs
我正在编写一个使用 Apple 内置的 MediaPlayer 库播放音乐的应用程序。我存储了一系列专辑和一系列ID,然后选择一个专辑和ID时,我使用ID搜索专辑。出于某种原因,一些专辑无法找到任何歌曲,尽管有一个与之关联的 ID。每次都是同样的专辑,不行,而且好像没有规律。
我使用以下代码将名称和 ID 存储到两个数组中
let query = MPMediaQuery.albumsQuery()
let mediaCollection = MPMediaItemCollection(items: query.items!)
for album in mediaCollection.items {
albumTitleArray.append(album.albumTitle!)
albumIdArray.append(album.albumPersistentID)
}
选中一个后,我将 id 传递给 queryMedia 方法
func queryMedia(identifier:MPMediaEntityPersistentID) -> MPMediaItemCollection {
let predicateId = MPMediaPropertyPredicate(value: String(identifier), forProperty: MPMediaItemPropertyAlbumPersistentID, comparisonType:MPMediaPredicateComparison.EqualTo)
let query = MPMediaQuery.init()
query.addFilterPredicate(predicateId)
let collection = MPMediaItemCollection(items: query.items!)
return collection;
}
如能帮助解决此问题,我们将不胜感激!
肯定是某些字符格式不正确,或者查询中从 MPMediaEntityPersistentID 转换为 String 导致的比较错误。
我已将代码更改为转换为 NSNumber,查询现在可以正确找到所有相册。
在上面的代码示例中更改此部分
String(identifier)
至
NSNumber(unsignedLongLong: identifier)
看起来像这样
func queryMedia(identifier:MPMediaEntityPersistentID) -> MPMediaItemCollection {
let predicateId = MPMediaPropertyPredicate(value: NSNumber(unsignedLongLong: identifier), forProperty: MPMediaItemPropertyAlbumPersistentID, comparisonType:MPMediaPredicateComparison.EqualTo)
let query = MPMediaQuery.init()
query.addFilterPredicate(predicateId)
let collection = MPMediaItemCollection(items: query.items!)
return collection;
}
我目前正在使用 XCode 13.1 和 iOS 14.8,这仍然是一个问题。
我需要用 NSNumber(value: persistentId)
包装 persistentId 才能正常工作。
但我还发现,如果我首先使用 MPMediaQuery.songs()
创建查询,那么我就不必使用 NSNumber()
func LoadMediaLibraryTrackData(_ track: inout AudioZoomTrack, _ persistentId:MPMediaEntityPersistentID) {
/// Works
let trackFilter = MPMediaPropertyPredicate(value: NSNumber(value: persistentId), forProperty: MPMediaItemPropertyPersistentID)
let query = MPMediaQuery(filterPredicates: [trackFilter])
/// Fails
let trackFilter = MPMediaPropertyPredicate(value: persistentId, forProperty: MPMediaItemPropertyPersistentID)
let query = MPMediaQuery(filterPredicates: [trackFilter])
/// Works
let query = MPMediaQuery.songs()
let trackFilter = MPMediaPropertyPredicate(value: persistentId, forProperty: MPMediaItemPropertyPersistentID)
query.addFilterPredicate(trackFilter)
...
}
我正在编写一个使用 Apple 内置的 MediaPlayer 库播放音乐的应用程序。我存储了一系列专辑和一系列ID,然后选择一个专辑和ID时,我使用ID搜索专辑。出于某种原因,一些专辑无法找到任何歌曲,尽管有一个与之关联的 ID。每次都是同样的专辑,不行,而且好像没有规律。
我使用以下代码将名称和 ID 存储到两个数组中
let query = MPMediaQuery.albumsQuery()
let mediaCollection = MPMediaItemCollection(items: query.items!)
for album in mediaCollection.items {
albumTitleArray.append(album.albumTitle!)
albumIdArray.append(album.albumPersistentID)
}
选中一个后,我将 id 传递给 queryMedia 方法
func queryMedia(identifier:MPMediaEntityPersistentID) -> MPMediaItemCollection {
let predicateId = MPMediaPropertyPredicate(value: String(identifier), forProperty: MPMediaItemPropertyAlbumPersistentID, comparisonType:MPMediaPredicateComparison.EqualTo)
let query = MPMediaQuery.init()
query.addFilterPredicate(predicateId)
let collection = MPMediaItemCollection(items: query.items!)
return collection;
}
如能帮助解决此问题,我们将不胜感激!
肯定是某些字符格式不正确,或者查询中从 MPMediaEntityPersistentID 转换为 String 导致的比较错误。
我已将代码更改为转换为 NSNumber,查询现在可以正确找到所有相册。
在上面的代码示例中更改此部分
String(identifier)
至
NSNumber(unsignedLongLong: identifier)
看起来像这样
func queryMedia(identifier:MPMediaEntityPersistentID) -> MPMediaItemCollection {
let predicateId = MPMediaPropertyPredicate(value: NSNumber(unsignedLongLong: identifier), forProperty: MPMediaItemPropertyAlbumPersistentID, comparisonType:MPMediaPredicateComparison.EqualTo)
let query = MPMediaQuery.init()
query.addFilterPredicate(predicateId)
let collection = MPMediaItemCollection(items: query.items!)
return collection;
}
我目前正在使用 XCode 13.1 和 iOS 14.8,这仍然是一个问题。
我需要用 NSNumber(value: persistentId)
包装 persistentId 才能正常工作。
但我还发现,如果我首先使用 MPMediaQuery.songs()
创建查询,那么我就不必使用 NSNumber()
func LoadMediaLibraryTrackData(_ track: inout AudioZoomTrack, _ persistentId:MPMediaEntityPersistentID) {
/// Works
let trackFilter = MPMediaPropertyPredicate(value: NSNumber(value: persistentId), forProperty: MPMediaItemPropertyPersistentID)
let query = MPMediaQuery(filterPredicates: [trackFilter])
/// Fails
let trackFilter = MPMediaPropertyPredicate(value: persistentId, forProperty: MPMediaItemPropertyPersistentID)
let query = MPMediaQuery(filterPredicates: [trackFilter])
/// Works
let query = MPMediaQuery.songs()
let trackFilter = MPMediaPropertyPredicate(value: persistentId, forProperty: MPMediaItemPropertyPersistentID)
query.addFilterPredicate(trackFilter)
...
}