zoukankan      html  css  js  c++  java
  • 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. }  
  • 相关阅读:
    linux权限补充:rwt rwT rws rwS 特殊权限
    关于Linux操作系统下文件特殊权限的解释
    Java学习笔记——Java程序运行超时后退出或进行其他操作的实现
    Java实现 蓝桥杯 算法提高 判断名次
    Java实现 蓝桥杯 算法提高 判断名次
    Java实现 蓝桥杯 算法提高 日期计算
    Java实现 蓝桥杯 算法提高 日期计算
    Java实现 蓝桥杯 算法提高 概率计算
    Java实现 蓝桥杯 算法提高 概率计算
    Java实现 蓝桥杯 算法提高 复数四则运算
  • 原文地址:https://www.cnblogs.com/lyanet/p/2985019.html
Copyright © 2011-2022 走看看