您的位置:首页 > 移动开发 > IOS开发

iOS获取手机内部音乐列表

2016-05-04 16:52 495 查看
主要是通过 MPMediaQuery 来获取系统的音乐列表

下面讲解这个类的一些属性和方法

1.首先说一下MPMediaPredicate这个类,

这个类可以用来过滤我们不想要的一些音乐

MPMediaPredicate 这个类的定义如图:

并没有定义属性和方法,应该是苹果预留的,为了以后能用在其他的过滤里面

但是我们可以使用它的子类 MPMediaPropertyPredicate 

这是MPMediaPropertyPredicate 的 实例化方法

+ (MPMediaPropertyPredicate *)predicateWithValue:(nullable id)value forProperty:(NSString *)property comparisonType:(MPMediaPredicateComparison)comparisonType;
这个方法是过滤属性 property ,过滤的方法是进行比较 value 是否相等

比较的类型comparisonType

比较的类型有两种:

MPMediaPredicateComparisonEqualTo,

第一个:MPMediaPredicateComparisonEqualTo 是比较两个是否相等,如 字符串的 isEqualToString

第二个:MPMediaPredicateComparisonContains 是检测是否包含

OK! MPMediaPropertyPredicate 理解完之后,下面继续

2.MPMediaQuery

下面一个个的讲解方法:

 

// 1. 这个是MPMediaQuery 的初始化方法,可以传入一个过滤的类MPMediaPredicate来过滤我们不想要的item

- (instancetype)initWithFilterPredicates:(nullableNSSet<MPMediaPredicate *> *)filterPredicatesNS_DESIGNATED_INITIALIZER;

// 2. 这个可以设置多个过滤条件

@property (nonatomic,strong,nullable)NSSet<MPMediaPredicate
*> *filterPredicates;

// 3. 添加一个过滤条件

- (void)addFilterPredicate:(MPMediaPredicate *)predicate;

// 4. 移除一个过滤条件

- (void)removeFilterPredicate:(MPMediaPredicate *)predicate;

// 5. 返回一个通过 过滤条件过滤之后 的 存放MPMediaItems 类型的数组,如果没有item 匹配到,会返回一个空数组,如果在查找期间出错的话也有可能会返回一个nil,

// 这个item 数组就是我们想要的 音乐列表

// Returns an array of MPMediaItems matching the query filter predicates.

// If no items match this method returns an empty array, otherwise returns nil if an error prevents the items from being fetched.

@property (nonatomic,readonly,nullable)NSArray<MPMediaItem
*> *items;

// 6. 返回一个指定组类型(groupingType)的数组,数组里面存放 MPMediaItemCollection 类型

// MPMediaItemCollection 类型可以看做是 item 的集合 通过 [MPMediaItemCollection items] 获得

// 例如,我们设置groupingType为
MPMediaGroupingArtist 艺术家类型

// 那么返回的数组里面

第一个(MPMediaItemCollection)是 :刘德华的所有歌曲(MPMediaItem)的集合,

可以通过 [MPMediaItemCollection items] 获得刘德华的所有歌曲

第二个是小沈阳的歌曲集合

。。。。。。。

// Returns an array of MPMediaItemCollections matching the query filter predicates. The collections are grouped by the groupingType.

@property (nonatomic,readonly,nullable)NSArray<MPMediaItemCollection
*> *collections;

// 7. 指定的组类型 组类型下面有介绍

// The property used to group collections, defaults to MPMediaGroupingTitle.

@property (nonatomic)MPMediaGrouping groupingType

// 7 同上

@property (nonatomic,readonly,nullable)NSArray<MPMediaQuerySection
*> *itemSectionsNS_AVAILABLE_IOS(4_2);

@property (nonatomic,readonly,nullable)NSArray<MPMediaQuerySection
*> *collectionSectionsNS_AVAILABLE_IOS(4_2);

// 8. 通过类方法直接获得我们想要的media 队列 

// Base queries which can be used directly or as the basis for custom queries.

// The groupingType for these queries is preset to the appropriate type for the query.

+ (MPMediaQuery *)albumsQuery;

+ (MPMediaQuery *)artistsQuery;

+ (MPMediaQuery *)songsQuery;

+ (MPMediaQuery *)playlistsQuery;

+ (MPMediaQuery *)podcastsQuery;

+ (MPMediaQuery *)audiobooksQuery;

+ (MPMediaQuery *)compilationsQuery;

+ (MPMediaQuery *)composersQuery;

+ (MPMediaQuery *)genresQuery;

3. 使用

获取到了MPMediaQuery,便可以或得到 items (MPMediaItem),

在通过MPMediaItem 的属性方法就可以获得具体 MPMediaItem
的一些属性(如:播放本地连接)

当然也可以通过

- (id) valueForProperty: (NSString *) property的方法获得

列举几个

@property (nonatomic, readonly) MPMediaType mediaType // 媒体类型 如 MP3

@property (nonatomic, readonly, nullable) NSString *title// 标题

NSString * const MPMediaItemPropertyAssetURL

@property (nonatomic, readonly, nullable) NSURL *assetURL// 播放URL

NSString * const MPMediaItemPropertyPlayCount

@property (nonatomic, readonly) NSUInteger playCount// 播放次数

NSString * const MPMediaItemPropertyLastPlayedDate

@property (nonatomic, readonly, nullable) NSDate *lastPlayedDate // 最后一次播放的时间

// MPMediaGrouping 

typedef NS_ENUM(NSInteger, MPMediaGrouping) {

    MPMediaGroupingTitle, // 标题

    MPMediaGroupingAlbum,// 唱片集

    MPMediaGroupingArtist, // 艺术家

    MPMediaGroupingAlbumArtist, // 唱片集艺术家

    MPMediaGroupingComposer, // 作曲家

    MPMediaGroupingGenre, // 类型流派

    MPMediaGroupingPlaylist, // 播放列表

    MPMediaGroupingPodcastTitle // 播客标题

}

以上仅为个人理解,理解有误的地方,请指出,谢谢

如有未理解或想要继续的探讨的朋友可以联系本人
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息