訪問iPod Library及MPMusicPlayerController


1.訪問音樂庫的兩種方法,

(只能訪問音頻文件,如music,podcast,audiobook等)

2.MPMusicPlayerController的使用

有兩種播放器可以選擇,一種是application music player,另外一種是iPod music player。

第一種播放器是一種內部播放器,當程序對出後停止播放;而第二種播放器則與iPod播放器內的信息相關,退出之後不會停止播放。獲取方式如下:

  • + applicationMusicPlayer
  • + iPodMusicPlayer

播放之前需要設置播放器的播放隊列

  • – setQueueWithQuery:
  • – setQueueWithItemCollection:

管理播放模式和播放狀態的一些屬性

  •   currentPlaybackTime  property
  •   nowPlayingItem  property
  •   playbackState  property
  •   repeatMode  property
  •   shuffleMode  property
  •   volume  property

播放狀態 MPMusicPlaybackState

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Listing 2-1  Registering for and activating music player notifications
NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
  
[notificationCenter
    addObserver: self
    selector:    @selector (handle_NowPlayingItemChanged:)
    name:        MPMusicPlayerControllerNowPlayingItemDidChangeNotification
    object:      musicPlayer];
  
[notificationCenter
    addObserver: self
    selector:    @selector (handle_PlaybackStateChanged:)
    name:        MPMusicPlayerControllerPlaybackStateDidChangeNotification
    object:      musicPlayer];
  
[musicPlayer beginGeneratingPlaybackNotifications];
1
2
3
4
5
6
7
8
9
10
11
12
Listing 2-2  Unregistering and deactivating music player notifications
[[NSNotificationCenter defaultCenter]
    removeObserver: self
    name:           MPMusicPlayerControllerNowPlayingItemDidChangeNotification
    object:         musicPlayer];
  
[[NSNotificationCenter defaultCenter]
    removeObserver: self
    name:           MPMusicPlayerControllerPlaybackStateDidChangeNotification
    object:         musicPlayer];
  
[musicPlayer endGeneratingPlaybackNotifications];
2.創建並配置一個Music Player 

 

 

1
2
3
4
5
6
Listing 2-3  Creating an application music player
MPMusicPlayerController* appMusicPlayer =
    [MPMusicPlayerController applicationMusicPlayer];
  
[appMusicPlayer setShuffleMode: MPMusicShuffleModeOff];
[appMusicPlayer setRepeatMode: MPMusicRepeatModeNone];
1
2
3
4
5
6
7
8
Listing 2-4  Creating an iPod music player
MPMusicPlayerController* iPodMusicPlayer =
    [MPMusicPlayerController iPodMusicPlayer];
  
if ([iPodMusicPlayer nowPlayingItem]) {
    // Update the UI (artwork, song name, volume indicator, etc.)
    //        to reflect the iPod state
}
3.設置播放隊列

 

 

  • – setQueueWithQuery:
  • – setQueueWithItemCollection:
4.控制播放

3.MPMediaPickerController的使用

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

主要是設置代理和選擇多媒體類型,然後通過代理方法來獲取選中的歌曲

 

1
2
3
4
5
6
7
8
9
10
11
12
#pragma mark - Media Picker Delegate Methods
 
- (void)mediaPicker:(MPMediaPickerController *)mediaPicker didPickMediaItems:(MPMediaItemCollection *)mediaItemCollection
{
    [self.musicPlayer setQueueWithItemCollection:mediaItemCollection];
    [self dismissModalViewControllerAnimated:YES];
}
 
- (void)mediaPickerDidCancel:(MPMediaPickerController *)mediaPicker
{
    [self dismissModalViewControllerAnimated:YES];
}

 

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
  •   representativeItem  property
  •   count  property
  •   mediaTypes  property

