首页 > 解决方案 > 让系统打开我的应用在 Xamarin 中创建的文件

问题描述

我的应用程序根据现有数据创建文件。有时是a .pdf,有时是a .doc。我想允许用户使用他想使用的任何应用程序打开文件。

是否有使用 Xamarin.forms 打开文件的跨平台方式?

标签: xamarinxamarin.forms

解决方案


您将需要创建自定义平台代码以启用Share功能。

我在 GitHub 上有一个示例,这里https://github.com/Depechie/XamarinFormsOffice但本质上你需要在你的项目中有以下平台代码。

这是一个适用于Android的

   public class ShareService : IShare
    {
        public void Share(string filePath)
        {
            Java.IO.File file = new Java.IO.File(filePath);

            Intent intent = new Intent(Intent.ActionView);
            string mimeType = string.Empty;

            if (Path.GetExtension(filePath).ToLower() == ".pdf")
                mimeType = "application/pdf";
            else if (Path.GetExtension(filePath).ToLower() == ".doc")
                mimeType = "application/msword";
            else if (Path.GetExtension(filePath).ToLower() == ".docx")
                mimeType = "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
            else if (Path.GetExtension(filePath).ToLower() == ".xls")
                mimeType = "application/vnd.ms-excel";
            else if (Path.GetExtension(filePath).ToLower() == ".xlsx")
                mimeType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
            else if (Path.GetExtension(filePath).ToLower() == ".ppt")
                mimeType = "application/vnd.ms-powerpoint";
            else if (Path.GetExtension(filePath).ToLower() == ".jpg")
                mimeType = "image/jpeg";

            var t = Uri.FromFile(file);
            intent.SetDataAndType(t, mimeType);

            intent.SetFlags(ActivityFlags.ClearWhenTaskReset | ActivityFlags.NewTask);
            this.StartActivity(intent);
        }
    }

    public static class ObjectExtensions
    {
        public static void StartActivity(this object o, Intent intent)
        {
            var context = o as Context;
            if (context != null)
                context.StartActivity(intent);
            else
            {
                intent.SetFlags(ActivityFlags.NewTask);
                Application.Context.StartActivity(intent);
            }
        }
    }

这是iOS的一个

   public class ShareService : IShare
    {
        private UIDocumentInteractionController _controller;

        public void Share(string filePath)
        {
            UIApplication.SharedApplication.InvokeOnMainThread(() =>
            {
                _controller = UIDocumentInteractionController.FromUrl(NSUrl.FromFilename(filePath));
                _controller.Name = Path.GetFileName(filePath);
                var window = UIApplication.SharedApplication.KeyWindow;
                var subviews = window.Subviews;
                var view = subviews.Last();
                var frame = view.Frame;
                frame = new CGRect((float)Math.Min(10, frame.Width), (float)frame.Bottom, 0, 0);
                _controller.PresentOptionsMenu(frame, view, true);
            });            
        }
    }

推荐阅读