Согласно вашему описанию и сообщению об ошибке, вам нужно обернуть ваш URI с помощью FileProvider. Так как android uri выдаст вам file: //, а FileProvider выдаст вам содержимое: // во-первых.
Android.Net.Uri pdfPath = FileProvider.GetUriForFile(context, context.ApplicationContext.PackageName + ".provider", file);
, вам нужно добавить FileProvider в манифест:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.companyname.pdfsample" android:installLocation="auto">
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="28" />
<application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme">
<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>
Вам также необходимо создать папку Resources \ xml с file_paths. 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>
Открыть pdf-код:
var externalPath = global::Android.OS.Environment.ExternalStorageDirectory.Path + "/testfolder";
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 = 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();
}
}
Вот та же ветка, которую вы можете взять посмотрите:
Как открыть внутренне созданный PDF в Xamarin. Android через FileProvider в системном приложении PDF по умолчанию?