Как загрузить изображение из намерения в Flutter? - PullRequest
0 голосов
/ 26 мая 2018

Я делюсь изображением из приложения для Android с помощью кнопки «Поделиться».Функция дескриптора намерения выглядит примерно так:

void handleFileIntent(Intent intent) {
    System.out.println("inside intent");
    Uri imageUri = intent.getParcelableExtra(Intent.EXTRA_STREAM);
    fileName = imageUri.getPath();

Uri, превращенный в строку, возвращает следующее:

content: //com.google.android.apps.photos.contentprovider / -1 / 1 / content% 3A% 2F% 2Fmedia% 2Fexternal% 2Fimages% 2Fmedia% 2F33 / REQUIRE_ORIGINAL / NONE / 257321333

Вызов getPath () в Uri возвращает следующее:

/ - 1/1 / content: // media / external / images / media / 33 / REQUIRE_ORIGINAL / NONE / 796304333

Я изо всех сил пытаюсь найти способоткрыть эти ресурсы во Флаттере.Как мне это сделать?

Я понимаю, что эти URL-адреса содержимого поставляются в комплекте с разрешениями, необходимыми для открытия / доступа к изображениям в Android.Я понимаю, что этот контекст не обязательно передается на Флаттер.Я также понимаю, что это две разные проблемы, но они связаны с загрузкой изображения во Flutter.

1 Ответ

0 голосов
/ 28 мая 2018

Как вы говорите, разрешения на ресурсы связаны с Намерением.Однако это должно быть прозрачно для вас, поскольку вы должны иметь возможность получить InputStream, используя (в MainActivity):

InputStream inputStream = getContentResolver().openInputStream(imageUri);

Поскольку разрешение действительно только в течение срока действия Intent, вам, вероятно, следует использовать этоInputStream для немедленного считывания файла, либо в память, либо во временный файл, принадлежащий вашему собственному приложению (в зависимости от размера фотографии).

После визуализации виджета вы можете запросить байтовый массив или имя файла черезMethodChannel, а во Flutter используйте конструкторы Image.memory или Image.file для создания виджета изображения.

Если используется метод временного файла, используйте getCacheDir() в Java для поиска папки кэша.Создайте свое собственное временное имя файла и скопируйте файл.На стороне флаттера используйте package:path_provider - getTemporaryDirectory(), чтобы найти тот же каталог.Просто передайте имя файла через MethodChannel.

...