2015-01-29 2 views
5

Я использую приведенный ниже код для совместного использования видео, размещенного на устройстве, он отлично работает для обмена сообщениями, facebook и iCloud, только не для почты, я могу видеть почтовый вариант есть, но в черновике письма видео не прилагается.Видео, не прикрепленное для почты при обмене видео с помощью UIActivityViewController

В коде videoAsset является PHAsset типа PHAssetMediaTypeVideo.

[[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, он работает, я искал, но не мог найти ответ, пожалуйста, помогите.

+0

http://stackoverflow.com/a/20211603/2074320 –

+0

@mitulmarsonia что? – gabbler

+0

варианты, показанные в UIActivityViewController полностью зависит от типа элементов, которые должны быть разделены. Например, если есть видеоролик, в нем не будет отображаться опция Facebook или Twitter. Но если это изображение и название, он определенно покажет соответствующие параметры. Ниже перечислены приложения, такие как почта, твиттер, Facebook, назначениеToContact, сохранение в кадре, печать, копирование и т. Д. –

ответ

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 

       }); 


     } 
    }]; 
}]; 
+0

У вас есть фрагмент того, как вы использовали 'requestExportSessionForVideo'? Я пытаюсь использовать его, но outputURL всегда приходит как ноль. Благодаря! – batkru

+0

См. Отредактированный пост. – gabbler

+0

Amaaaaaaaaaaazing! Я потратил так много времени, пытаясь без везения! Большое спасибо – batkru