如何在Xamarin Forms上的默认应用程序中打开PDF或TXT文件

时间:2017-09-12 06:05:24

标签: android ios xamarin.forms

我打算使用Xamarin Forms中的默认应用程序打开文档。我已经尝试过这种方法,但它对我不起作用,我不确定是什么原因。

Device.OpenUri(new Uri(FILE_PATH));

如果有人知道如何处理它,请给我很好的解决方案。 感谢。

3 个答案:

答案 0 :(得分:2)

您可以使用DependencyService从每个平台实现此功能。首先,从PCL创建一个接口,例如:

public interface IFileViewer
{
    void ShowPDFTXTFromLocal(string filename);
}

然后对于Android平台,创建一个类来实现此接口:

[assembly: Xamarin.Forms.Dependency(typeof(FileViewer))]

namespace NameSpace.Droid
{
    public class FileViewer : IFileViewer
    {
        public void ShowPDFTXTFromLocal(string filename)
        {
            string dirPath = Xamarin.Forms.Forms.Context.GetExternalFilesDir(Android.OS.Environment.DirectoryDocuments).Path;
            var file = new Java.IO.File(dirPath, System.IO.Path.Combine(dirPath, filename));

            if (file.Exists())
            {
                Xamarin.Forms.Device.BeginInvokeOnMainThread(() =>
                {
                    var uri = Android.Net.Uri.FromFile(file);
                    Intent intent = new Intent(Intent.ActionView);
                    var mimetype = MimeTypeMap.Singleton.GetMimeTypeFromExtension(MimeTypeMap.GetFileExtensionFromUrl((string)uri).ToLower());
                    intent.SetDataAndType(uri, mimetype);
                    intent.SetFlags(ActivityFlags.ClearWhenTaskReset | ActivityFlags.NewTask);

                    try
                    {
                        Xamarin.Forms.Forms.Context.StartActivity(intent);
                    }
                    catch (Exception ex)
                    {
                        System.Diagnostics.Debug.WriteLine(ex.ToString());
                    }
                });
            }
            else
            {
                System.Diagnostics.Debug.WriteLine("file not found");
            }
        }
    }
}

这个示例仅适用于放置在GetExternalFilesDir(Android.OS.Environment.DirectoryDocuments)中的文件,如果您的文件位于其他位置,则需要修改代码。

答案 1 :(得分:0)

我实现了以下代码并且工作得很好。 我希望这段代码可以帮助别人。

var PreviewController = UIDocumentInteractionController.FromUrl(NSUrl.FromFilename(filePath));
PreviewController.Delegate = new UIDocumentInteractionControllerDelegateClass(UIApplication.SharedApplication.KeyWindow.RootViewController);
Device.BeginInvokeOnMainThread(() =>
{
    PreviewController.PresentPreview(true);
});

public class UIDocumentInteractionControllerDelegateClass : UIDocumentInteractionControllerDelegate
{
    UIViewController ownerVC;

    public UIDocumentInteractionControllerDelegateClass(UIViewController vc)
    {
        ownerVC = vc;
    }

    public override UIViewController ViewControllerForPreview(UIDocumentInteractionController controller)
    {
        return ownerVC;
    }

    public override UIView ViewForPreview(UIDocumentInteractionController controller)
    {
        return ownerVC.View;
    }
}

答案 2 :(得分:0)

2020更新:Xamarin现在使用Xamarin.Essentials为此提供了一个非常简单的解决方案。您可以通过Launcher.OpenAsync使用单行代码在默认应用程序中打开文件:

await Launcher.OpenAsync(new OpenFileRequest { File = new ReadOnlyFile(uri) });

以下是我在应用中使用的一些示例代码,用于在默认应用中打开PDF文件:

private void BtnOpen_Clicked(object sender, EventArgs e)
{
    string filePathAndName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "test.pdf");
    OpenPdf(filePathAndName);
}

public async void OpenPdf(string uri)
{
    await Launcher.OpenAsync(new OpenFileRequest { File = new ReadOnlyFile(uri) });
}

这将在不需要自定义渲染器的任何平台上运行(只要您将Xamarin.Essentials添加到每个项目中)。 Here is a link to the Microsoft documentation,其中提供了一些其他信息。