应用程序在Iphone 5.0中从Iphone导入歌曲时崩溃了
你好,我正在使用下面的framworks,
#import <MediaPlayer/MediaPlayer.h> #import <AudioToolbox/AudioToolbox.h> #import <AVFoundation/AVFoundation.h>
在其中一个button事件中,我已经实现了下面的代码来打开库。
MPMediaPickerController *mediaPicker = [[MPMediaPickerController alloc] initWithMediaTypes:MPMediaTypeMusic]; mediaPicker.delegate = self; mediaPicker.allowsPickingMultipleItems = YES; // this is the default [self presentModalViewController:mediaPicker animated:YES]; [mediaPicker release];
而在MPMediaPickerController的委托方法中实现的代码如下
#pragma mark MPMediaPickerController delegate methods - (void)mediaPicker: (MPMediaPickerController *)mediaPicker didPickMediaItems:(MPMediaItemCollection *)mediaItemCollection { // We need to dismiss the picker [self dismissModalViewControllerAnimated:YES]; // Assign the selected item(s) to the music player and start playback. counterIpod = [mediaItemCollection.items count]; totalcollection = counterIpod; if (totalcollection > 10) { NSString *str = [NSString stringWithFormat:@"BRL Only supports importing 10 songs at a time"]; UIAlertView *connectionAlert = [[UIAlertView alloc] initWithTitle:@"Message !" message:str delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; [connectionAlert show]; [connectionAlert release]; } else { [self performSelector:@selector(saveMediaItem:) withObject:mediaItemCollection afterDelay:0.1]; //[self saveMediaItem:mediaItemCollection]; //[self showLoadingView]; } } - (void)mediaPickerDidCancel:(MPMediaPickerController *)mediaPicker { // User did not select anything // We need to dismiss the picker [self dismissModalViewControllerAnimated:YES]; } #pragma mark Sace Item Collection to documentsDirectory -(void)saveMediaItem:(MPMediaItemCollection *)mediaItemCollection { for (int i = 0; i < [mediaItemCollection.items count]; i++) { [self exportAssetAsSourceFormat:[[mediaItemCollection items] objectAtIndex:i]]; NSLog(@"for loop : %d", i); } NSArray *itemsArray1 = appDelegate.mediaItemCollection1.items; MPMediaItemCollection *mediaItemCollection2; if ([itemsArray1 count] != 0) { mediaItemCollection2 = [self collectionByAppendingCollection:mediaItemCollection]; } else { mediaItemCollection2 = mediaItemCollection; } [self saveMediaItemAfterDeletting:mediaItemCollection2]; } -(void)saveMediaItemAfterDeletting:(MPMediaItemCollection *)mediaItemCollection { NSMutableData* data = [[NSMutableData alloc] init]; NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data]; [archiver encodeObject:mediaItemCollection forKey:@"my_playlist"]; [archiver finishEncoding]; NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSString *filePath = [NSString stringWithFormat:@"%@/playlist.data", documentsDirectory]; NSLog(@"file path = %@", filePath); [data writeToFile:filePath atomically:YES]; if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]){ NSLog(@"file exists : ===========>>>>>>>>>>>"); } else { NSLog(@"file doesn't exist"); } //NSLog(@"archiving playlist success = %d", success); [archiver release]; [data release]; [self UpdateMediaCollection]; } -(NSString*) getExtension:(MPMediaItem *)item { // [self showLoadingView]; NSURL *assetURL = [item valueForProperty:MPMediaItemPropertyAssetURL]; AVURLAsset *songAsset = [AVURLAsset URLAssetWithURL:assetURL options:nil]; // JP // AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] // initWithAsset:songAsset // presetName:AVAssetExportPresetPassthrough]; NSArray *tracks = [songAsset tracksWithMediaType:AVMediaTypeAudio]; AVAssetTrack *track = [tracks objectAtIndex:0]; id desc = [track.formatDescriptions objectAtIndex:0]; const AudioStreamBasicDescription *audioDesc = CMAudioFormatDescriptionGetStreamBasicDescription((CMAudioFormatDescriptionRef)desc); FourCharCode formatID = audioDesc->mFormatID; //exportAudioMix.inputParameters = [NSArray arrayWithObject:exportAudioMixInputParameters]; //exportSession.audioMix = exportAudioMix; NSString *fileType = nil; NSString *ex = nil; switch (formatID) { case kAudioFormatLinearPCM: { UInt32 flags = audioDesc->mFormatFlags; if (flags & kAudioFormatFlagIsBigEndian) { fileType = @"public.aiff-audio"; ex = @"aif"; } else { fileType = @"com.microsoft.waveform-audio"; ex = @"wav"; } } break; case kAudioFormatMPEGLayer3: fileType = @"com.apple.quicktime-movie"; ex = @"mp3"; break; case kAudioFormatMPEG4AAC: fileType = @"com.apple.m4a-audio"; ex = @"m4a"; break; case kAudioFormatAppleLossless: fileType = @"com.apple.m4a-audio"; ex = @"m4a"; break; default: break; } return ex; } #pragma mark Covert Item separate item collection and store songs into directory - (void)exportAssetAsSourceFormat:(MPMediaItem *)item { // [self showLoadingView]; NSLog(@"export asset called"); NSURL *assetURL = [item valueForProperty:MPMediaItemPropertyAssetURL]; NSLog(@"\n>>>> assetURL : %@",[assetURL absoluteString]); AVURLAsset *songAsset = [AVURLAsset URLAssetWithURL:assetURL options:nil]; // JP AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] initWithAsset:songAsset presetName:AVAssetExportPresetPassthrough]; NSArray *tracks = [songAsset tracksWithMediaType:AVMediaTypeAudio]; AVAssetTrack *track = [tracks objectAtIndex:0]; id desc = [track.formatDescriptions objectAtIndex:0]; const AudioStreamBasicDescription *audioDesc = CMAudioFormatDescriptionGetStreamBasicDescription((CMAudioFormatDescriptionRef)desc); FourCharCode formatID = audioDesc->mFormatID; //exportAudioMix.inputParameters = [NSArray arrayWithObject:exportAudioMixInputParameters]; //exportSession.audioMix = exportAudioMix; NSString *fileType = nil; NSString *ex = nil; switch (formatID) { case kAudioFormatLinearPCM: { UInt32 flags = audioDesc->mFormatFlags; if (flags & kAudioFormatFlagIsBigEndian) { fileType = @"public.aiff-audio"; ex = @"aif"; } else { fileType = @"com.microsoft.waveform-audio"; ex = @"wav"; } } break; case kAudioFormatMPEGLayer3: fileType = @"com.apple.quicktime-movie"; ex = @"mp3"; break; case kAudioFormatMPEG4AAC: fileType = @"com.apple.m4a-audio"; ex = @"m4a"; break; case kAudioFormatAppleLossless: fileType = @"com.apple.m4a-audio"; ex = @"m4a"; break; default: break; } exportSession.outputFileType = fileType; NSString *fileName = nil; fileName = [NSString stringWithString:[item valueForProperty:MPMediaItemPropertyTitle]]; fileName = [[fileName stringByAppendingString:@"-"] stringByAppendingString:[item valueForProperty:MPMediaItemPropertyArtist]]; NSArray *fileNameArray = nil; fileNameArray = [fileName componentsSeparatedByString:@" "]; fileName = [fileNameArray componentsJoinedByString:@""]; NSLog(@">>>>> fileName = %@", fileName); NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; NSString *filePath = [[docDir stringByAppendingPathComponent:fileName] stringByAppendingPathExtension:ex]; NSLog(@"filePath = %@", filePath); if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) { //NSLog(@"file exist::::::::::==============>>>>>>>>>>>>>>>>>"); counterIpod--; if(counterIpod == 0) { //[self showAlertView]; //[self hideLoadingView]; } NSString *str = [NSString stringWithFormat:@"Loading %d of %d Beats", totalcollection - counterIpod ,totalcollection]; [lbl performSelectorOnMainThread:@selector(setText:) withObject:str waitUntilDone:NO]; //NSLog(@"loading string : %@", str); return; } //NSLog(@"file not exist ===========>>>>>>>>>"); // ------------------------------------- int fileNumber = 0; NSString *fileNumberString = nil; NSString *fileNameWithNumber = nil; while ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) { fileNumber++; fileNumberString = [NSString stringWithFormat:@"-%02d", fileNumber]; fileNameWithNumber = [fileName stringByAppendingString:fileNumberString]; filePath = [[docDir stringByAppendingPathComponent:fileNameWithNumber] stringByAppendingPathExtension:ex]; //NSLog(@"filePath = %@", filePath); } // ------------------------------------- myDeleteFile(filePath); exportSession.outputURL = [NSURL fileURLWithPath:filePath]; [exportSession exportAsynchronouslyWithCompletionHandler:^{ if (exportSession.status == AVAssetExportSessionStatusCompleted) { NSLog(@"export session completed"); counterIpod--; NSString *str = [NSString stringWithFormat:@"Loading %d of %d Beats", totalcollection - counterIpod ,totalcollection]; //[self performSelector:@selector(setLabelText:) withObject:str afterDelay:0.02]; [lbl performSelectorOnMainThread:@selector(setText:) withObject:str waitUntilDone:NO]; NSLog(@"loading string : %@", str); if(counterIpod == 0) { //[self showAlertView]; //[self hideLoadingView]; } } else { NSLog(@"export session error"); counterIpod--; NSString *str = [NSString stringWithFormat:@"Loading %d of %d Beats", totalcollection - counterIpod ,totalcollection]; [lbl performSelectorOnMainThread:@selector(setText:) withObject:str waitUntilDone:NO]; //return NO; if(counterIpod == 0) { //[self showAlertView]; //[self hideLoadingView]; } } [exportSession release]; }]; //[appDelegate hideLoadingView]; } #pragma mark method to delete file from document directory void myDeleteFile (NSString* path) { // NSLog(@"file path delete file :::::::::: %@", path); if ([[NSFileManager defaultManager] fileExistsAtPath:path]) { NSError *deleteErr = nil; [[NSFileManager defaultManager] removeItemAtPath:path error:&deleteErr]; if (deleteErr) { NSLog (@"Can't delete %@: %@", path, deleteErr); } } }
以上代码在iOs 4.0或更高版本上没有任何错误,但对于iOs 5.0在设备上崩溃,我无法解决这些问题,因为过去15天。
在此先感谢帮助。
我已经解决了这个问题,
只是注释掉这一行
fileName = [[fileName stringByAppendingString:@"-"] stringByAppendingString:[item valueForProperty:MPMediaItemPropertyArtist]];
因为有些歌曲是空艺术家所以它是崩溃……………….
这是因为你正在使用一些歌曲有艺术家的名字,而一些空白的艺术家的名字,所以你试图追加空白名称的string,这就是为什么应用程序会崩溃。
希望你知道我说的话