1

我想使用UIActivityViewController从我的iOS应用程序共享文件。我的主要问题是如何处理不同的文件类型。使用UIActivityViewController共享所有类型的文件

什么心中已经走到这一步:

图片

public void OpenInExternalApp(string filepath) 
{ 
    if (!File.Exists(filepath)) 
     return; 

    UIImage uiImage = UIImage.FromFile(filepath); 

    // Define the content to share 
    var activityItems = new NSObject[] { uiImage }; 
    UIActivity[] applicationActivities = null; 

    var activityController = new UIActivityViewController(activityItems, applicationActivities); 

    if (UIDevice.CurrentDevice.UserInterfaceIdiom == UIUserInterfaceIdiom.Phone) 
    { 
     // Phone 
     UIApplication.SharedApplication.KeyWindow.RootViewController.PresentViewController(activityController, true, null); 
    } 
    else 
    { 
     // Tablet 
     var popup = new UIPopoverController(activityController); 
     UIView view = UIApplication.SharedApplication.KeyWindow.RootViewController.View; 
     CGRect rect = new CGRect(view.Frame.Width/2, view.Frame.Height, 50, 50); 
     popup.PresentFromRect(rect, view, UIPopoverArrowDirection.Any, true); 
    } 
} 

不知道从内存管理方面是一次加载图像是一个好主意。如果图像太大而无法完全保存在RAM中会发生什么情况?例如,请参阅here

字符串

var activityItems = new NSObject[] { UIActivity.FromObject(new NSString(text)) }; 

只有文字。

NSURL

NSUrl url = NSUrl.CreateFileUrl(filepath, false, null); 

在这里,在相同的应用程序出现大多数情况下。但是例如PDF阅读器不会出现在PDF文件中。另一面邮件预览显示Adobe Acrobat。

一切

var activityItems = new NSObject[] { NSData.FromFile(filepath) }; 

最后一种方法有未显示所有的应用程序的缺点,这对于例如可以打开PDF文件。也适用this

我想使用所有类型的文件。我不认为UIActivity的子类在这里会有所帮助。也许是UIActivityItemProvider的一个sublcass?

备注:您也可以在Objective C/Swift中发布您的解决方案。

回答

3

我试图实现UIActivityItemProvider,但这里又不是所有显示相应文件类型的应用程序。例如。对于docx文档Word没有显示。

现在我切换到UIDocumentInteractionController现在有很多应用程序可用。

UIDocumentInteractionController documentController = new UIDocumentInteractionController(); 
documentController.Url = new NSUrl(filepath, false); 
string fileExtension = Path.GetExtension(filepath).Substring(1); 
string uti = UTType.CreatePreferredIdentifier(UTType.TagClassFilenameExtension.ToString(), fileExtension, null); 
documentController.Uti = uti; 

UIView presentingView = UIApplication.SharedApplication.KeyWindow.RootViewController.View; 
documentController.PresentOpenInMenu(CGRect.Empty, presentingView, true); 

Imho有太多的应用程序,因为文件类型xml不应该真的被PDF阅读器支持,但它是。然而,这似乎现在由于工作this post

一般来说,如果你要共享的图像或网址,你可能需要使用一个UIActivityViewController。如果您要共享文档,则可能需要使用UIDocumentInteractionController。

相关问题