UIImagePickerController 让我可以拍摄照片和视频,但不会让我保存或“使用”它们

Posted

技术标签:

【中文标题】UIImagePickerController 让我可以拍摄照片和视频,但不会让我保存或“使用”它们【英文标题】:UIImagePickerController lets me take photos and videos but will not let me save them or "use" them 【发布时间】:2013-12-26 18:16:52 【问题描述】:

我现在正在开发一个简单的照片和视频捕捉应用程序。该应用程序成功地允许用户按下按钮拍摄照片或视频。但是,一旦您完成拍摄照片或视频,它会提供 2 个选项:“重拍”和“使用照片”或“使用视频”,具体取决于您使用的是哪一个。

如果用户点击“重新拍摄”,那么它只是让他们重新拍摄新照片或视频,但当用户点击“使用照片”或“使用视频”时,它不会做任何事情。该应用程序只是将它们带回主应用程序屏幕。

我对如何访问“使用照片”/“使用视频”按钮感到困惑,以便我可以编辑它的代码并将图像和视频保存到相机胶卷。

这是我目前的代码:

ViewController.h:

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UINavigationControllerDelegate, UIImagePickerControllerDelegate>

@property UIImagePickerController * pickerController;

-(IBAction)showCameraUI;

@end

ViewController.m:

#import "ViewController.h"


@interface ViewController () <UINavigationControllerDelegate, UIImagePickerControllerDelegate>

@end

@implementation ViewController

- (void)viewDidLoad

[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.

[UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera];
[UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera];

NSLog(@"%ld", (long)UIImagePickerControllerSourceTypeCamera); 

- (void)didReceiveMemoryWarning

[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.


-(IBAction)showCameraUI

UIImagePickerController * pickerController = [[UIImagePickerController alloc]init];

pickerController.mediaTypes = [UIImagePickerController  availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera];

pickerController.sourceType = UIImagePickerControllerSourceTypeCamera;


[self presentViewController:pickerController animated:YES completion:NULL];



@end

【问题讨论】:

【参考方案1】:

您可以使用UIImagePickerControllerdidFinishPickingMediaWithInfo 代表来保存图像。

为此,您需要这样做:

-(IBAction)showCameraUI

    UIImagePickerController * pickerController = [[UIImagePickerController alloc]init];
    pickerController.mediaTypes = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera];
    pickerController.sourceType = UIImagePickerControllerSourceTypeCamera;
    pickerController.delegate = self;
    [self presentViewController:pickerController animated:YES completion:NULL];



- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info

   // save photo
    NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType];
   if ([mediaType isEqualToString:(NSString *)kUTTypeImage])
   
       UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
       UIImageWriteToSavedPhotosAlbum(image,nil,nil,nil);
   
   [picker dismissModalViewControllerAnimated:YES];

【讨论】:

谢谢,但功能的“保存照片”正文中有什么内容? @user3117509:我也加了,请查收 我复制/粘贴了您的代码,但它不喜欢“mediaType”。它说“使用未声明的标识符'mediaType'” 我刚刚添加了您的新修复程序,问题就消失了,但对于“kUTTypeImage”并没有给我同样的错误 @user3117509 添加“MobileCoreServices.framework”框架并导入#import &lt;MobileCoreServices/MobileCoreServices.h&gt;【参考方案2】:

请尝试使用这个

- (void)captureVideoOrPhoto
    UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
    [imagePicker setDelegate:self];

    if (self.isSourceTypeCamera) 
        imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
    else
        imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
    

    if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]&&self.isSourceTypeCamera)

        [imagePicker setShowsCameraControls:YES];
        [imagePicker setMediaTypes:[[NSArray alloc] initWithObjects:(NSString *)kUTTypeMovie,(NSString*)kUTTypeImage, nil]];

        if (self.isVideoMode) 
            imagePicker.videoMaximumDuration = 300;
            [imagePicker setCameraCaptureMode:UIImagePickerControllerCameraCaptureModeVideo];
        else
            [imagePicker setCameraCaptureMode:UIImagePickerControllerCameraCaptureModePhoto];
        
        [self presentViewController:imagePicker animated:YES completion:nil];
    else
        if (self.isVideoMode) 
            [imagePicker setMediaTypes:[[NSArray alloc] initWithObjects:(NSString *)kUTTypeMovie, nil]];
        
        [self presentViewController:imagePicker animated:YES completion:nil];
    



- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 
    NSString *mediaType = [info objectForKey: UIImagePickerControllerMediaType];

    if (CFStringCompare ((__bridge CFStringRef) mediaType, kUTTypeMovie, 0) == kCFCompareEqualTo) 
        NSURL *videoUrl=(NSURL*)[info objectForKey:UIImagePickerControllerMediaURL];
        NSString *moviePath = [videoUrl path];

        if (UIVideoAtPathIsCompatibleWithSavedPhotosAlbum (moviePath)) 
            UISaveVideoAtPathToSavedPhotosAlbum (moviePath, nil, nil, nil);
        

        NSData *videoData = [NSData dataWithContentsOfURL:videoUrl];
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsDirectory = [paths objectAtIndex:0];
        NSString *strFile = [Shared getAUniqueFileName];
        NSString *tempPath = [documentsDirectory stringByAppendingFormat:@"/%@.mp4",strFile];

    else if (CFStringCompare ((__bridge CFStringRef) mediaType, kUTTypeImage, 0) == kCFCompareEqualTo)
        NSLog(@"image captured");

        UIImage *image = [info valueForKey:UIImagePickerControllerOriginalImage];
        NSData *imageData = UIImageJPEGRepresentation(image, 0.0);
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsDirectory = [paths objectAtIndex:0];
        NSString *strFile = [Shared getAUniqueFileName];
        NSString *tempPath = [documentsDirectory stringByAppendingFormat:@"/%@.jpeg",strFile];
        [imageData writeToFile:tempPath atomically:NO];
    

    [self dismissViewControllerAnimated:YES completion:nil];


【讨论】:

【参考方案3】:

使用 AFNetworking 3.0 上传文件(视频、图像)

 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    AFHTTPRequestSerializer *serializer = [AFHTTPRequestSerializer serializer];
    [serializer setValue:@"video/mp4" forHTTPHeaderField:@"Content-Type"];
    manager.requestSerializer = serializer;
    NSString *strUrl = @"pass url";

    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"TestVideo" ofType:@"mp4"];
    NSData *fileData = [NSData dataWithContentsOfFile:filePath];

    NSDictionary *param = @@"method":@"uploadMedia",@"media_comment":@"hi",@"fileToUpload":fileData;

    [manager POST:strUrl parameters:param progress:^(NSProgress * _Nonnull uploadProgress) 
        NSLog(@"preogress %f",uploadProgress.fractionCompleted);

     success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) 
        NSLog(@"uploaded successfully");

     failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) 
        NSLog(@"fail to upload");
    ];

【讨论】:

以上是关于UIImagePickerController 让我可以拍摄照片和视频,但不会让我保存或“使用”它们的主要内容,如果未能解决你的问题,请参考以下文章

UIImagePickerController 让我可以拍摄照片和视频,但不会让我保存或“使用”它们

Monotouch - 带有 iPad 应用的 UIImagePickerController

UIImagePickerController 后 UIImage 的大小

一个 UIImagePickerController 用于多个 ImageVIews

Swift 中的 UIImagePickerController 图像

裁剪和旋转 UIImagePickerController 选择的照片