The app crashed while importing songs from the Ipod library to Iphone for iOs 5.0

Hi, I am using below framworks,

#import <MediaPlayer/MediaPlayer.h> #import <AudioToolbox/AudioToolbox.h> #import <AVFoundation/AVFoundation.h> 

In one of the button events, I executed the code below to open the library.

  MPMediaPickerController *mediaPicker = [[MPMediaPickerController alloc] initWithMediaTypes:MPMediaTypeMusic]; mediaPicker.delegate = self; mediaPicker.allowsPickingMultipleItems = YES; // this is the default [self presentModalViewController:mediaPicker animated:YES]; [mediaPicker release]; 

And in the MPMediaPickerController delegate methods the code below is implemented

 #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); } } } 

Work on the code without errors in iOS 4.0 or later, but for iOs 5.0 the device crashes, I can’t solve these problems in the last 15 days.

Thank you in advance.

+7
source share
2 answers

I solved these problems,

just comment out this line

  fileName = [[fileName stringByAppendingString:@"-"] stringByAppendingString:[item valueForProperty:MPMediaItemPropertyArtist]]; 

because for some songs there is a zero artist, so it crashes ...................

+4
source

This is because you use some songs with the name of the artist, while some use the empty name of the artist, so you are trying to add an empty name to the string, so the application will break.

I hope you do not understand what I'm saying ...

+2
source

All Articles