【问题标题】:Access device music files from iPhone app programmatically以编程方式从 iPhone 应用程序访问设备音乐文件
【发布时间】:2012-02-22 02:44:15
【问题描述】:

我想访问 iPhone 上可用的音乐文件并将其列出(或)将文件放入我的 iPhone 应用程序中并开始播放。有可能吗?类似于我们使用 UIImagePickerController 委托方法访问设备相册中的图像。

谢谢!

【问题讨论】:

    标签: iphone ios mpmediapickercontroller mpmediaquery


    【解决方案1】:

    您可以参考@987654321@。它的功能与UIImagePickerController 类相同。

    【讨论】:

    • 好的,谢谢!我会马上检查一下。只有一个问题,它适用于所有 iOS 4.x 和 5.x 设备,对吧?
    • ios10 还需要 plist 中的 NSAppleMusicUsageDescription 以使 MPMediaPickerController 的呈现工作。否则它只会闪烁白色并消失。在用户拒绝访问音乐的情况下也是如此。苹果干得好!
    • 将iTunes购买的音乐复制到应用沙箱并上传到服务器是否合法?
    【解决方案2】:
    -(void)loadDeviceMusic{
         MPMediaQuery *everything = [[MPMediaQuery alloc] init];
        [everything addFilterPredicate:[MPMediaPropertyPredicate predicateWithValue:[NSNumber numberWithBool:NO] forProperty:MPMediaItemPropertyIsCloudItem]];
        NSArray *itemsFromGenericQuery = [everything items];
        for (MPMediaItem *song in itemsFromGenericQuery) {
        NSURL *assetURL = [song valueForProperty:MPMediaItemPropertyAssetURL];
        AVAsset *asset = [AVAsset assetWithURL:assetURL];
        NSLog(@"SONGS URL=%@",assetURL);
        if ([asset hasProtectedContent] == NO) {
            MP3ObjectsClass *objMp3=[[MP3ObjectsClass alloc] init];
            objMp3.mp3Url=[song valueForProperty:MPMediaItemPropertyAssetURL];
    
            objMp3.mp3Duration=[song valueForProperty: MPMediaItemPropertyPlaybackDuration];
    
            if([song valueForProperty: MPMediaItemPropertyTitle]){
                objMp3.mp3Name=[song valueForProperty: MPMediaItemPropertyTitle];
            }else{
                objMp3.mp3Name=@"Unknown";
            }
            if([song valueForProperty: MPMediaItemPropertyArtist]){
                objMp3.mp3ArtistName=[song valueForProperty: MPMediaItemPropertyArtist];
            }else{
                objMp3.mp3ArtistName=@"Unknown";
            }
            if([song valueForProperty: MPMediaItemPropertyAlbumTitle]){
                objMp3.mp3AlbumTitle=[song valueForProperty: MPMediaItemPropertyAlbumTitle];
            }else{
                objMp3.mp3AlbumTitle=@"Unknown";
            }
            UIImage *mp3Image=[self getAlbumnArtWorkImage:assetURL];
            if(mp3Image){
                objMp3.mp3Image=mp3Image;
            }else{
                objMp3.mp3Image=[UIImage imageNamed:@"DefaultImage"];
            }
            [mp3Array addObject:objMp3];
        }
    }
    }
    
    -(UIImage *)getAlbumnArtWorkImage :(NSURL *)mp3Url{
    
    AVAsset *asset = [AVURLAsset URLAssetWithURL:mp3Url options:nil];
    UIImage *img = nil;
    for (NSString *format in [asset availableMetadataFormats]) {
        for (AVMetadataItem *item in [asset metadataForFormat:format]) {
            if ([[item commonKey] isEqualToString:@"artwork"]) {
                img = [UIImage imageWithData:[item.value copyWithZone:nil]];
            }
        }
    }
    return img;
    }
    

    *** MP3ObjectsClass 是 NSObject 类。使用上述功能,您可以从 iPhone 访问设备音乐文件。

    【讨论】:

      【解决方案3】:

      首先导入 AVFoundation/AVFoundation.h 框架。

      #import <AVFoundation/AVFoundation.h>
      -(void)pickAudioFiles
      {
          MPMediaPickerController *soundPicker=[[MPMediaPickerController alloc] initWithMediaTypes:MPMediaTypeAnyAudio];
          soundPicker.delegate=self;
          soundPicker.allowsPickingMultipleItems=NO;
          [self presentViewController:soundPicker animated:YES completion:nil];
      }
      
      -(void)mediaPicker:(MPMediaPickerController *)mediaPicker didPickMediaItems:(MPMediaItemCollection *)mediaItemCollection
      {
          MPMediaItem *item = [[mediaItemCollection items] objectAtIndex:0];
          NSURL *url = [item valueForProperty:MPMediaItemPropertyAssetURL];
          [mediaPicker dismissViewControllerAnimated:YES completion:nil];
          AVPlayerItem *playerItem=[AVPlayerItem playerItemWithURL:url];
          AVPlayer *player=[[AVPlayer alloc] initWithPlayerItem:playerItem];
          AVPlayerLayer *playerLayer=[AVPlayerLayer playerLayerWithPlayer:player];
          playerLayer.frame=CGRectMake(0, 0, 10, 10);
          [self.view.layer addSublayer:playerLayer];
      }
      

      和[player play];一起玩

      如果你想使用AVAudioPlayer 然后导入AudioToolbox/AudioToolbox.h

      【讨论】:

      • 这对我没有帮助,您能否详细解释一下,以便我可以在我的应用程序中实现。我想从我的应用程序中添加音乐库(所有歌曲)并播放。
      • NSURL *url 将为您提供所选音频文件的确切 url。并使用 MPMediaPickerControllerDelegate
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-25
      • 1970-01-01
      • 2019-03-29
      • 1970-01-01
      相关资源
      最近更新 更多