1.
まず、MediaPlayer.framwork をプロジェクトに追加。
(XCode4になってから、フレームワークの追加の仕方が分からなくなった。
とりあえず、デフォルトで追加されているフレームワークを右クリック→Finderで表示、でフレームワーク置き場が表示される。
そこから欲しいフレームワークをドラッグ&ドロップ)
2.
ファイルに
#import <MediaPlayer/MediaPlayer.h>
を記述。
3.
呼び出し部の記述。
MPMediaPickerController *picker = [[MPMediaPickerController alloc] init];
picker.delegate = self; //デレゲート
picker.allowsPickingMultipleItems = false; //曲の複数選択をさせる・させない
[self presentModalViewController:picker animated:YES];
ここが実行されると、曲リストが下からニュッと出て来る。
ちなみにここで、
MPMediaPickerController *picker = [[MPMediaPickerController alloc] initWithMediaTypes:MPMediaTypeMusic];
または
picker.mediaTypes = MPMediaTypeMusic;
のようにすると、音楽だけを表示するようにできる。その他
MPMediaTypePodcast
MPMediaTypeAudioBook
MPMediaTypeAnyAudio(これがデフォルト)
が指定できる。
4.
デレゲートクラスにプロトコルを宣言・実装する。
必要なメソッドは2つ。曲を選択したときに呼ばれるメソッドと、キャンセルしたときに呼ばれるメソッド。
宣言
@interface XXXX : YYYY<MPMediaPickerControllerDelegate> {
}
- (void)mediaPicker: (MPMediaPickerController *)mediaPicker didPickMediaItems:(MPMediaItemCollection *)mediaItemCollection;
- (void)mediaPickerDidCancel:(MPMediaPickerController *)mediaPicker;
@end
実装例
//曲を選択したとき
- (void)mediaPicker: (MPMediaPickerController *)mediaPicker didPickMediaItems:(MPMediaItemCollection *)mediaItemCollection
{
printf("%d個のアイテムを選択した\n", [mediaItemCollection count]);
//全部の曲名を表示
NSArray *array = [mediaItemCollection items];
for (id item in array) {
MPMediaItem *mediaItem = (MPMediaItem*)item;
NSLog(@"title:%@", [mediaItem valueForProperty:MPMediaItemPropertyTitle]);
}
representativeItem_ = [mediaItemCollection representativeItem]; //どれか1曲を返す(どれなのかはよくわからない)
//NSLog(@"title:%@", [bgmMediaItem_ valueForProperty:MPMediaItemPropertyTitle]);
//1曲選んだ瞬間、終了する場合はこの行を有効にする
//[self mediaPickerDidCancel:mediaPicker];
}
//キャンセルしたとき
- (void)mediaPickerDidCancel:(MPMediaPickerController *)mediaPicker
{
[self dismissModalViewControllerAnimated:YES];
}
これだけで使える。
mediaPickerDidCancelが呼ばれる条件は、1曲も選択せずに完了ボタン(またはキャンセルボタン)を押したとき。(複数曲が選べるときは完了ボタン、選べないときはキャンセルボタンになってる)
また、複数曲選択できる状態でmediaPicker:didPickMediaItems が呼ばれるのは、最後に完了ボタンを押したときだけ。
つまり、複数曲選択できようができまいが、曲を選ぼうが選ぶまいが、
mediaPicker:didPickMediaItems と mediaPickerDidCancel のどちらかがただ1回だけ呼ばれる、ということは変わらない。
だから、mediaPicker:didPickMediaItems のほうでもウィンドウを閉じる処理は必ずやっておかないといけない。
mediaPicker:didPickMediaItems の末尾でmediaPickerDidCancelを呼び出すというやり方をしてもいいんじゃないのかな。
MediaItem の情報を取得するには、
//NSLog(@"title:%@", [bgmMediaItem_ valueForProperty:MPMediaItemPropertyTitle]);
のようにする。valueForProperty に NSString でプロパティを指定すると、対応する情報が返って来る。(@""だが、全部 MPMediaItemPropertyXXXX と定数定義されている)
試しに全部出力してみたのが以下。
NSLog(@"persistentID:%llu", [(NSNumber*)[bgmMediaItem_ valueForProperty:MPMediaItemPropertyPersistentID] unsignedLongLongValue]);
NSLog(@"mediaType :%d", (NSInteger)[bgmMediaItem_ valueForProperty:MPMediaItemPropertyTitle]);
NSLog(@"title :%@", [bgmMediaItem_ valueForProperty:MPMediaItemPropertyTitle]);
NSLog(@"albumTitle :%@", [bgmMediaItem_ valueForProperty:MPMediaItemPropertyAlbumTitle]);
NSLog(@"albumPID :%llu", [(NSNumber*)[bgmMediaItem_ valueForProperty:MPMediaItemPropertyAlbumPersistentID] unsignedLongLongValue]);
NSLog(@"artist :%@", [bgmMediaItem_ valueForProperty:MPMediaItemPropertyArtist]);
NSLog(@"artistPID :%llu", [(NSNumber*)[bgmMediaItem_ valueForProperty:MPMediaItemPropertyArtistPersistentID] unsignedLongLongValue]);
NSLog(@"albumArtist :%@", [bgmMediaItem_ valueForProperty:MPMediaItemPropertyAlbumArtist]);
NSLog(@"albmArtstPID:%llu", [(NSNumber*)[bgmMediaItem_ valueForProperty:MPMediaItemPropertyAlbumArtistPersistentID] unsignedLongLongValue]);
NSLog(@"genre :%@", [bgmMediaItem_ valueForProperty:MPMediaItemPropertyGenre]);
NSLog(@"genrePID :%llu", [(NSNumber*)[bgmMediaItem_ valueForProperty:MPMediaItemPropertyGenrePersistentID] unsignedLongLongValue]);
NSLog(@"composer :%@", [bgmMediaItem_ valueForProperty:MPMediaItemPropertyComposer]);
NSLog(@"composerPID :%llu", [(NSNumber*)[bgmMediaItem_ valueForProperty:MPMediaItemPropertyComposerPersistentID] unsignedLongLongValue]);
NSLog(@"playbackDura:%f", [(NSNumber*)[bgmMediaItem_ valueForProperty:MPMediaItemPropertyPlaybackDuration] doubleValue] );
NSLog(@"albumTrackNo:%u", [(NSNumber*)[bgmMediaItem_ valueForProperty:MPMediaItemPropertyAlbumTrackNumber] unsignedIntValue]);
NSLog(@"albumTrackCo:%u", [(NSNumber*)[bgmMediaItem_ valueForProperty:MPMediaItemPropertyAlbumTrackCount] unsignedIntValue]);
NSLog(@"discNumber :%u", [(NSNumber*)[bgmMediaItem_ valueForProperty:MPMediaItemPropertyDiscNumber] unsignedIntValue]);
NSLog(@"discCount :%u", [(NSNumber*)[bgmMediaItem_ valueForProperty:MPMediaItemPropertyDiscCount] unsignedIntValue]);
NSLog(@"artwork :%p", (MPMediaItemArtwork*)[bgmMediaItem_ valueForProperty:MPMediaItemPropertyArtwork]);
NSLog(@"lyrics :%@", [bgmMediaItem_ valueForProperty:MPMediaItemPropertyLyrics]);
NSLog(@"isCompilat :%d", [(NSNumber*)[bgmMediaItem_ valueForProperty:MPMediaItemPropertyIsCompilation] boolValue]);
NSLog(@"releaseData :%@", [(NSDate*)[bgmMediaItem_ valueForProperty:MPMediaItemPropertyReleaseDate] description]);
NSLog(@"beats/Min :%u", [(NSNumber*)[bgmMediaItem_ valueForProperty:MPMediaItemPropertyBeatsPerMinute] unsignedIntValue]);
NSLog(@"comments :%@", [bgmMediaItem_ valueForProperty:MPMediaItemPropertyComments]);
NSLog(@"assetURL :%@", [bgmMediaItem_ valueForProperty:MPMediaItemPropertyAssetURL]);
NSLog(@"podcastTitle:%@", [bgmMediaItem_ valueForProperty:MPMediaItemPropertyPodcastTitle]);
//NSLog(@"podcastPID :%@", [(NSNumber*)[bgmMediaItem_ valueForProperty:MPMediaItemPropertyPodcastPersistentID] unsignedLongLongValue]);
NSLog(@"playCount :%u", [(NSNumber*)[bgmMediaItem_ valueForProperty:MPMediaItemPropertyPlayCount] unsignedIntValue]);
NSLog(@"skipCount :%u", [(NSNumber*)[bgmMediaItem_ valueForProperty:MPMediaItemPropertySkipCount] unsignedIntValue]);
NSLog(@"rating :%u", [(NSNumber*)[bgmMediaItem_ valueForProperty:MPMediaItemPropertyRating] unsignedIntValue]);
NSLog(@"lastPlayDate:%@", [(NSDate*)[bgmMediaItem_ valueForProperty:MPMediaItemPropertyLastPlayedDate] description]);
NSLog(@"userGrouping:%@", [bgmMediaItem_ valueForProperty:MPMediaItemPropertyUserGrouping]);
PodcastPersistentIDだけは、表示しようとするとBAD ACCESS例外になったのでコメントアウト。なぜかはわからない。
ついでに、フレームワークのヘッダにあった定義はこう。
MP_EXTERN NSString *const MPMediaItemPropertyPersistentID; // @"persistentID", NSNumber of uint64_t (unsigned long long), filterable
MP_EXTERN NSString *const MPMediaItemPropertyMediaType; // @"mediaType", NSNumber of MPMediaType (NSInteger), filterable
MP_EXTERN NSString *const MPMediaItemPropertyTitle; // @"title", NSString, filterable
MP_EXTERN NSString *const MPMediaItemPropertyAlbumTitle; // @"albumTitle", NSString, filterable
MP_EXTERN NSString *const MPMediaItemPropertyAlbumPersistentID NS_AVAILABLE_IPHONE(4_2);
// @"albumPID", NSNumber of uint64_t (unsigned long long), filterable
MP_EXTERN NSString *const MPMediaItemPropertyArtist; // @"artist", NSString, filterable
MP_EXTERN NSString *const MPMediaItemPropertyArtistPersistentID NS_AVAILABLE_IPHONE(4_2);
// @"artistPID", NSNumber of uint64_t (unsigned long long), filterable
MP_EXTERN NSString *const MPMediaItemPropertyAlbumArtist; // @"albumArtist", NSString, filterable
MP_EXTERN NSString *const MPMediaItemPropertyAlbumArtistPersistentID NS_AVAILABLE_IPHONE(4_2);
// @"albumArtistPID", NSNumber of uint64_t (unsigned long long), filterable
MP_EXTERN NSString *const MPMediaItemPropertyGenre; // @"genre", NSString, filterable
MP_EXTERN NSString *const MPMediaItemPropertyGenrePersistentID NS_AVAILABLE_IPHONE(4_2);
// @"genrePID", NSNumber of uint64_t (unsigned long long), filterable
MP_EXTERN NSString *const MPMediaItemPropertyComposer; // @"composer", NSString, filterable
MP_EXTERN NSString *const MPMediaItemPropertyComposerPersistentID NS_AVAILABLE_IPHONE(4_2);
// @"composerPID", NSNumber of uint64_t (unsigned long long), filterable
MP_EXTERN NSString *const MPMediaItemPropertyPlaybackDuration; // @"playbackDuration", NSNumber of NSTimeInterval (double)
MP_EXTERN NSString *const MPMediaItemPropertyAlbumTrackNumber; // @"albumTrackNumber", NSNumber of NSUInteger
MP_EXTERN NSString *const MPMediaItemPropertyAlbumTrackCount; // @"albumTrackCount", NSNumber of NSUInteger
MP_EXTERN NSString *const MPMediaItemPropertyDiscNumber; // @"discNumber", NSNumber of NSUInteger
MP_EXTERN NSString *const MPMediaItemPropertyDiscCount; // @"discCount", NSNumber of NSUInteger
MP_EXTERN NSString *const MPMediaItemPropertyArtwork; // @"artwork", MPMediaItemArtwork
MP_EXTERN NSString *const MPMediaItemPropertyLyrics; // @"lyrics", NSString
MP_EXTERN NSString *const MPMediaItemPropertyIsCompilation; // @"isCompilation", NSNumber of BOOL, filterable
MP_EXTERN NSString *const MPMediaItemPropertyReleaseDate NS_AVAILABLE_IPHONE(4_0);
// @"releaseDate", NSDate
MP_EXTERN NSString *const MPMediaItemPropertyBeatsPerMinute NS_AVAILABLE_IPHONE(4_0);
// @"beatsPerMinute", NSNumber of NSUInteger
MP_EXTERN NSString *const MPMediaItemPropertyComments NS_AVAILABLE_IPHONE(4_0);
// @"comments", NSString
MP_EXTERN NSString *const MPMediaItemPropertyAssetURL NS_AVAILABLE_IPHONE(4_0);
// @"assetURL", NSURL
// Podcast properties
MP_EXTERN NSString *const MPMediaItemPropertyPodcastTitle; // @"podcastTitle", NSString, filterable
MP_EXTERN NSString *const MPMediaItemPropertyPodcastPersistentID NS_AVAILABLE_IPHONE(4_2);
// @"podcastPID", NSNumber of uint64_t (unsigned long long), filterable
// User properties
MP_EXTERN NSString *const MPMediaItemPropertyPlayCount; // @"playCount", NSNumber of NSUInteger
MP_EXTERN NSString *const MPMediaItemPropertySkipCount; // @"skipCount", NSNumber of NSUInteger
MP_EXTERN NSString *const MPMediaItemPropertyRating; // @"rating", NSNumber of NSUInteger, 0...5
MP_EXTERN NSString *const MPMediaItemPropertyLastPlayedDate; // @"lastPlayedDate", NSDate
MP_EXTERN NSString *const MPMediaItemPropertyUserGrouping NS_AVAILABLE_IPHONE(4_0);
// @"userGrouping", NSString
PR