c# - 如何在xmarine android中打开pdf?
问题描述
嗨,我是 xmarine android 的新手,我正在一个 xmarin android c# 项目中打开移动内部存储“testpdf”文件夹中的 pdf 文件。一个虚拟的 pdf 文件位于“testpdf”文件夹中。该应用程序要求用户选择首选的 pdf 查看器应用程序来打开该 pdf。但在选择首选应用程序 pdf 后未显示。我已按照以下步骤操作:
将 FileProvider 添加到应用清单:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="RunTimePerm.RunTimePerm" android:versionCode="1" android:versionName="1.0" android:installLocation="auto">
<uses-sdk android:minSdkVersion="19" android:targetSdkVersion="27" />
<application android:allowBackup="true" android:label="@string/app_name" android:supportsRtl="true">
<provider android:name="android.support.v4.content.FileProvider" android:authorities="${applicationId}.provider" android:exported="false" android:grantUriPermissions="true">
<meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" />
</provider>
</application>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
</manifest>
还使用 file_paths.xml 创建了 Resources\xml 文件夹
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-files-path name="root" path="."/>
<external-files-path name="files" path="files" />
<external-path name="external_files" path="."/>
</paths>
然后添加来自 NuGet 的参考 Xmarin.Android.Support.V4。
然后是以下代码:
var externalPath = global::Android.OS.Environment.ExternalStorageDirectory.Path + "/testpdf";
Java.IO.File file = new Java.IO.File(externalPath, "test.pdf");
if (file.Exists())
{
var context = Android.App.Application.Context;
try
{
Android.Net.Uri pdfPath = Android.Support.V4.Content.FileProvider.GetUriForFile(context, context.ApplicationContext.PackageName + ".provider", file);
context.GrantUriPermission(context.PackageName, pdfPath, ActivityFlags.GrantReadUriPermission);
Intent intent = new Intent();
intent.SetFlags(ActivityFlags.GrantReadUriPermission);
intent.SetAction(Android.Content.Intent.ActionView);
intent.SetFlags(ActivityFlags.NoHistory);
intent.SetFlags(ActivityFlags.ClearWhenTaskReset | ActivityFlags.NewTask);
intent.SetDataAndType(pdfPath, "application/pdf");
context.StartActivity(intent);
}
catch (Exception ex)
{
Toast.MakeText(Application.Context, "problem", ToastLength.Long).Show();
}
}
我的手机中有 3 个选项可以打开 pdf 来测试场景,i) wps office ii) Drive PDF viewer iii)Adobe Acrobat Reader。打开 wps office 后 - 它说“wps office 正在确定文档的类型" 并且 PDF 没有显示。在 Drive PDF 查看器中 - 打开后它什么也不显示。在 acrobat 阅读器中 - 它说“文件 colud 无法访问。检查您的位置”但 pdf 存在于正确的位置。如何解决?
解决方案
得到了解决方案,
try
{
string extension = MimeTypeMap.GetFileExtensionFromUrl(Android.Net.Uri.FromFile(file).ToString());
string mimeType = MimeTypeMap.Singleton.GetMimeTypeFromExtension(extension);
Intent intent = new Intent(Intent.ActionView);
intent.SetFlags(ActivityFlags.ClearTop | ActivityFlags.NewTask);
Android.Net.Uri path = FileProvider.GetUriForFile(Application.Context, Android.App.Application.Context.PackageName + ".provider", file);
intent.SetDataAndType(path, mimeType);
intent.AddFlags(ActivityFlags.GrantReadUriPermission);
Application.Context.StartActivity(Intent.CreateChooser(intent, "Choose App"));
}
catch (Exception ex)
{
Toast.MakeText(Application.Context, "problem", ToastLength.Long).Show();
}
推荐阅读
- python - 使用 discord.ext.commands,我如何让机器人发送自己的用户名?蟒蛇3
- android - Flutter 应用程序卡在 Splashscreen 上
- python - Python - 用 Pandas 替换特定值
- javascript - 如何在 JavaScript 中的键内显示带有键的 json 数据?
- python - 使用 selenium 网络驱动程序抓取
- typescript - 为什么我的带有 x-template 的 Vue 模板没有呈现?
- javascript - 如何防止 GIF 循环运行
- java - 日志上没有 NullPointerException
- objective-c - 使用偏移量缩放 vImage_Buffer - Cocoa Objective C
- sql - IN 查询表达式。(错误 3075)。女士访问