1.访问音乐库的两种方法,如下图

(只能访问音频文件,如music,podcast,audiobook等)

2.MPMusicPlayerController的使用

有两种播放器可以选择,一种是application music player,另外一种是iPod music player。

第一种播放器是一种内部播放器,当程序对出后停止播放;而第二种播放器则与iPod播放器内的信息相关,退出之后不会停止播放。获取方式如下:


  • + applicationMusicPlayer
  • + iPodMusicPlayer


播放之前需要设置播放器的播放队列

  • – setQueueWithQuery:
  • – setQueueWithItemCollection:

管理播放模式和播放状态的一些属性

  •   property
  •   property
  •   property
  •   property
  •   property
  •   property

播放状态 MPMusicPlaybackState

enum {
   MPMusicPlaybackStateStopped,
   MPMusicPlaybackStatePlaying,
   MPMusicPlaybackStatePaused,
   MPMusicPlaybackStateInterrupted,
   MPMusicPlaybackStateSeekingForward,
   MPMusicPlaybackStateSeekingBackward
};
typedef NSInteger MPMusicPlaybackState;




播放控制方法

  • – play
  • – pause
  • – stop
  • – beginSeekingForward
  • – beginSeekingBackward
  • – endSeeking
  • – skipToNextItem
  • – skipToBeginning
  • – skipToPreviousItem

播放状态发生变化时可以发送通知

  • – beginGeneratingPlaybackNotifications
  • – endGeneratingPlaybackNotifications

MPMusicPlayerControllerPlaybackStateDidChangeNotification

可以通过该通知来改变播放按钮的样式

MPMusicPlayerControllerNowPlayingItemDidChangeNotification

MPMusicPlayerControllerVolumeDidChangeNotification


具体步骤

1.注册和开始发送通知



1. Listing 2-1  Registering for and activating music player notifications  
2. NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];  
3.    
4. [notificationCenter  
5.     addObserver: self  
6.     selector:    @selector (handle_NowPlayingItemChanged:)  
7.     name:        MPMusicPlayerControllerNowPlayingItemDidChangeNotification  
8.     object:      musicPlayer];  
9.    
10. [notificationCenter  
11.     addObserver: self  
12.     selector:    @selector (handle_PlaybackStateChanged:)  
13.     name:        MPMusicPlayerControllerPlaybackStateDidChangeNotification  
14.     object:      musicPlayer];  
15.    
16. [musicPlayer beginGeneratingPlaybackNotifications];




1. Listing 2-2  Unregistering and deactivating music player notifications  
2. [[NSNotificationCenter defaultCenter]  
3.     removeObserver: self  
4.     name:           MPMusicPlayerControllerNowPlayingItemDidChangeNotification  
5.     object:         musicPlayer];  
6.    
7. [[NSNotificationCenter defaultCenter]  
8.     removeObserver: self  
9.     name:           MPMusicPlayerControllerPlaybackStateDidChangeNotification  
10.     object:         musicPlayer];  
11.    
12. [musicPlayer endGeneratingPlaybackNotifications];


2.创建并配置一个Music Player






1. Listing 2-3  Creating an application music player  
2. MPMusicPlayerController* appMusicPlayer =  
3.     [MPMusicPlayerController applicationMusicPlayer];  
4.    
5. [appMusicPlayer setShuffleMode: MPMusicShuffleModeOff];  
6. [appMusicPlayer setRepeatMode: MPMusicRepeatModeNone];


1. Listing 2-4  Creating an iPod music player  
2. MPMusicPlayerController* iPodMusicPlayer =  
3.     [MPMusicPlayerController iPodMusicPlayer];  
4.    
5. if ([iPodMusicPlayer nowPlayingItem]) {  
6.     // Update the UI (artwork, song name, volume indicator, etc.)  
7.     //        to reflect the iPod state  
8. }



3.设置播放队列



  • – setQueueWithQuery:
  • – setQueueWithItemCollection:

