Ios UIImagePickerController允许我拍摄照片和视频,但不允许我保存它们或";使用「;他们

Ios UIImagePickerController允许我拍摄照片和视频,但不允许我保存它们或";使用「;他们,ios,iphone,objective-c,uiimage,uiimagepickercontroller,Ios,Iphone,Objective C,Uiimage,Uiimagepickercontroller,我现在正在开发一个简单的照片和视频捕获应用程序。该应用程序允许用户通过按下按钮成功拍摄照片或视频。然而,一旦你完成拍摄照片或视频,它会提供两个选项:“重拍”和“使用照片”或“使用视频”,这取决于你使用的是哪一个 如果用户点击“Retake”,那么它只是让他们重新拍摄一张新照片或视频,但当用户点击“Use photo”或“Use video”时,它什么也不做。应用程序只是将它们带回应用程序主屏幕 我对如何访问“使用照片”/“使用视频”按钮感到困惑,这样我就可以编辑它的代码,并让它将图像和视频保存到

我现在正在开发一个简单的照片和视频捕获应用程序。该应用程序允许用户通过按下按钮成功拍摄照片或视频。然而,一旦你完成拍摄照片或视频,它会提供两个选项:“重拍”和“使用照片”或“使用视频”,这取决于你使用的是哪一个

如果用户点击“Retake”,那么它只是让他们重新拍摄一张新照片或视频,但当用户点击“Use photo”或“Use video”时,它什么也不做。应用程序只是将它们带回应用程序主屏幕

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

以下是我目前掌握的代码:

ViewController.h:

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UINavigationControllerDelegate, UIImagePickerControllerDelegate>

@property UIImagePickerController * pickerController;

-(IBAction)showCameraUI;

@end
#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
#导入
@界面ViewController:UIViewController
@属性UIImagePickerController*pickerController;
-(i)showCameraUI;
@结束
ViewController.m:

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UINavigationControllerDelegate, UIImagePickerControllerDelegate>

@property UIImagePickerController * pickerController;

-(IBAction)showCameraUI;

@end
#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
#导入“ViewController.h”
@界面视图控制器()
@结束
@实现视图控制器
-(无效)viewDidLoad
{
[超级视图下载];
//加载视图后,通常从nib执行任何其他设置。
[UIImagePickerController isSourceTypeAvailable:UIImagePickerController SourceTypeCamera];
[UIImagePickerController可用于源类型的媒体类型:UIImagePickerController源类型照相机];
NSLog(@“%ld”,(长)UIImagePickerControllerSourceTypeCamera);}
-(无效)未收到记忆警告
{
[超级记忆警告];
//处置所有可以重新创建的资源。
}
-(IBAction)showCameraUI{
UIImagePickerController*pickerController=[[UIImagePickerController alloc]init];
pickerController.mediaTypes=[UIImagePickerController可用于源类型的媒体类型:UIImagePickerController源类型Camera];
pickerController.sourceType=UIImagePickerController源类型摄像头;
[self-presentViewController:pickerController动画:是完成:空];
}
@结束

您可以使用
UIImagePickerController
didFinishPickingMediaWithInfo
委托保存图像

为此,您需要执行以下操作:

-(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];
}

您可以使用
UIImagePickerController
didFinishPickingMediaWithInfo
委托保存图像

为此,您需要执行以下操作:

-(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];
}

请试着用这个

- (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];

}

请试着用这个

- (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];

}
使用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");
    }];
使用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");
    }];

谢谢,但函数的“保存照片”主体中有什么内容?@user311709:我也添加了,请检查我是否复制/粘贴了您的代码,但它与“mediaType”不同。上面写着“使用未声明的标识符‘mediaType’”,我刚刚添加了你的新修复程序,问题就解决了,但它并没有给我“kUTTypeImage”@user311709同样的错误。添加“MobileCoreServices.framework”框架并导入
#导入
谢谢,但是“保存照片”中有什么内容函数体?@user311709:我也添加了,请检查我是否复制/粘贴了您的代码,但它不喜欢“mediaType”。上面写着“使用未声明的标识符‘mediaType’”,我刚刚添加了你的新修复程序,问题就解决了,但它并没有给我“kUTTypeImage”@user311709添加‘MobileCoreServices.framework’框架并导入
#import