xamarin - 让系统打开我的应用在 Xamarin 中创建的文件
问题描述
我的应用程序根据现有数据创建文件。有时是a .pdf
,有时是a .doc
。我想允许用户使用他想使用的任何应用程序打开文件。
是否有使用 Xamarin.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);
});
}
}
推荐阅读
- javascript - 基于 HTML 表单中的用户输入刷新图像
- swift - 如何使用第三方库在我的 Swift 应用程序中获取我附近的所有 wifi 列表
- json - 使用 Jackson 解组“Json 输入流必须以 Json 对象数组开头”
- python - 如何修复“使用 tensorflow 后端”Keras 导入错误?
- c - 在 C 中定义导致错误之前的函数声明
- graphviz - 哪个图形可视化库适合带文本的静态节点和边?
- c++ - 对二进制文件使用格式化的 I/O 运算符是否有效?
- json - 如何自定义 json_serializable 库代码生成?
- python - 在 Python 中使用 np.mean()
- python - 如何执行“pip 安装脚本”