Xamarin FileProvider не может открывать файлы в Android

#c# #xamarin.forms #android-fileprovider

#c# #xamarin.forms #android-fileprovider

Вопрос:

в моем приложении Xamarin Forms я создаю PDF-файлы, которые можно открыть с помощью приложения Android.

На устройстве с Android 7 все работает нормально, теперь я протестировал его на Android 8, и файл не может быть открыт.

Я установил Xam.Подключите мультимедиа и оставьте все настройки по умолчанию:

в MainActivity я переопределил функцию onRequestPermissionsResult с помощью:

Plugin.Permissions.PermissionsImplementation.Current.OnRequestPermissionsResult(requestCode, permissions, grantResults);

file_paths.xaml является:

 <?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-files-path name="my_images" path="Pictures" />
    <external-files-path name="my_movies" path="Movies" />
</paths>
  

и в AndroidManifest.xml Я добавил:

 <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>
  

Код для открытия предварительного просмотра следующий:

 public void OpenPreviewFile(string FilePath)
{

    Java.IO.File JavaFile = new Java.IO.File(FilePath);   

    Android.Net.Uri Path = FileProvider.GetUriForFile(global::Android.App.Application.Context, global::Android.App.Application.Context.PackageName   ".fileprovider", JavaFile);

    string Extension = global::Android.Webkit.MimeTypeMap.GetFileExtensionFromUrl(Path.ToString());
    string MimeType = global::Android.Webkit.MimeTypeMap.Singleton.GetMimeTypeFromExtension(Extension);
    Intent Intent = new Intent(Intent.ActionView);

    Intent.SetDataAndType(Path, MimeType);
    Intent.AddFlags(ActivityFlags.GrantReadUriPermission);
    Intent.SetFlags(ActivityFlags.ClearWhenTaskReset | ActivityFlags.NewTask);

    try
    {
        MainActivity.AppInstance.StartActivity(Intent.CreateChooser(Intent, TS.Translate("ANDROID_ScegliApp")));
    }
    catch (System.Exception)
    {
        Toast.MakeText(MainActivity.AppInstance, TS.Translate("ANDROID_ImpossibileAprireIlFIle"), ToastLength.Short).Show();
    }
}
  

Созданные файлы находятся по этому пути:
Android/data/MY_PACKAGE_ID/files/GeneratedReports

Я прикрепил видео, чтобы показать реальное поведение.

Видео

Вот пример

Комментарии:

1. ваш applicationId тот же, который вы используете в качестве пакета? попробуйте написать это вручную и повторите попытку

2. Привет, спасибо вам, я пытался написать это от руки, но проблема все еще сохраняется.

Ответ №1:

Я нашел проблему.

Внутри file_paths.xml значение «path» для узлов должно начинаться с «/»,

итак, с этим узлом: <files-path name="GeneratedReports" path="/GeneratedReports" /> мой код работает.

Также мне нужно было удалить MyIntent.SetFlags(ActivityFlags.ClearWhenTaskReset | ActivityFlags.NewTask);

Комментарии:

1. Я пытался заставить это работать уже полдня. Удаление строки, о которой вы упомянули выше, помогло мне. Большое спасибо, вы сделали мой день лучше!