I would like to store and retrieve audio files such as MP3s in the user’s documents directory. When I do this with images I can simply fetch the file as a UIImage. However, I’m struggling with what format to use to retrieve the audio.
For images I could do:
-(UIImage*)getImageNamed: (NSString*) name {
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString* path = [documentsDirectory stringByAppendingPathComponent:
[NSString stringWithString: name] ];
UIImage *img = [UIImage imageWithContentsOfFile:path];
return img;
}
return nil;
}
I’m trying a similar approach for audios but it does not compile as there is no such method as objectWithContentsOfFile. Also I’m not sure that an AVPlayerItem is the right way to return the audio file. (I don’t want to just play it from its location in the documents directory, but rather get the actual .mp3 file to share via email etc.)
How would I edit the following code to retrieve an audio file such as an mp3 instead of an image from the documents directory?
-(id)getAudioFileNamed: (NSString*) name {
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString* path = [documentsDirectory stringByAppendingPathComponent:
[NSString stringWithString: name] ];
AVPlayerItem* item = [AVPlayerItem objectWithContentsOfFile:path];//pseudo method
return item;
}
return nil;
}
Thanks for any suggestions
2
This is a method to check if the file input is mp3 format.
#import <UniformTypeIdentifiers/UniformTypeIdentifiers.h>
- (BOOL)isMP3FileAtURL:(NSURL *)url {
NSError *error = nil;
NSDictionary *resourceValues = [url resourceValuesForKeys:@[NSURLContentTypeKey] error:&error];
if (error) {
NSLog(@"Error retrieving file resource values: %@", error);
return NO;
}
UTType *contentType = resourceValues[NSURLContentTypeKey];
return [contentType conformsToType:UTTypeMP3];
}
Integrate it into your code, it will be like
-(id)getAudioFileNamed: (NSString*) name {
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString* path = [documentsDirectory stringByAppendingPathComponent:
[NSString stringWithString: name] ];
NSURL *url = [NSURL fileURLWithPath:path];
if ([self isMP3FileAtURL: url]) {
AVPlayerItem* item = [AVPlayerItem playerItemWithURL:url];
return item;
} else {
return nil;
}
}
return nil;
}
I adjust a bit, making it more readable, so finally it should be like.
- (nullable AVPlayerItem *)getAudioFileNamed:(NSString *)name {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent: [NSString stringWithString: name]];
NSURL *url = [NSURL fileURLWithPath:path];
if ([self isMP3FileAtURL: url]) {
return [AVPlayerItem playerItemWithURL:url];
} else {
return nil;
}
}