Ошибка открытия файлов .DocX ​​в общем хранилище с помощью FileProvider в новом Intent в Android - PullRequest
0 голосов
/ 20 сентября 2019

Ни Word, ни Документы не откроют файл.Word выдает ошибку «Попробуйте сохранить файл на устройстве», и, просматривая журнал Docs, обнаруживается ошибка разрешения Java.

Файлы записываются в общедоступную папку «Изображения» , и я могуоткройте их из Word на устройстве, если я вручную перейду к ним, но пользователь должен иметь возможность щелкнуть логотип .Doc и открыть файл из приложения.
Я добавил флаги разрешений, но мне все еще не повезло.

Пути:

<?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" />
    <external-path name="external_files" path="." />
</paths>

Внутри тегов приложения в манифесте

    <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>
 </provider>
 <provider android:name="android.support.v4.content.FileProvider" android:authorities="com.company.app.fileprovider" android:exported="false" android:grantUriPermissions="true">
                <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" />
 </provider>

Основная функция, открывающая новое намерение (Word или Docs)

var filename = "AFileName"
var localPhotoPath = System.IO.Path.Combine(global::Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryPictures).AbsolutePath, "workOrder");
                localPhotoPath = System.IO.Path.Combine(localPhotoPath, "filename");
                if (filename.Contains(".docx"))
                {
                    Intent viewIntent = new Intent(Intent.ActionEdit);
                    //viewIntent.SetAction();
                    Java.IO.File exportFile = new Java.IO.File(localPhotoPath);
                    exportFile.SetReadable(true);
                    var photoURI = FileProvider.GetUriForFile(Application.Context, "com.company.app.fileprovider", exportFile);

                    viewIntent.SetDataAndType(photoURI, "application/vnd.openxmlformats-officedocument.wordprocessingml.document");
                    viewIntent.AddFlags(ActivityFlags.GrantReadUriPermission);
                    viewIntent.AddFlags(ActivityFlags.GrantWriteUriPermission);
                    viewIntent.AddFlags(ActivityFlags.NewTask);
                    var resolved = PackageManager.QueryIntentActivities(viewIntent, 0);

                    if (resolved != null && resolved.Count > 0)
                    {
                        foreach (var t in resolved)
                        {
                            Application.Context.GrantUriPermission(t.ActivityInfo.PackageName, photoURI, ActivityFlags.GrantReadUriPermission);
                            StartActivity(viewIntent);
                        }
                        StartActivity(viewIntent);
                    }
                    else
                    {
                        // notify the user they can't open it.
                    }
                }

1 Ответ

0 голосов
/ 27 сентября 2019

Итак, получается, что наличие двух провайдеров будет не работать, и устранение постороннего провайдера - это то, что решило эту проблему.Я опубликую здесь рабочий код для всех, кто сталкивался с этой проблемой.

Пути одинаковы, так как мы сохраняем их во внешней общей папке.

В манифесте Android:

    <application android:allowBackup="true" android:icon="@mipmap/VamsLauncher" android:label="@string/app_name" android:roundIcon="@mipmap/VamsLauncher" android:supportsRtl="true" android:theme="@style/AppTheme">
    <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>
    </provider>
</application>

Функция, которая открывает файл в новом приложении

                Intent viewIntent = new Intent(Intent.ActionView);
                //viewIntent.SetAction();
                Java.IO.File exportFile = new Java.IO.File(localPhotoPath);
                exportFile.SetReadable(true);
                var photoURI = FileProvider.GetUriForFile(Application.Context, Application.Context.ApplicationContext.PackageName + ".fileprovider", exportFile);

                viewIntent.SetDataAndType(photoURI, "application/vnd.openxmlformats-officedocument.wordprocessingml.document");
                viewIntent.AddFlags(ActivityFlags.NewTask);
                viewIntent.AddFlags(ActivityFlags.GrantReadUriPermission);
                viewIntent.AddFlags(ActivityFlags.GrantWriteUriPermission);
                var resolved = PackageManager.QueryIntentActivities(viewIntent, 0);

                if (resolved != null && resolved.Count > 0)
                {
                    foreach (var t in resolved)
                    {
                        Application.Context.GrantUriPermission(t.ActivityInfo.PackageName, photoURI, ActivityFlags.GrantReadUriPermission);

                    }
                    StartActivity(viewIntent);
                }
                else
                {
                    // notify the user they can't open it.
                }
...