• ios获取音乐库信息(转)


    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

    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.注册和开始发送通知

     

    [plain] view plaincopyprint?
     
    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];  

     

     

    [plain] view plaincopyprint?
     
    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

     

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

     

     

    [plain] view plaincopyprint?
     
    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的使用

     

    [plain] view plaincopyprint?
     
    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>  


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

     

     

    [plain] view plaincopyprint?
     
    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
    [plain] view plaincopyprint?
     
    1. - (id) valueForProperty: (NSString *) property  

     

    NSString *const MPMediaItemPropertyTitle;                   

    NSString *const MPMediaItemPropertyAlbumTitle;              

    NSString *const MPMediaItemPropertyArtist;                 

     

     

    5.MPMediaItemCollection

    collection是一组有序的item集合,可用同样的方法来获取collection的metadata
    [plain] view plaincopyprint?
     
    1. - (id) valueForProperty: (NSString *) property  
     
    创建
    • + collectionWithItems:
    • – initWithItems:

    属性

    •   items  property
    •   representativeItem  property
    •   count  property
    •   mediaTypes  property

    6.MPMediaPlaylist

    [plain] view plaincopyprint?
     
    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.

     
    获取全部歌曲
    [plain] view plaincopyprint?
     
    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”的艺术家的歌曲
    [plain] view plaincopyprint?
     
    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"专辑
    [plain] view plaincopyprint?
     
    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];  
     
     
    [plain] view plaincopyprint?
     
    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];  

    [plain] view plaincopyprint?
     
    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. }  
     
     
    [plain] view plaincopyprint?
     
    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的一些简便构造方法


    专辑封面的使用
     
    [plain] view plaincopyprint?
     
    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. }  
  • 相关阅读:
    兼容ie8 rgba()用法 滤镜filter的用法
    解決BufferedReader读取UTF-8文件中文乱码
    基于JavaScript实现表单密码的隐藏和显示出来
    Java多线程学习(转载)
    使用java 程序创建格式为utf-8文件的方法(写入和读取json文件)
    java获取classpath文件路径空格转变成了转义字符%20的问题
    java中Class.getResource用法
    事务传播行为和特性
    事务隔离级别
    使用Condition循环依次打印123
  • 原文地址:https://www.cnblogs.com/lyanet/p/2985019.html
Copyright © 2020-2023  润新知