как открыть pdf в xmarine android? - PullRequest
0 голосов
/ 17 февраля 2020

Привет, я новичок в xmarine android, я работаю в проекте xmarin android c#, чтобы открыть pdf-файл, который находится в папке «testpdf» внутреннего мобильного хранилища. фиктивный PDF-файл находится в папке «testpdf». Приложение просит пользователя выбрать предпочитаемые приложения для просмотра PDF, чтобы открыть этот PDF. но после выбора предпочтительных приложений pdf не отображается. Я выполнил следующие шаги:

добавьте FileProvider в манифест приложения:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="RunTimePerm.RunTimePerm" android:versionCode="1" android:versionName="1.0" android:installLocation="auto">
    <uses-sdk android:minSdkVersion="19" android:targetSdkVersion="27" />   
    <application android:allowBackup="true" android:label="@string/app_name" android:supportsRtl="true">
        <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>

затем добавил ссылку Xmarin. Android .Support.V4 от NuGet.

, затем следующий код:

var externalPath = global::Android.OS.Environment.ExternalStorageDirectory.Path + "/testpdf";
                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 = Android.Support.V4.Content.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();
                    }
                }

У меня на мобильном телефоне есть 3 варианта открытия PDF-файла чтобы проверить сценарий, i) wps office ii) подключить средство просмотра PDF iii) Adobe Acrobat Reader. После открытия wps office - он говорит: «wps office определяет тип документа», а PDF не отображается. В Drive PDF viewer-- после открытия ничего не показывает. и в Acrobat Reader - он говорит, что «файл не доступен. Проверьте ваше местоположение», но PDF присутствует в правильном местоположении. Как решить?

1 Ответ

1 голос
/ 18 февраля 2020

получил решение,

try
                    {
                        string extension = MimeTypeMap.GetFileExtensionFromUrl(Android.Net.Uri.FromFile(file).ToString());
                        string mimeType = MimeTypeMap.Singleton.GetMimeTypeFromExtension(extension);
                        Intent intent = new Intent(Intent.ActionView);
                        intent.SetFlags(ActivityFlags.ClearTop | ActivityFlags.NewTask);
                        Android.Net.Uri path = FileProvider.GetUriForFile(Application.Context, Android.App.Application.Context.PackageName + ".provider", file);
                        intent.SetDataAndType(path, mimeType);
                        intent.AddFlags(ActivityFlags.GrantReadUriPermission);
                        Application.Context.StartActivity(Intent.CreateChooser(intent, "Choose App"));
                    }
                    catch (Exception ex)
                    {
                        Toast.MakeText(Application.Context, "problem", ToastLength.Long).Show();
                    }
...