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

4
我想访问iPhone上可用的音乐文件并将其列出(或)将文件放入我的iPhone应用程序中,一些代表和开始播放。这是否可能?类似于我们使用UIImagePickerController委托方法从设备照片库访问图像的方式。
谢谢!
3个回答

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


4

好的,谢谢!我会立即检查。只有一个问题,它可以在所有iOS 4.x和5.x设备上运行,对吗? - Getsy
iOS10也需要在plist中添加<key>NSAppleMusicUsageDescription</key>以使MPMediaPickerController的呈现工作。否则它只会闪白并消失。当用户拒绝访问音乐时也是如此。苹果做得很好! - Anton Tropashko
将iTunes购买的音乐复制到应用程序沙盒并上传到服务器是否合法? - vishy

1

首先导入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


这对我没有帮助,你能详细解释一下吗,这样我就可以在我的应用程序中实现了。我想从我的应用程序中添加音乐库(所有歌曲)并播放。 - Sandy Patel
NSURL *url会给你所选音频文件的确切URL。 并使用MPMediaPickerControllerDelegate。 - Vaibhav Sharma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接