Xamarin.forms 以Xamarin表单打开本地pdf文件
我正在尝试以xamarin表单打开本地pdf文件,我的代码:Xamarin.forms 以Xamarin表单打开本地pdf文件,xamarin.forms,Xamarin.forms,我正在尝试以xamarin表单打开本地pdf文件,我的代码: var context = Forms.Context; Java.IO.File javaFile = new Java.IO.File(filePath); Android.Net.Uri uri = FileProvider.GetUriForFile(context, "myAuth.fileprovider", javaFile); context.GrantUriPermission(context.P
var context = Forms.Context;
Java.IO.File javaFile = new Java.IO.File(filePath);
Android.Net.Uri uri = FileProvider.GetUriForFile(context, "myAuth.fileprovider", javaFile);
context.GrantUriPermission(context.PackageName, uri, ActivityFlags.GrantReadUriPermission);
Intent intent = new Intent(Intent.ActionView);
intent.SetDataAndType(uri, "application/pdf");
intent.SetFlags(ActivityFlags.ClearWhenTaskReset | ActivityFlags.NewTask);
Xamarin.Forms.Forms.Context.StartActivity(intent);
我遵循了以下几个教程:
但现在我的问题是,我不知道uri是否获取文件的真实路径:
我明白了:
javaFile=“/storage/emulated/0/Download/myReport.pdf”(选中并存在)
uri=
"content://myAuth.fileprovider/external_files/Download/myReport.pdf"
但我在我的pdf应用程序“此文件无法访问”中遇到了此错误。我需要更改什么以获取文件的真实路径?我认为问题在于:
Android.Net.Uri uri = FileProvider.GetUriForFile(context, "myAuth.fileprovider", javaFile);
但不知道还有什么变化才能起作用。太多了 您应该在
AndroidManifest.xml
的应用程序
标记中设置文件提供程序
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.companyname.boxviewcolordemo" android:installLocation="auto">
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="28" />
<application android:label="BoxViewColorDemo.Android">
<provider android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths"></meta-data>
</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" />
</manifest>
然后在dependenceService成就中,您应该使用以下代码。注意:FileProvider.GetUriForFile(context,context.ApplicationContext.PackageName+“.FileProvider”,文件)代码>第二个属性是包名和“.fileprovider”
并且不要忘记在运行时授予读/写权限。对于测试,您可以将以下代码添加到MainActivity.cs
的OnCreate
方法中
if (ContextCompat.CheckSelfPermission(this, Manifest.Permission.WriteExternalStorage) != (int)Permission.Granted)
{
RequestPermissions(new string[] { Manifest.Permission.ReadExternalStorage, Manifest.Permission.WriteExternalStorage }, 0);
}
我将pdf文件放入下载文件夹,我的文件路径是DependencyService.Get().OpenPDf(“/storage/emulated/0/Download/test.pdf”)代码>
如果有人遵循了之前的步骤,但仍然无法工作,并且问题仍然存在于varuri=FileProvider.GetUriForFile(context,context.ApplicationContext.PackageName+“.FileProvider”,file)行中代码>。也请检查此项:
1-检查它是否进入应用程序标记
2-检查自动权限,通常您将使用“${applicationId}.provider”,但如果不起作用,请使用文本,例如myAuth.fileprovider
<application>
...
<provider ..android:authorities="myAuth.fileprovider" ..>
<meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths"></meta-data>
</provider>
</application>
...
3-检查上下文,var context=Android.App.Application.context
通常是这样,但是如果这个不起作用,您可以尝试MainActivity.Current
,但是您需要首先在MainActivity类中创建一个静态变量,如下所示:public static MainActivity Current=null
并初始化为OnCreate方法Current=this代码>。那是我的问题
4-检查数据的MimeType类型,intent.SetDataAndType(uri,“application/pdf”)代码>
再次感谢Leon Lu-MSFT提供的答案,这只是对与我面临相同问题的任何人的延伸。我遵循所有这些步骤,但最终问题出在上下文上。这是正确的解决方案,但我需要更改MainActivity.Current的上下文,并创建一个新变量“publicstaticmainActivity Current=null;”并在OnCreate方法“Current=this;”中初始化。
if (ContextCompat.CheckSelfPermission(this, Manifest.Permission.WriteExternalStorage) != (int)Permission.Granted)
{
RequestPermissions(new string[] { Manifest.Permission.ReadExternalStorage, Manifest.Permission.WriteExternalStorage }, 0);
}
<application>
...
<provider ..android:authorities="myAuth.fileprovider" ..>
<meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths"></meta-data>
</provider>
</application>