Отображение PDF-файла с MVVM Cross на Android и IOS - PullRequest
0 голосов
/ 26 июня 2019

Я хочу открыть PDF-файл на телефоне через путь к файлу, но не могу понять, как я могу сделать это правильно, не используя сторонние пакеты.

У вас есть предложения по этому поводу?

Я уже пытался использовать это на Android:

public void OpenFile(string filePath)
{
     var fileToOpen = new Java.IO.File(filePath);

     var uri = FileProvider.GetUriForFile(Application.Context, Application.Context.PackageName + ".fileprovider", fileToOpen);
     var intent = new Intent();
     var mime = IOUtil.GetMimeType(uri.ToString());

     intent.SetAction(Intent.ActionView);
     intent.SetDataAndType(uri, mime);
     intent.SetFlags(ActivityFlags.NewTask);
     intent.AddFlags(ActivityFlags.GrantReadUriPermission);

     Application.Context.StartActivity(intent);
}

Но я получаю следующую ошибку:

Необработанное исключение:

Java.Lang.NullPointerException: попытка вызвать виртуальный метод «android.content.res.XmlResourceParser android.content.pm.ProviderInfo.loadXmlMetaData (android.content.pm.PackageManager, java.lang.String) 'для ссылки на пустой объект

Ответы [ 2 ]

1 голос
/ 28 июня 2019

сначала вы должны добавить этот код в manifest файл:

<provider
        android:name="android.support.v4.content.FileProvider"
        android:authorities="${applicationId}.easyphotopicker.fileprovider"
        android:exported="false"
        android:grantUriPermissions="true"
        tools:replace="android:authorities">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/filepaths"
            tools:replace="android:resource"/>
    </provider>

и создать filepaths:

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
   <root-path name="root" path="" /> //root directory of the device new File("/");
   <files-path name="files" path="" /> //context.getFilesDir()
   <cache-path name="cache" path="" /> //context.getCacheDir()
   <external-path name="external" path="" /> //Environment.getExternalStorageDirectory()
   <external-files-path name="name" path="path" /> //context.getExternalFilesDirs()
   <external-cache-path name="name" path="path" /> //getExternalCacheDirs()
</paths>
0 голосов
/ 27 июня 2019

Ваша ошибка говорит нам, что в месте совпадения нет файла, который передается в функцию. Есть несколько способов сделать это, один из них как показано. После принятия разрешений на доступ к папкам и файлам это должен быть один из самых простых способов. Вы, кажется, близки:

public void OpenPdfFile(string filename)
{
  var f = new Java.IO.File(filename);
  if (f.Exists())
  {
    System.Diagnostics.Debug.WriteLine("File exists!");
    try
    {
      var openFileIntent = new Intent(Intent.ActionView);
      openFileIntent.SetDataAndType(Android.Net.Uri.FromFile(f), "application/pdf");
      openFileIntent.SetFlags(ActivityFlags.NoHistory);

      StartActivity(Intent.CreateChooser(openFileIntent, "Open pdf file"));
    }
    catch (ActivityNotFoundException)
    {
      //handle when no available apps
    }
  }
}

Я не проверял твою работу, но первым делом посмотрел бы, добавил ли ты это в файл манифеста android:authorities="com.{package}.{name}.fileprovider" так как ваш код говорит Application.Context.PackageName + ".fileprovider"

...