忍者ブログ
  • 2024.10
  • 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
  • 26
  • 27
  • 28
  • 29
  • 30
  • 2024.12
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

【2024/11/22 13:27 】 |
iPhone内の曲のリストを表示する
iPhoneアプリで、自分のiPhoneに入ってる好きな曲をBGMにできたりするものがある。

そういうときに表示される表(UITableViewController)の使い方。

iOS的には、ああいうのを「ピッカー」(picker)と呼ぶらしい。
iPhoneに入っている曲を表示するのは MPMediaPickerControllerView。
iPhoneに入っている画像を表示するのは UIImagePickerControllerView。
どっちも使い方はだいたい同じ。
(というか、書籍とか調べてもMPMediaPickerControllerViewについては全然書いてなくて、
 XCodeからヘルプで名前の類推して"PickerControllerView"で検索してやっと探し当てた。
 使い方は書籍に書いてあったUIImagePickerControllerViewとまったく同じにやってみたらそのままできた)

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
【2011/08/18 03:04 】 | iPhone | 有り難いご意見(1) | トラックバック()
<<サウンドを鳴らす | ホーム | pngを描画したい人>>
有り難いご意見
無題
既にご存知かとは思いますがXCode4でのフレームワークの追加方法を下記に記載します。

1.メインメニューのView -> Navigators ->Show Project Navigatorを選択します。
2.ウィンドウ左カラムの一番上の青いプロジェクトアイコンを選択します。
3.メイン画面左部、PROJECTとTARGETSの選択画面でTARGETSを選択します。
4.メイン画面上部のBuild Phasesタブを選択します。
5.メイン画面でLink Binary With Librariesの▲をクリックして展開します。
6.枠の左下部に表示されている+を選択します。
7.追加したいframeworkを選んでAddで決定します。

一気に変わりすぎですよね..。
【2012/02/02 23:42】| | masa #99d0d689c7 [ 編集 ]


貴重なご意見の投稿














虎カムバック
トラックバックURL

<<前ページ | ホーム | 次ページ>>