Передача файла в другие приложения на планшете Huawai с уровнем API 24 - PullRequest
0 голосов
/ 26 февраля 2019

Мое приложение создает PDF-файл и передает его другим приложениям для отображения в другом месте.Я создаю файл во внутреннем хранилище, чтобы у пользователя было меньше разрешений.

Я создаю свое намерение с помощью:

Intent viewIntent = new Intent(Intent.ActionView);
Java.IO.File document = new Java.IO.File(filePath);
Android.Net.Uri contentUri = FileProvider.GetUriForFile(
    _context,
    _context.PackageName + ".provider",
    document);

viewIntent.SetDataAndType(contentUri, GetMimeType(document));
viewIntent.SetFlags(ActivityFlags.NewTask);
viewIntent.AddFlags(ActivityFlags.GrantReadUriPermission);
viewIntent.AddFlags(ActivityFlags.ClearTask);
viewIntent.AddFlags(ActivityFlags.GrantPersistableUriPermission);
viewIntent.AddFlags(ActivityFlags.GrantPrefixUriPermission);
viewIntent.AddFlags(ActivityFlags.GrantWriteUriPermission);
Intent chooser = Intent.CreateChooser(viewIntent, "");
chooser.SetFlags(ActivityFlags.NewTask);
chooser.AddFlags(ActivityFlags.GrantReadUriPermission);
chooser.AddFlags(ActivityFlags.ClearTask);
chooser.AddFlags(ActivityFlags.GrantPersistableUriPermission);
chooser.AddFlags(ActivityFlags.GrantPrefixUriPermission);
chooser.AddFlags(ActivityFlags.GrantWriteUriPermission);

_context.StartActivity(viewIntent);

В Google Pixel 3 XL, где я тестирую, я могуоткрыть PDF без проблем.

Когда я делаю то же самое на планшете Huawei с уровнем API 24, иногда все работает, но в других случаях Adobe Acrobat выдает ошибку: This file could not be accessed. Check the location or the network and try again.

поведение не является детерминированным, иногда я получаю сообщение об ошибке, но в других случаях все работает нормально.

1 Ответ

0 голосов
/ 27 февраля 2019

В узле Application вашего Манифеста Android убедитесь, что вы добавили определение FileProvider:

<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/provider_paths" />
</provider>

Добавьте файл Resources/xml/provider_paths с содержанием:

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

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

Т.е. если вы обмениваетесь файлом из внутреннего хранилища приложения, вам нужно будет добавить туда определение files-path.

Тогда когдаобщий доступ к файлу, который вы просто делаете:

var packageName = context.ApplicationInfo.PackageName;
var fileProviderName = $"{packageName}.FileProvider";

var intent = new Intent(Intent.ActionSend);
intent.AddFlags(ActivityFlags.GrantReadUriPermission);
intent.SetType("image/*"); // change mime type if wanting to open in other app
intent.PutExtra(Intent.ExtraStream,
    FileProvider.GetUriForFile(context, fileProviderName, new Java.IO.File(filePath)));

StartActivity(intent);

Этого должно быть достаточно, каждый раз у меня хорошо работает обмен изображениями с другим приложением.Я не думаю, что вам нужны флаги для вашего выбора Intent, только для внутреннего viewIntent.Также GrantReadUriPermission должен быть единственным, что необходимо, если вы предоставляете флаги.

...