как показать PDF из мобильного хранилища в приложении xamarin android c #?

Я работаю в приложении xmarin для Android на С#. Я хочу открыть файл PDF, который находится в пользовательской папке внутреннего хранилища «TESTFOLDER». код приведен ниже, каждый раз, когда он переходит в раздел catch, с которого он собирается начать действие. как его открыть? введите здесь описание изображения

код

var externalPath = global::Android.OS.Environment.ExternalStorageDirectory.Path + "/TESTFOLDER";
                Java.IO.File file = new Java.IO.File(externalPath, "qdummy.pdf");
                if(file.Exists())
                {
                    try
                    {
                        file.SetReadable(true);
                        Android.Net.Uri uri = Android.Net.Uri.FromFile(file);
                        Intent intent = new Intent(Intent.ActionView);
                        intent.SetDataAndType(uri, "application/pdf");
                        intent.SetFlags(ActivityFlags.ClearWhenTaskReset | ActivityFlags.NewTask);                        
                        intent.SetFlags(ActivityFlags.NoHistory);
                        StartActivity(intent);                        
                    }
                    catch (Exception ex)
                    {
                        Toast.MakeText(Application.Context, "problem", ToastLength.Long).Show();
                    }
                }
                else
                {
                    Toast.MakeText(Application.Context, "No exx", ToastLength.Long).Show();
                }

person Soumen Halder    schedule 14.02.2020    source источник


Ответы (2)


Согласно вашему описанию и сообщению об ошибке, вам необходимо обернуть свой URI с помощью FileProvider. Поскольку Android uri предоставит вам файл://, а 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 по умолчанию?

person Cherry Bu - MSFT    schedule 17.02.2020
comment
Спасибо за ответ @Cherry Bu - MSFT, я просто копирую и помещаю ваш код в свой MainActivity.cs, теперь он просит пользователей открыть pdf с предпочтительными приложениями, установленными на мобильном телефоне, у меня есть 3 варианта открытия pdf в моем мобильном телефоне, i) wps office ii) Drive PDF viewer iii) Adobe Acrobat Reader. После открытия wps office - он говорит, что wps office определяет тип документа, а PDF не отображается. В программе просмотра Drive PDF -- после открытия ничего не отображается. а в акробат ридер пишет что файл не доступен. проверьте свое местоположение, но PDF-файл находится в правильном месте. - person Soumen Halder; 17.02.2020
comment
Здесь я использую minSdkVersion=19 и targetSdkVersion=27 , тестовый pdf обычно открывается из папки внешнего хранилища через i) wps office ii) Drive PDF viewer iii) приложения Adobe Acrobat Reader. Есть ли еще что мне не хватает. пожалуйста, помогите @Cherry Bu - MSFT - person Soumen Halder; 17.02.2020
comment
@Soumen Пожалуйста, подождите минуту, я проверю его на своей стороне, чтобы выбрать программу просмотра PDF. - person Cherry Bu - MSFT; 18.02.2020
comment
дорогой @Cherry Bu - проблема с MSFT решена. Я предоставил ответ в разделе ответов. - person Soumen Halder; 18.02.2020

проблема решена,

** выполните все шаги, описанные в этом блоге, просто замените блок try catch, чтобы решить проблему.

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();
                    }
person Soumen Halder    schedule 18.02.2020
comment
Рад слышать, что вы решили свою проблему, пожалуйста, не забудьте отметить свой ответ как ответ, спасибо. - person Cherry Bu - MSFT; 19.02.2020