參考文件:http://blog.csdn.net/ismilesky/article/details/50687505
需求:獲取本地歌曲文件
分析:本地歌曲文件也就是通多系統(tǒng)自帶的‘音樂(lè)’軟件下載的斤蔓,通過(guò)iTunes導(dǎo)入的排抬,以及通過(guò)第三方音樂(lè)軟件(比如:‘QQ音樂(lè)’栋猖,‘網(wǎng)易云音樂(lè)’等)下載的音樂(lè)。
-
"由于iPhone 自帶的音樂(lè)軟件Music的推出.從iPod取出來(lái)的音樂(lè)MPMediaItemPropertyAssetURL屬性可能為空.
這是因?yàn)閕Phone自帶軟件Music對(duì)音樂(lè)版權(quán)的保護(hù),對(duì)于所有進(jìn)行過(guò) DRMProtection(數(shù)字版權(quán)加密保護(hù))的音樂(lè)都不能被第三方APP獲取并播放.即使這些音樂(lè)已經(jīng)下載到本地.但是還是可以播放本地未進(jìn)行過(guò)數(shù)字版權(quán)加密的音樂(lè).也就是您自己手動(dòng)導(dǎo)入的音樂(lè)锣吼。"
從上面這段話可以看出,我們是沒(méi)辦法讀取通過(guò)iTunes下載的本地音樂(lè)的,而只能獲取通過(guò)iTunes手動(dòng)導(dǎo)入的音樂(lè)惯裕。 -
由于沙盒保護(hù)機(jī)制,你無(wú)法訪問(wèn)其它App的沙盒路徑绣硝。
所以無(wú)法獲取到第三方軟件中的文件蜻势。再者,音樂(lè)軟件之間基本上都屬于競(jìng)爭(zhēng)關(guān)系鹉胖,顯而~這個(gè)不用想了
實(shí)現(xiàn):這里是通過(guò)MediaPlayer.framework這個(gè)系統(tǒng)自帶的框架來(lái)實(shí)現(xiàn)的握玛。如果你有更好的實(shí)現(xiàn)方法,敬請(qǐng)留言哦~
- 需要在Info.plist文件中設(shè)置媒體庫(kù)權(quán)限:Privacy - Media Library Usage Description——請(qǐng)?jiān)试S訪問(wèn)
- 在需要實(shí)現(xiàn)該功能的相關(guān)類中導(dǎo)入
#import <AVFoundation/AVFoundation.h> //獲取授權(quán)狀態(tài)需要導(dǎo)入
#import <MediaPlayer/MediaPlayer.h>
- 根據(jù)授權(quán)狀態(tài)進(jìn)行不同的處理
AVAuthorizationStatus status = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
if (status != AVAuthorizationStatusAuthorized&&status != AVAuthorizationStatusNotDetermined) {
NSLog(@"提示用戶發(fā)開訪問(wèn)媒體庫(kù)的權(quán)限");
}else{
[self getLocalMusicItem];
}
- 主代碼塊
MPMediaQuery *_musicQuery = [MPMediaQuery songsQuery]; //獲取查詢隊(duì)列 注:這里獲取的是以歌曲名稱排序的查詢隊(duì)列
//創(chuàng)建篩選條件
_albumNamePredicate = [MPMediaPropertyPredicate predicateWithValue:[NSNumber numberWithInt:MPMediaTypeMusic] forProperty: MPMediaItemPropertyMediaType];
[_musicQuery addFilterPredicate:_albumNamePredicate];
//獲取對(duì)應(yīng)的集合 注:你可以注意一下items和collections和的區(qū)別甫菠,下面也會(huì)給出二者的區(qū)別
_dataCollectionArr = _musicQuery.collections;
_dataArr = [NSMutableArray array];
for (MPMediaItemCollection *songCollection in _dataCollectionArr) {
MPMediaItem *songItem = songCollection.representativeItem;
//NSString *songTitle = song.title; 等價(jià)于 NSString *songTitle = [song valueForProperty: MPMediaItemPropertyTitle];
[_dataArr addObject:songItem];
}
[_tbView reloadData];
- 一些簡(jiǎn)單的調(diào)用:
//獲取歌曲名 等價(jià)于 NSString *songTitle = [song valueForProperty: MPMediaItemPropertyTitle];
songItem.title;
//獲取專輯名
songItem.albumTitle;
//獲取歌手名
songItem.artist;
//獲取當(dāng)前條目對(duì)應(yīng)數(shù)組 根據(jù)上文挠铲,則獲取的是同一首歌對(duì)應(yīng)的數(shù)組
MPMediaItemCollection *itemCollection = _dataCollectionArr[selIndex];
NSArray *subArray = itemCollection.items;;
//查詢 這里是通過(guò)查詢實(shí)現(xiàn)獲取當(dāng)前條目對(duì)應(yīng)數(shù)組,
MPMediaItem *curSong = _dataArr[indexPath.row];
NSString *propertyStr = MPMediaItemPropertyArtistPersistentID;
NSString *keyIDStr = [curSong valueForProperty:propertyStr];
_albumNamePredicate = [MPMediaPropertyPredicate predicateWithValue:keyIDStr forProperty: propertyStr];
MPMediaQuery *query = [[MPMediaQuery alloc]init];
[query addFilterPredicate:_albumNamePredicate];
NSArray *itemsFromQuery = [query items];
SubViewController *subVC = [[UIStoryboard storyboardWithName:@"Main" bundle:nil]instantiateViewControllerWithIdentifier:@"SubViewController"];
subVC.dataArr = subArray;
[self.navigationController pushViewController:subVC animated:YES];
- items和collections和的區(qū)別:通過(guò)查閱官方文檔可以看出淑蔚。items只是當(dāng)前條目市殷,collections是集合的集合,通過(guò)collections可以獲取到當(dāng)前條目對(duì)應(yīng)的集合刹衫。
// Returns an array of MPMediaItems matching the query filter predicates.
// If no items match this method returns an empty array, otherwise returns nil if an error prevents the items from being fetched.
@property (nonatomic, readonly, nullable) NSArray<MPMediaItem *> *items
// Returns an array of MPMediaItemCollections matching the query filter predicates. The collections are grouped by the groupingType.
@property (nonatomic, readonly, nullable) NSArray<MPMediaItemCollection *> *collections;
- 一個(gè)簡(jiǎn)單的Demo:AppleMusicDemo
建議:砍掉如此這般的功能??
期待你的評(píng)論建議O(∩_∩)O~