iPod Library歌曲(也称作本地音乐库歌曲)也就是用户从iTunes中导入的歌曲。现在市面上任何一款成熟的播放器也都支持�这个功能,所以如果在被养惯了的用户面前这个功能的开发是必不可少的。
访问 iPod Library
在安卓中开发者可能不必要面临这种问题,只要你的歌是放在磁盘上的我就能给你找出来!但这一套在iOS系统沙盒机制的面前缺无法建功,对于iOS来说,我们如果想要播放iPod Library歌曲就必须要先访问到iPod Library。苹果官方文档中给出了一张非常形象的图片
效果图
以上就是简单的对
MPMediaPickerController
的应用,可以看到作为苹果高度封装的一个类,留个我们自定义的地方很少,可以认为基本上不能自定义。不过怎么说,虽然目前我也没有发现有哪个app使用的这个方法来加载* iPod Library * 中的歌曲,但还是提一下吧,大家就当科普好了= = 。
MediaQuery
根据命名估计大家也能猜到一些,MediaQuery 其实就好像数据库的SELET语句。我们通过MediaQuery可以直接访问iPod Library的DB,并根据需要获取iPod Library中的音频文件。
MediaQuery 的简单用法: MediaQuery 这个类本身已经封装好了一些方法,足矣满足我们正常的开发需求,类似于QQ播放器中显示全部本地歌曲就只需要调用下 [MPMediaQuery songsQuery]
返回所有歌曲列表就好了。
//大家看名字也就知道是什么意思了,我就不一一解释了,如果有必要可以求助有道。
+ (MPMediaQuery *)albumsQuery;
+ (MPMediaQuery *)artistsQuery;
+ (MPMediaQuery *)songsQuery;
+ (MPMediaQuery *)playlistsQuery;
+ (MPMediaQuery *)podcastsQuery;
+ (MPMediaQuery *)audiobooksQuery;
+ (MPMediaQuery *)compilationsQuery;
+ (MPMediaQuery *)composersQuery;
+ (MPMediaQuery *)genresQuery;
不过如果你非要自己手写查询代码的话就参考下面这段代码吧
MPMediaPropertyPredicate *artistNamePredicate =[MPMediaPropertyPredicate predicateWithValue:@"Happy the Clown" //查询谓语也就是关键字
forProperty:MPMediaItemPropertyArtist //要查询的�属性
comparisonType:MPMediaPredicateComparisonEqualTo]; //关键字匹配的方案:相同 or 包含
MPMediaQuery *quert = [[MPMediaQuery alloc] init];
//添加查询语句
[quert addFilterPredicate: artistNamePredicate];
//设置查询后返回的集合类型
quert.groupingType = MPMediaGroupingArtist;
//集合里是MPMediaItem
NSArray *itemsFromArtistQuery = [quert items];
//集合里是MPMediaItemCollection
NSArray *collectionsFromArtistQuery = [quert collections];
还有一点要说明的 MediaCollection
是 MediaItem
的合集可以通过访问它的 items
属性来访问所有的 MediaItem
。
好了,现在我们就已经拿到需要的音频对象的列表了。如果你没有忘记我们前两章节的内容,到了这里你就可以自己思考下怎么使用现有的内容完成一个 iPod Library 播放器。
下面我们来会使用一个新的类MPMusicPlayerController
来播放我们 iPod Library 中的歌曲。(使用下面介绍的两个方法来播放,一样会有很大的局限性,这里的目的还是科普为主)
// 通过MPMusicPlayerController的类方法可以生成的两种播放器 applicationMusicPlayer 不会继承iPhone自带音乐播放器中的播放状态,相当于一个独立的播放器;而 systemMusicPlayer 则完全继承iPod应用的播放状态(甚至是播放时间),对其实例的任何操作也会覆盖到iPhone自带音乐播放器
+ (MPMusicPlayerController *)applicationMusicPlayer; //局限:无法后台播放
+ (MPMusicPlayerController *)iPodMusicPlayer; //已经弃用,使用下面一个方法
+ (MPMusicPlayerController *)systemMusicPlayer; //局限:�实质是调用的系统播放器,如果你的应用crash了或者被kill了,音乐不会自动停止。
下面是应用示例
#import "ViewController.h"
#import <MediaPlayer/MediaPlayer.h>
@interface ViewController ()<MPMediaPickerControllerDelegate>
@property (nonatomic,strong) MPMediaPickerController *mediaPicker;//媒体选择控制器
@property (nonatomic,strong) MPMusicPlayerController *musicPlayer; //音乐播放器
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
_musicPlayer=[MPMusicPlayerController systemMusicPlayer];
//1、开启通知,监控MPMusicPlayerController的通知
[_musicPlayer beginGeneratingPlaybackNotifications];
[self addNotification];
//2、获得音乐库媒体队列
[_musicPlayer setQueueWithItemCollection:[self getLocalMediaItemCollection]];
}
/**
* 取得媒体队列
*/
-(MPMediaQuery *)getLocalMediaQuery{
MPMediaQuery *mediaQueue=[MPMediaQuery songsQuery];
for (MPMediaItem *item in mediaQueue.items) {
NSLog(@"标题:%@,%@",item.title,item.albumTitle);
}
return mediaQueue;
}
#pragma mark - 通知
/**
* 添加通知
*/
-(void)addNotification{
NSNotificationCenter *notificationCenter=[NSNotificationCenter defaultCenter];
[notificationCenter addObserver:self selector:@selector(playbackStateChange:) name:MPMusicPlayerControllerPlaybackStateDidChangeNotification object:self.musicPlayer];
}
/**
* 播放状态改变通知
*/
-(void)playbackStateChange:(NSNotification *)notification{
switch (self.musicPlayer.playbackState) {
case MPMusicPlaybackStatePlaying:
NSLog(@"正在播放...");
break;
case MPMusicPlaybackStatePaused:
NSLog(@"播放暂停.");
break;
case MPMusicPlaybackStateStopped:
NSLog(@"播放停止.");
break;
default:
break;
}
}
#pragma mark - UI事件
- (IBAction)playClick:(UIButton *)sender {
[self.musicPlayer play];
}
- (IBAction)puaseClick:(UIButton *)sender {
[self.musicPlayer pause];
}
- (IBAction)stopClick:(UIButton *)sender {
[self.musicPlayer stop];
}
- (IBAction)nextClick:(UIButton *)sender {
[self.musicPlayer skipToNextItem];
}
- (IBAction)prevClick:(UIButton *)sender {
[self.musicPlayer skipToPreviousItem];
}
我们的 MPMusicPlayerController
就在这结束吧,由于实际开发中是不会选择这种方法的,所以对这个类的讲解也算是浅尝辄止,如果有兴趣的朋友可以自己去翻阅下官方文档。
网友评论