How to load images from Gallery to UiImageView in XCODE5? - iphone

Hi I am getting a problem in load images from the gallery to UIImageView in Xcode 5.
When I am trying to get images from the Gallery in UIImage it will generate exceptional error in my screen.

You can use following method to load image from gallery.
You have to call methodToCallPhotos when you click on gallery button.
-(void)methodToCallPhotos
{
UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
imagePicker.delegate = self;
[self presentModalViewController:imagePicker animated:YES];
}
After this when you select any image from the gallery. It calls delegate method like below
-(void)imagePickerController:(UIImagePickerController *)picker
didFinishPickingImage:(UIImage *)image
editingInfo:(NSDictionary *)editingInfo
{
imageView.image = image;
[[picker parentViewController] dismissModalViewControllerAnimated:YES];
}

First of all check if your app is granted permission to access Photo gallery.
Have a look at the documentation for ALAssetsLibrary here. To access all photos and videos you need to enumerate all groups (albums) in the photo library and then enumerate all photos and images in each group.
ALAssetsLibrary *al = [[ALAssetsLibrary alloc] init];
[al enumerateGroupsWithTypes:ALAssetsGroupAll
usingBlock:^(ALAssetsGroup *group, BOOL *stop)
{
[group enumerateAssetsUsingBlock:^(ALAsset *asset, NSUInteger index, BOOL *stop)
{
if (asset)
{
.. do something with the asset
}
}
}
failureBlock:^(NSError *error)
{
.. handle error
}
];

Related

How to show ipad library videos in CustomTableView

i wanna get all videos list from ipad video library and show in table view controller and then play inside the app. is it possible?
This Developer.apple documentation explains how to use an image picker controller and delegate for browsing and choosing saved pictures and movies. If the standard media browsing UI does not suit your needs, you can create a fully custom solution with UIKit and the Assets Library framework
Media types To specify whether the image picker controller displays saved movies, still images, or both, set the mediaTypes property to an array containing identifiers for the desired types. The valid values for elements of the array are kUTTypeImage and kUTTypeMovie.
Presenting the media browser interface full screen on iPhone or iPod touch
-(BOOL) startMediaBrowserFromViewController: (UIViewController*) controller
usingDelegate: (id <UIImagePickerControllerDelegate,
UINavigationControllerDelegate>) delegate {
if (([UIImagePickerController isSourceTypeAvailable:
UIImagePickerControllerSourceTypeSavedPhotosAlbum] == NO)
|| (delegate == nil)
|| (controller == nil))
return NO;
UIImagePickerController *mediaUI = [[UIImagePickerController alloc] init];
mediaUI.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;
// Displays saved pictures and movies, if both are available, from the
// Camera Roll album.
mediaUI.mediaTypes = [[NSArray alloc] initWithObjects: (NSString *) kUTTypeMovie, nil];
// Hides the controls for moving & scaling pictures, or for
// trimming movies. To instead show the controls, use YES.
mediaUI.allowsEditing = NO;
mediaUI.delegate = delegate;
[controller presentModalViewController: mediaUI animated: YES];
return YES;
}
- (IBAction) showSavedMediaBrowser {
[self startMediaBrowserFromViewController: self
usingDelegate: self];
}
Delegate method for picked media
- (void) imagePickerController: (UIImagePickerController *) picker
didFinishPickingMediaWithInfo: (NSDictionary *) info {
}
Yes it is possible.
You can get all video's asset urls using the following code:
NSMutableArray* assetURLs = [[NSMutableArray alloc] init];
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
void (^assetEnumerator)( ALAsset *, NSUInteger, BOOL *) = ^(ALAsset *result, NSUInteger index, BOOL *stop)
{
if(result != nil)
{
if([[result valueForProperty:ALAssetPropertyType] isEqualToString:ALAssetTypeVideo])
{
[assetURLs addObject:[result valueForProperty:ALAssetPropertyURLs]];
NSLog(#"result is:%#",result);
NSURL *url= (NSURL*) [[result defaultRepresentation]url];
[library assetForURL:url
resultBlock:^(ALAsset *asset)
{
// do stuff here
}
failureBlock:^(NSError *error){ NSLog(#"test:Fail"); } ];
}
}
};
You can use the asset url to get that video.
After that create the thumbnail of the video and display it in the tableView.
Also you can play the video using the asset url:
Asset url will look like: assets-library://asset/asset.m4v?id=100&ext=m4v
NSString *urlAddress = #"assets-library://asset/asset.m4v?id=100&ext=m4v";
NSURL *movieURL= [NSURL URLWithString:urlAddress];
MPMoviePlayerController *mp = [[MPMoviePlayerController alloc] initWithContentURL: movieURL];
For more refer:
AssetsLibrary
MPMoviePlayerController

Save image from camera

This is how I show and save from my camera:
-(IBAction)Camera:(id)sender{
if ([UIImagePickerController isSourceTypeAvailable:
UIImagePickerControllerSourceTypeCamera])
{
UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
imagePicker.delegate = self;
imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
imagePicker.mediaTypes = [NSArray arrayWithObjects: (NSString *) kUTTypeImage,nil];
imagePicker.allowsEditing = NO;
[self presentModalViewController:imagePicker animated:YES];
newMedia = YES;
}
}
-(void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
[self dismissModalViewControllerAnimated:YES];
NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType];
if ([mediaType isEqualToString:(NSString *)kUTTypeImage]) {
UIImage *image = [self scaleThenRotateImage:[info objectForKey:UIImagePickerControllerOriginalImage]];
imageView.image = image;
if (newMedia)
UIImageWriteToSavedPhotosAlbum(image, self, #selector(image:finishedSavingWithError:contextInfo:), nil);
}
else if ([mediaType isEqualToString:(NSString *)kUTTypeMovie]) {
// Code here to support video if enabled
}
}
But the problem is, I'm using a picker that uses ALAsset,that can multiselect then displays a checkmark on images selected.
So for example I take a picture from my camera(with the code above) then go to my camera roll to select images(multiple/single) with the imageTaken, it doesnt display any checkmark when I show the picker, so I'm assuming the solution is I need to save it by/with ALAsset.
Should I just change this:
UIImagePickerControllerOriginalImage
to
UIImagePickerControllerMediaMetadata
or what should I do/change? Thanks for the answers.

UIImagePickerController After taking 5 images sequentially Terminates Application

//This method Launches the picker to take the picture from camera.
-(IBAction)takeyouphoto:(id)sender
{
if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])
{
// Create image picker controller
UIImagePickerController *imagePicker2 = [[UIImagePickerController alloc] init];
// Set source to the camera
imagePicker2.sourceType = UIImagePickerControllerSourceTypeCamera;
// Delegate is self
imagePicker2.delegate = self;
// Allow editing of image ?
imagePicker2.allowsEditing= NO;
// Show image picker
[self presentModalViewController:imagePicker2 animated:YES];
}
}
//This is ImagePicker Delegate method.
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
#try {
NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType];
if ([mediaType isEqualToString:(NSString *)kUTTypeImage])
{
UIImage *resultimage=nil;
//I am using iOS5, so we can not use NSAutoreleasePool
resultimage=[info objectForKey:UIImagePickerControllerOriginalImage] ;
//This Launches the HUD (Activity Indicator) because ImagePicker ususally takes 5
//seconds to launch image.
[self showHUD:resultimage];
}
}
[picker dismissModalViewControllerAnimated:YES];
}
-(void)showHUD:(UIImage *)resultimage
{
[[Singleton sharedmysingleton] stoptimer];
HUD = [[MBProgressHUD alloc] initWithView:self.navigationController.view];
[self.navigationController.view addSubview:HUD];
HUD.delegate = self;
HUD.labelText = #"Loading Image";
//HUD.detailsLabelText=#"Loading";
//Below call on showWhileExecuting of the MBProgressHuD class has its own NSAutoreleasePool
//Defined in MGProgressHUD class. it also runs the method showimageincell; in separate
//thread.
[HUD showWhileExecuting:#selector(showimagesincell:) onTarget:self withObject:resultimage animated:YES];
}
-(void)showimagesincell:(UIImage *)image
{
appDelegate.tabbarcontroller.tabBar.userInteractionEnabled=NO;
NSError *error;
UIImage *resultImage=[self scale:image toSize:image.size];
//UIImage *resultImage = [[UIImage alloc] initWithCGImage:imgRefCrop scale:1.0 orientation:resultimage.imageOrientation];
//resultimage.imageOrientation
NSData *imagedata=UIImageJPEGRepresentation(resultImage, 0.7);//(resultImage);
UIImage *smallimage=[self scale:image toSize:CGSizeMake(100, 100)];
NSData *smallimagedata=UIImageJPEGRepresentation(smallimage, 0.7);
/* NSString *imagetypeid=[Fetchsavefromcoredata getImagenameandImageidfromdatabase:#"Mobile_ImageType" attributename:#"imageType" predicate:imagetypetxtfield.text];
//write image to document directory
NSString *localImagedir=[photodirpath stringByAppendingPathComponent:selectedvinnumber];
NSString *datetime=[Singleton imagedateandtime];
NSString *imagename=[NSString stringWithFormat:#"%#_%#.png",imagetypeid,datetime];
NSString *localImagePath=[localImagedir stringByAppendingPathComponent:imagename];
[imagedata writeToFile:localImagePath atomically:YES];*/
[self performSelectorOnMainThread:#selector(updatetableview) withObject:nil waitUntilDone:NO];
}
-(void)updatetableview
{
[[Singleton sharedmysingleton] starttimer];
[self viewWillAppear:YES];
}
-(UIImage *)scale:(UIImage *)image toSize:(CGSize)size
{
UIGraphicsBeginImageContext(size);
[image drawInRect:CGRectMake(0, 0, size.width, size.height)];
UIImage *scaledImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return scaledImage;
}
//Above is all my code, I have tried to find it on diffrent forums but I have not fixed it yet.
//Any help will be appreciated. Thanks in advance
The white screen issue is fixed by keeping the image returned by the UIIMagePickerController delegate method into an #autoreleasepool (for iOS5). It solved the problem, we can not use NSAutoreleasePool in ARC code.
Here the line of code in didFinishPickingMediaWithInfo: delegate method
UIImage *resultimage=nil;
#autoreleasepool
{
//I am using iOS5, so we can not use NSAutoreleasePool
resultimage=[info objectForKey:UIImagePickerControllerOriginalImage] ;
}
Below the UIImagePickerController delegate method after implementing #autoreleasepool
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
#try {
NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType];
if ([mediaType isEqualToString:(NSString *)kUTTypeImage])
{
UIImage *resultimage=nil;
#autoreleasepool
{
//I am using iOS5, so we can not use NSAutoreleasePool
resultimage=[info objectForKey:UIImagePickerControllerOriginalImage] ;
}
//This Launches the HUD (Activity Indicator) because ImagePicker ususally takes 5
//seconds to launch image.
[self showHUD:resultimage];
}
}
[picker dismissModalViewControllerAnimated:YES];
}

