【问题标题】:Emailing photo taken with ImagePickerController?通过电子邮件发送使用 ImagePickerController 拍摄的照片?
【发布时间】:2012-04-25 05:56:31
【问题描述】:

在我的应用中,我想: a.) 将相机展示给用户拍照 b.) 创建电子邮件并附上拍摄的照片

我想出了如何拍照。但是,我不知道如何将其附加到电子邮件中。在我看到的示例中,文件名是已知的。这是一个例子。

picker.mailComposeDelegate = self;
     [picker setSubject:@"I have a pencil for you"];

     UIImage *roboPic = [UIImage imageNamed:@"RobotWithPencil.jpg"];
     NSData *imageData = UIImageJPEGRepresentation(roboPic, 1);
     [picker addAttachmentData:imageData mimeType:@"image/jpg" fileName:@"RobotWithPencil.jpg"];

     NSString *emailBody = @"This is a cool image of a robot I found.  Check it out!";
     [picker setMessageBody:emailBody isHTML:YES];

     [self presentModalViewController:picker animated:YES];

我从回调方法中获取图像,它确实存储在相机胶卷中。

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


    // Access the uncropped image from info dictionary
    UIImage *image = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
    [picker dismissModalViewControllerAnimated:TRUE];
    [picker release];
     }

但是从那里开始,我不确定如何将图像附加到电子邮件中?主要是因为不知道使用UIImagePickerController相机源获取照片时,添加到相机胶卷时的文件名是什么?

所以,我想我需要: a.) 找到保存图像文件后获取图像文件名称的方法或 b.) 另一种将 UIImage 数据附加为电子邮件附件的方法。

任何帮助表示赞赏。

【问题讨论】:

    标签: iphone


    【解决方案1】:

    也许我不明白你在 UI 方面试图做什么,但为什么这不能从你的代码提供:

    编辑:(更改代码以使用委托)

    - (void)imagePickerController:(UIImagePickerController *)imagepicker didFinishPickingMediaWithInfo:(NSDictionary *)info {
    
    
    // Access the uncropped image from info dictionary
    UIImage *image = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
    if([delegate respondsToSelector:@selector(didSelectImage:)])
         [delegate didSelectImage:image];
     }
    

    这在你的头文件中(通常在你的类声明之上):

    @protocol PostHelperDelegate <NSObject>
    
    @optional
    - (void)DimissModal;
    //image data for image selected
    - (void)DidSelectImage:(UIImage*)image;
    @end
    

    你还需要在你的类中创建这个属性

    @property(nonatomic,assign)id<PostHelperDelegate>* delegate; //don't forgot to synthizie
    

    然后在实现委托的类中,您将为您的类分配委托:

        Poster = [[delegateclass alloc] init];
        Poster.delegate = self;
    

    然后只需添加委托函数:

     - (void)DidSelectImage:(UIImage*)image
     {
       //handle image here
     }
    

    我简化了很多,如果您在使用它时遇到任何问题,请告诉我

    http://www.roostersoftstudios.com/2011/04/12/simple-delegate-tutorial-for-ios-development/

    更新前:

    就我个人而言,我会使用委托来通知图像已被选择,然后启动邮件选择器,但这是另一回事。就 UIImage 而言,我不知道一种方法或从未找到一种方法来命名/或从 UIImagePicker 获取名称,因为我不相信它们被命名为任何有意义的东西。有关代表的任何问题或进一步的解释,请告诉我。

    【讨论】:

    • 我确实将这个 sn-p 添加到了 didFinishPickingMediaWithInfo 中。但是,它仍然无法按预期工作。缺少的一件事是 MailPicker 声明本身。所以,我补充说。但是,它永远不会显示。不知道为什么?我添加的代码是这样的: MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init]; picker.mailComposeDelegate = self;
    • 我认为需要委托人的建议。部分问题在于处理两个模态视图控制器并尝试关闭 ImagePicker,然后从上述事件中打开 MailPicker。
    • 我更新了上面的代码来展示如何做一个委托。我还建议先打开邮件选择器视图,然后在打开后从那里打开图像选择器视图。由于 iOS 导航的工作方式,尝试关闭一个模态视图然后立即打开另一个模态视图总是会遇到问题(也可能会因一堆模态视图上下移动而绊倒用户)。
    【解决方案2】:

    使用下面的代码

        -(void)yourmethodname_clicked{
            UIImagePickerController * picker = [[UIImagePickerController alloc] init];
                    picker.delegate = self;
            if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])  {
                     picker.sourceType = UIImagePickerControllerSourceTypeCamera;
                     [self presentModalViewController:picker animated:YES];
            }
            else{
                     UIAlertView *altnot=[[UIAlertView alloc]initWithTitle:@"Camera Not            Available" message:@"Camera Not Available" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
    
                     [altnot show];
                     [altnot release];
    
            }
        }
    
    
    - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
    [picker dismissModalViewControllerAnimated:YES];
    
    
    MFMailComposeViewController *mailpicker = [[MFMailComposeViewController alloc] init];
    
        [mailpicker.navigationBar setTintColor:[UIColor blackColor]];
        mailpicker.mailComposeDelegate = self;
    
        [mailpicker setSubject:@"set your subject"]; 
    
        NSArray *toRecipients = [NSArray arrayWithObjects: nil];
    
        [mailpicker setToRecipients:toRecipients];
    
        UIImage *picture = [info objectForKey:@"UIImagePickerControllerOriginalImage"]];;
    
        NSData *imageData = UIImagePNGRepresentation(picture);
        [mailpicker addAttachmentData:imageData mimeType:@"image/png" fileName:@"set your file name"];
    
        NSString *emailBody = @"set your body string";
        [mailpicker setMessageBody:emailBody isHTML:YES];
        [mailpicker setSubject:@"set your subject"];
        mailpicker.title = @"Email";
    
        [self presentModalViewController:mailpicker animated:YES];
        [mailpicker release];
    }
    

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2015-11-03
      • 1970-01-01
      • 2017-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-10
      • 2014-04-08
      相关资源
      最近更新 更多