4.控制播放



3.MPMediaPickerController的使用




1. <span style="font-size:18px;">- (IBAction)addSongsToMusicPlayer:(id)sender  
2. {  
3.     MPMediaPickerController *mpController = [[MPMediaPickerController alloc] initWithMediaTypes:MPMediaTypeMusic];  
4.     mpController.delegate = self;  
5.     mpController.prompt = @"Add songs to play";  
6.     mpController.allowsPickingMultipleItems = YES;  
7.       
8.     [self presentModalViewController:mpController animated:YES];  
9.     [mpController release];  
10. }  
11. </span>


主要是设置代理和选择多媒体类型,然后通过代理方法来获取选中的歌曲




1. <span style="font-size:18px;">#pragma mark - Media Picker Delegate Methods  
2.   
3. - (void)mediaPicker:(MPMediaPickerController *)mediaPicker didPickMediaItems:(MPMediaItemCollection *)mediaItemCollection  
4. {  
5.     [self.musicPlayer setQueueWithItemCollection:mediaItemCollection];  
6.     [self dismissModalViewControllerAnimated:YES];  
7. }  
8.   
9. - (void)mediaPickerDidCancel:(MPMediaPickerController *)mediaPicker  
10. {  
11.     [self dismissModalViewControllerAnimated:YES];  
12. }</span>



4.MPMediaItem



用此方法来获取item的metadata





1. - (id) valueForProperty: (NSString *) property  
 
  

NSString *const MPMediaItemPropertyTitle;                   
NSString *const MPMediaItemPropertyAlbumTitle;              
NSString *const MPMediaItemPropertyArtist;


5.MPMediaItemCollection



collection是一组有序的item集合,可用同样的方法来获取collection的metadata






1. - (id) valueForProperty: (NSString *) property


创建



  • + collectionWithItems:
  • – initWithItems:

属性

  •   items
  •   property
  •   count
  •   property