UIImagePickerController with camera source with allows editing yes : video trimming doesn't work

I am using UIImagePickerController to record a video with the sourceType set to UIImagePickerControllerSourceTypeCamera.
I have set allowsEditing to true.
After capturing video I edit the video using the trimming interface and press "Use", I only get back the original recording not the trimmed version. What am I doing wrong?
I am using iOS 5.
-(void)shootvideo {
imagePicker = [[UIImagePickerController alloc] init];
[imagePicker.view addSubview:test];
[imagePicker.view addSubview:test2];
imagePicker.delegate = self;
imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
imagePicker.mediaTypes = [[NSArray alloc] initWithObjects:(NSString *)kUTTypeMovie, nil];
imagePicker.showsCameraControls = YES;
imagePicker.navigationBarHidden = NO;
imagePicker.toolbarHidden = NO;
imagePicker.wantsFullScreenLayout = YES;
imagePicker.allowsEditing=YES;
[self presentModalViewController:imagePicker animated:YES];
}
-(void) imagePickerController: (UIImagePickerController *) picker
didFinishPickingMediaWithInfo: (NSDictionary *) info
{
NSString *mediaType = [info objectForKey: UIImagePickerControllerMediaType];
if (CFStringCompare ((__bridge CFStringRef) mediaType, kUTTypeMovie, 0)
== kCFCompareEqualTo)
{
NSString *moviePath = [[info objectForKey:UIImagePickerControllerMediaURL] path];
//NSLog(#"%#",moviePath);
if (UIVideoAtPathIsCompatibleWithSavedPhotosAlbum (moviePath)) {
UISaveVideoAtPathToSavedPhotosAlbum (moviePath, nil, nil, nil);
}
}
[self dismissModalViewControllerAnimated:YES];
}
I want to use that trimmed video for further processing according to my application.
Where I am going wrong?
Is there any other way to achieve this task?
allowsEditing : A Boolean value indicating whether the user is allowed to edit a selected still image or movie.
#property (nonatomic) BOOL allowsEditing
Discussion
If you allow the user to edit still images or movies, the delegate may receive a dictionary with information about the edits that were made. The protocol for the delegate is described in UIImagePickerControllerDelegate Protocol Reference.
I Think this will be helpful.
you need to grab the info[UIImagePickerControllerEditedImage] from the - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
I believe.