6.MPMediaPlaylist

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

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
2
3
4
5
6
7
MPMediaQuery *everything = [[MPMediaQuery alloc] init];
NSLog(@"Logging items from a generic query...");
NSArray *itemsFromGenericQuery = [everything items];
for (MPMediaItem *song in itemsFromGenericQuery) {
    NSString *songTitle = [song valueForProperty: MPMediaItemPropertyTitle];
    NSLog (@"%@", songTitle);
}
獲取名爲“Happy the Clown”的藝術家的歌曲
1
2
3
4
5
6
7
8
MPMediaPropertyPredicate *artistNamePredicate =
    [MPMediaPropertyPredicate predicateWithValue: @"Happy the Clown"
                                     forProperty: MPMediaItemPropertyArtist];
  
MPMediaQuery *myArtistQuery = [[MPMediaQuery alloc] init];
[myArtistQuery addFilterPredicate: artistNamePredicate];
  
NSArray *itemsFromArtistQuery = [myArtistQuery items];
多個查找條件,查找名爲"Sad the Joker"的藝術家的"Stair Tumbling"專輯
1
2
3
4
5
6
7
8
9
10
11
12
MPMediaPropertyPredicate *artistNamePredicate =
    [MPMediaPropertyPredicate predicateWithValue: @"Sad the Joker"
                                     forProperty: MPMediaItemPropertyArtist];
  
MPMediaPropertyPredicate *albumNamePredicate =
    [MPMediaPropertyPredicate predicateWithValue: @"Stair Tumbling"
                                     forProperty: MPMediaItemPropertyAlbumTitle];
  
MPMediaQuery *myComplexQuery = [[MPMediaQuery alloc] init];
  
[myComplexQuery addFilterPredicate: artistNamePredicate];
[myComplexQuery addFilterPredicate: albumNamePredicate];
1
2
3
4
5
6
Listing 4-4  Applying multiple predicates when initializing a media query
NSSet *predicates =
    [NSSet setWithObjects: artistNamePredicate, albumNamePredicate, nil];
  
MPMediaQuery *specificQuery =
    [[MPMediaQuery alloc] initWithFilterPredicates: predicates];
1
2
3
4
5
6
7
Listing 4-5  Testing if a property key can be used for a media property predicate
if ([MPMediaItem canFilterByProperty: MPMediaItemPropertyGenre]) {
    MPMediaPropertyPredicate *rockPredicate =
        [MPMediaPropertyPredicate predicateWithValue: @"Rock"
                                         forProperty: MPMediaItemPropertyGenre];
    [query addFilterPredicate: rockPredicate];
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Listing 4-6  Using grouping type to specify media item collections
MPMediaQuery *query = [[MPMediaQuery alloc] init];
  
[query addFilterPredicate: [MPMediaPropertyPredicate
                               predicateWithValue: @"Moribund the Squirrel"
                                      forProperty: MPMediaItemPropertyArtist]];
// Sets the grouping type for the media query
[query setGroupingType: MPMediaGroupingAlbum];
  
NSArray *albums = [query collections];
for (MPMediaItemCollection *album in albums) {
    MPMediaItem *representativeItem = [album representativeItem];
    NSString *artistName =
        [representativeItem valueForProperty: MPMediaItemPropertyArtist];
    NSString *albumName =
        [representativeItem valueForProperty: MPMediaItemPropertyAlbumTitle];
    NSLog (@"%@ by %@", albumName, artistName);
  
    NSArray *songs = [album items];
    for (MPMediaItem *song in songs) {
        NSString *songTitle =
            [song valueForProperty: MPMediaItemPropertyTitle];
        NSLog (@"\t\t%@", songTitle);
    }
}
query的一些簡便構造方法

專輯封面的使用
1
2
3
4
5
6
7
8
9
10
Listing 4-7  Displaying album artwork for a media item
MPMediaItemArtwork *artwork =
    [mediaItem valueForProperty: MPMediaItemPropertyArtwork];
UIImage *artworkImage =
    [artwork imageWithSize: albumImageView.bounds.size];
if (artworkImage) {
    albumImageView.image = artworkImage;
} else {
    albumImageView.image = [UIImage imageNamed: @"noArtwork.png"];
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章