Xamarin.forms 以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

我正在尝试以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.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”)


如果有人遵循了之前的步骤,但仍然无法工作,并且问题仍然存在于var
uri=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>