注意:这个本地音乐并不是说将歌曲放到项目中的歌曲文件,而且放在手机本地音乐库(ipod)的音乐.
因为比较简单,所以就直接上代码了.
使用之前需要添加 - MediaPlayer.framework
导入头文件
#import <MediaPlayer/MediaPlayer.h>
#import <AVFoundation/AVFoundation.h>
//获取本地音乐文件,返回歌曲列表
-(NSArray*) findArtistList {
NSMutableArray *artistList = [[NSMutableArray alloc]init];
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
MPMediaQuery *listQuery = [MPMediaQuery playlistsQuery];//播放列表
NSArray *playlist = [listQuery collections];//播放列表数组
for (MPMediaPlaylist * list in playlist) {
NSArray *songs = [list items];//歌曲数组
for (MPMediaItem *song in songs) {
//歌曲名
NSString *title =[song valueForProperty:MPMediaItemPropertyTitle];
//歌手名
NSString *artist =[[song valueForProperty:MPMediaItemPropertyArtist] uppercaseString];
//链接 注意: 如果后面不调用 absoluteString ,播放会崩溃
NSString *url = [[song valueForProperty: MPMediaItemPropertyAssetURL] absoluteString];
//将歌曲保存到字典中, 并将字典转成模型
[dict setObject:title forKey:@"songName"];
[dict setObject:artist forKey:@"singer"];
[dict setObject:url forKey:@"url"];
HFLocalMusicItem *item = [HFLocalMusicItem itemWithDictionary:dict];
if(artist!=nil&&![artistList containsObject:artist]){
[artistList addObject: item];
}
}
}
return artistList;
}
以上的方法是获取手机本地音乐库中的列表,
将列表添加数据源中
- (NSArray *)musicsList {
if (!_musicsList) {
_musicsList = [self findArtistList];
[self.tableView reloadData];
}
return _musicsList;
}
将这些数据展示到tablview中,在 tableView的代理方法didSelectRowAtIndexPath中点击播放
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
HFLocalMusicItem *item = self.musicsList[indexPath.row];
self.audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL URLWithString:item.url] error:nil];
[self.audioPlayer play];
}
注意:播放器一定要强引用.
另外网上还有另外一种方法是使用MPMediaPickerController的,但是这个方法会modal出一个自带的界面.一般情况下不会使用到.
点击歌曲就可以播放了.
效果图: