通过编程方式从iPhone应用程序访问设备音乐文件

通过编程方式从iPhone应用程序访问设备音乐文件,iphone,ios,mpmediapickercontroller,mpmediaquery,Iphone,Ios,Mpmediapickercontroller,Mpmediaquery,我想访问iPhone上可用的音乐文件并将其列出(或)将该文件放入我的iPhone应用程序中并开始播放。有可能吗?类似于使用UIImagePickerController委托方法从设备相册访问图像的方式 谢谢大家! 您可以参考。它的功能与UIImagePickerController类相同。首先导入AVFoundation/AVFoundation.h框架 #import <AVFoundation/AVFoundation.h> -(void)pickAudioFiles {

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


谢谢大家!

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

首先导入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];
}
#导入
-(void)拾取音频文件
{
MPMediaPickerController*soundPicker=[[MPMediaPickerController alloc]initWithMediaTypes:MPMediaTypeAnyAudio];
soundPicker.delegate=self;
soundPicker.AllowPickingMultipleItems=否;
[self-presentViewController:soundPicker动画:是完成:无];
}
-(void)mediaPicker:(MPMediaPickerController*)mediaPicker didPickMediaItems:(MPMediaItemCollection*)mediaItemCollection
{
MPMediaItem*item=[[mediaItemCollection items]对象索引:0];
NSURL*url=[item valueForProperty:MPMediaItemPropertyAsetUrl];
[mediaPicker DismissViewControllerInitiated:是完成:无];
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

-(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访问设备音乐文件。

好的,谢谢!我会马上检查的。只有一个问题,它可以在所有iOS 4.x和5.x设备上运行,对吗?iOS 10还需要plist中的NSAppleMusicUsageDescription来演示MPMediaPickerController。否则它只会闪烁白色并消失。当用户拒绝访问音乐时,情况也是如此。干得好,苹果!将iTunes购买的音乐复制到应用程序沙盒并上传到服务器是否合法?这对我没有帮助。请详细解释,以便我可以在我的应用程序中实现。我想从我的应用程序添加音乐库(所有歌曲)&play.NSURL*url将为您提供所选音频文件的确切url。并使用MPMediaPickerControllerDelegate