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]; |
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 } |
- – setQueueWithQuery:
- – setQueueWithItemCollection:
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); } |
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]; |
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); } } |
專輯封面的使用
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" ]; } |