iPhone - picking a video... URL with two bars?

I have a UIPickerController to select videos in my App and it is crashing when selecting videos using the picker. When I feed the MPMoviePlayerController with the URL directly it works fine, but when the URL comes from the UIPickerController, it loads the movie correctly but crashes when the thumbnails are being created.
I have dumped the URL to the console, just after the file is selected and this is what I see
file://localhost/private/var/mobile/Applications/FA667F85-B009-46FA-A0B9-A7345A072651/tmp//trim.Ir0gqx.MOV
first question: why is the double bar before the file name?
second question: why the file name comes with a trim prefix if I have editing NO on the picker?
this is the picker code:
- (void) selectMovie:(id) sender {
if ([UIImagePickerController isSourceTypeAvailable:
UIImagePickerControllerSourceTypePhotoLibrary]) {
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
NSArray *mediaTypesAllowed = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypePhotoLibrary];
picker.mediaTypes = [[NSArray alloc] initWithObjects: (NSString *) kUTTypeMovie, nil];
picker.delegate = self;
picker.allowsEditing = NO;
picker.videoQuality = UIImagePickerControllerQualityTypeHigh; // I've added this trying to make it stop compressing the video, but it won't... any clues?
UIPopoverController *aPopover =
[[UIPopoverController alloc] initWithContentViewController:picker];
aPopover.delegate = self;
CGRect myRect = [sender frame];
[aPopover presentPopoverFromRect:myRect inView:self.view permittedArrowDirections:UIPopoverArrowDirectionRight animated:YES];
}
}
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
NSString* mediaType = [info objectForKey:UIImagePickerControllerMediaType];
if ( [ mediaType isEqualToString:#"public.movie" ]){
movieURL = [info objectForKey:UIImagePickerControllerMediaURL];
}
NSLog(#"%#", movieURL);
[self loadMovie:movieURL];
}
My thought is that your app does not have permission to generate thumbnails in the location where the movie is stored. Try copying the movie file out of the photo albums and into your documents directory:
NSFileManager *fm = [NSFileManager defaultManager];
[fm moveItemAtURL:fromURL toURL:toURL error:&error];
Assuming you have a toURL pointing to a filename in your docs directory.
I only know about the first one, because you need to feed to MPMoviePlayerController a url, a url has to start with a scheme, http://, smtp://, kind of that. file:// is also a scheme for file url