6.MPMediaPlaylist






    1. MPMediaQuery *myPlaylistsQuery = [MPMediaQuery playlistsQuery];  
    2. NSArray *playlists = [myPlaylistsQuery collections];  
    3.    
    4. for (MPMediaPlaylist *playlist in playlists) {  
    5.     NSLog (@"%@", [playlist valueForProperty: MPMediaPlaylistPropertyName]);  
    6.    
    7.     NSArray *songs = [playlist items];  
    8.     for (MPMediaItem *song in songs) {  
    9.         NSString *songTitle =  
    10.             [song valueForProperty: MPMediaItemPropertyTitle];  
    11.         NSLog (@"\t\t%@", songTitle);  
    12.     }  
    13. }






    7.MPMediaQuery

    需要设置两个属性: filter  and  grouping type

    filter描述查询内容,grouping type 描述返回内容的排列方式



    查询可以获取items,也可以获取collections

    • When you ask for items, the query returns a collection containing all the items that match the filter. The items are in “natural” order, meaning that they are ordered as iTunes shows them on the desktop.
    • When you ask for collections, the media query employs not only its filter but also its grouping type.






    获取全部歌曲






      1. MPMediaQuery *everything = [[MPMediaQuery alloc] init];   
      2. NSLog(@"Logging items from a generic query...");  
      3. NSArray *itemsFromGenericQuery = [everything items];  
      4. for (MPMediaItem *song in itemsFromGenericQuery) {  
      5.     NSString *songTitle = [song valueForProperty: MPMediaItemPropertyTitle];  
      6.     NSLog (@"%@", songTitle);  
      7. }





      获取名为“Happy the Clown”的艺术家的歌曲





      1. MPMediaPropertyPredicate *artistNamePredicate =  
      2.     [MPMediaPropertyPredicate predicateWithValue: @"Happy the Clown"  
      3.                                      forProperty: MPMediaItemPropertyArtist];  
      4.    
      5. MPMediaQuery *myArtistQuery = [[MPMediaQuery alloc] init];  
      6. [myArtistQuery addFilterPredicate: artistNamePredicate];  
      7.    
      8. NSArray *itemsFromArtistQuery = [myArtistQuery items];


      多个查找条件,查找名为"Sad the Joker"的艺术家的"Stair Tumbling"专辑




      1. MPMediaPropertyPredicate *artistNamePredicate =  
      2.     [MPMediaPropertyPredicate predicateWithValue: @"Sad the Joker"  
      3.                                      forProperty: MPMediaItemPropertyArtist];  
      4.    
      5. MPMediaPropertyPredicate *albumNamePredicate =  
      6.     [MPMediaPropertyPredicate predicateWithValue: @"Stair Tumbling"  
      7.                                      forProperty: MPMediaItemPropertyAlbumTitle];  
      8.    
      9. MPMediaQuery *myComplexQuery = [[MPMediaQuery alloc] init];  
      10.    
      11. [myComplexQuery addFilterPredicate: artistNamePredicate];  
      12. [myComplexQuery addFilterPredicate: albumNamePredicate];






      1. Listing 4-4  Applying multiple predicates when initializing a media query  
      2. NSSet *predicates =  
      3.     [NSSet setWithObjects: artistNamePredicate, albumNamePredicate, nil];  
      4.    
      5. MPMediaQuery *specificQuery =  
      6.     [[MPMediaQuery alloc] initWithFilterPredicates: predicates];





      1. Listing 4-5  Testing if a property key can be used for a media property predicate  
      2. if ([MPMediaItem canFilterByProperty: MPMediaItemPropertyGenre]) {  
      3.     MPMediaPropertyPredicate *rockPredicate =  
      4.         [MPMediaPropertyPredicate predicateWithValue: @"Rock"  
      5.                                          forProperty: MPMediaItemPropertyGenre];  
      6.     [query addFilterPredicate: rockPredicate];  
      7. }







      1. Listing 4-6  Using grouping type to specify media item collections  
      2. MPMediaQuery *query = [[MPMediaQuery alloc] init];  
      3.    
      4. [query addFilterPredicate: [MPMediaPropertyPredicate  
      5.                                predicateWithValue: @"Moribund the Squirrel"  
      6.                                       forProperty: MPMediaItemPropertyArtist]];  
      7. // Sets the grouping type for the media query  
      8. [query setGroupingType: MPMediaGroupingAlbum];  
      9.    
      10. NSArray *albums = [query collections];  
      11. for (MPMediaItemCollection *album in albums) {  
      12.     MPMediaItem *representativeItem = [album representativeItem];  
      13.     NSString *artistName =  
      14.         [representativeItem valueForProperty: MPMediaItemPropertyArtist];  
      15.     NSString *albumName =  
      16.         [representativeItem valueForProperty: MPMediaItemPropertyAlbumTitle];  
      17.     NSLog (@"%@ by %@", albumName, artistName);  
      18.    
      19.     NSArray *songs = [album items];  
      20.     for (MPMediaItem *song in songs) {  
      21.         NSString *songTitle =  
      22.             [song valueForProperty: MPMediaItemPropertyTitle];  
      23.         NSLog (@"\t\t%@", songTitle);  
      24.     }  
      25. }




      query的一些简便构造方法





      专辑封面的使用







      1. Listing 4-7  Displaying album artwork for a media item  
      2. MPMediaItemArtwork *artwork =  
      3.     [mediaItem valueForProperty: MPMediaItemPropertyArtwork];  
      4. UIImage *artworkImage =  
      5.     [artwork imageWithSize: albumImageView.bounds.size];  
      6. if (artworkImage) {  
      7.     albumImageView.image = artworkImage;  
      8. } else {  
      9.     albumImageView.image = [UIImage imageNamed: @"noArtwork.png"];  
      10. }  
      11.