使用UIActivityViewController分享视频时,邮件中未附带视频

5
我正在使用以下代码分享设备上的视频,它可以通过信息、Facebook和iCloud进行共享,但无法通过电子邮件进行共享。我可以看到电子邮件选项,但在电子邮件草稿中,视频未附加。
代码中,videoAsset 是类型为 PHAssetMediaTypeVideoPHAsset
[[PHImageManager defaultManager] requestAVAssetForVideo:videoAsset options:nil resultHandler:^(AVAsset *asset, AVAudioMix *audioMix, NSDictionary *info) {
    AVURLAsset* urlAsset = (AVURLAsset*)asset;
    fileUrl = urlAsset.URL;
    NSLog(@"fileUrl is %@",fileUrl);

    NSArray *activityItems = [NSArray arrayWithObjects:fileUrl, nil];

    UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:nil];
    [self presentViewController:activityViewController animated:YES completion:nil];
}];

如果我使用UIImagePickerController附加视频,它可以工作。我搜索过但找不到答案,请帮忙。

http://stackoverflow.com/a/20211603/2074320 - Mitul Marsoniya
@mitulmarsonia 什么? - gabbler
UIActivityViewController 中显示的选项完全取决于要共享的项目类型。例如,如果是视频,则不会显示 Facebook 或 Twitter 选项。但如果是图像和标题,则肯定会显示相关选项。以下应用程序将显示邮件、Twitter、Facebook、分配到联系人、保存到照片库、打印、复制等选项。 - Mitul Marsoniya
@mitulmarsonia,如果有视频,它不会显示Facebook或Twitter选项,这是不正确的。对我来说,Facebook是显示的,我可以将视频分享到Facebook,问题是当我分享视频时,邮件选项会显示,但是当我尝试发送邮件时,视频没有附加,接收者也没有收到视频。 - gabbler
1个回答

12

我最终将视频文件保存到文档目录,并使用文档目录中的文件URL,通过邮件附件分享该视频。

[[PHImageManager defaultManager] requestImageDataForAsset:videoAsset options:nil resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info) {
    NSLog(@"info is %@", info);
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString* videoPath = [documentsDirectory stringByAppendingPathComponent:@"IMG_2185.MOV"];

    NSError *error;
    [[NSFileManager defaultManager] removeItemAtPath:videoPath error:&error];
    BOOL success = [imageData writeToFile:videoPath atomically:YES];
    if (success) {
        NSArray *activityItems = [NSArray arrayWithObjects:[NSURL fileURLWithPath:videoPath], nil];

        UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:nil];
        [self presentViewController:activityViewController animated:YES completion:nil];
    }
}];

我还使用了requestExportSessionForVideo方法将视频导出到文档目录,这也起作用了。

[[PHImageManager defaultManager] requestExportSessionForVideo:videoAsset options:nil exportPreset:AVAssetExportPresetPassthrough resultHandler:^(AVAssetExportSession *exportSession, NSDictionary *info) {

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString* videoPath = [documentsDirectory stringByAppendingPathComponent:@"test3.MOV"];
    NSFileManager *manager = [NSFileManager defaultManager];

    NSError *error;
    if ([manager fileExistsAtPath:videoPath]) {
        BOOL success = [manager removeItemAtPath:videoPath error:&error];
        if (success) {
            NSLog(@"I successfully removed it!");
        }
    }

    NSURL *outputURL = [NSURL fileURLWithPath:videoPath];
    NSLog(@"this is the final path %@",outputURL);
    exportSession.outputFileType=AVFileTypeQuickTimeMovie;
    exportSession.outputURL=outputURL;

    [exportSession exportAsynchronouslyWithCompletionHandler:^{
        if (exportSession.status == AVAssetExportSessionStatusFailed) {
            NSLog(@"failed");
        } else if(exportSession.status == AVAssetExportSessionStatusCompleted){
            NSLog(@"completed!");
                dispatch_async(dispatch_get_main_queue(), ^(void) {
                    NSArray *activityItems = [NSArray arrayWithObjects:outputURL, nil];

                    UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:nil];
                    [self presentViewController:activityViewController animated:YES completion:nil];
                    //Main

                });


        }
    }];
}];

你是否有使用requestExportSessionForVideo的代码片段?我正在尝试使用它,但输出URL始终为nil。谢谢! - batkru
太棒了!我花了很多时间却没有成功!非常非常感谢你。 - batkru
如何分享多个视频?使用for循环并导出所有视频。 - Hwangho Kim
@HwanghoKim,我没有尝试过,但是activityItems是一个数组,你可以尝试将多个视频添加到其中。 - gabbler
1
那么分享之后,视频会从文档目录中删除吗?这个处理方式是怎样的? - Gizmodo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接