我打算使用Xamarin Forms中的默认应用程序打开文档。我已经尝试过这种方法,但它对我不起作用,我不确定是什么原因。
Device.OpenUri(new Uri(FILE_PATH));
如果有人知道如何处理它,请给我很好的解决方案。 感谢。
答案 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,其中提供了一些其他信息。