Перейти к содержанию
Fire Monkey от А до Я
  • 0

Share картинок с targetAPI 24 и выше


sinuke

Вопрос

Всем привет

Как все знаете, с весны этого года Google требует для всех новых приложений поддержку новейших API (а осенью затребует и от уже опубликованных). В FMX-приложениях это делается изменением targetAPI в манифесте. Что я собственно и сделал. Но столкнулся с неприятной особенностью. А именно: невозможно отправить картинку с помощью ShareSheetAction. При попытке отправить вылетает вот такая ошибка:

photo_2018-07-14_11-09-44.thumb.jpg.c1805c4d502ba3f7fc8985dd16c85d60.jpg

 

В интернете наткнулся на статью (ссылка), в которой говорится, что начиная с API 24 механизм отправки картинок через Intent поменялся. Там же приводится решение того, как это сделать по новым требованиям. И конечно же это решение на Java, в Delphi решения данного вопроса нет. Решил попробовать реализовать, но столкнулся с непреодолимыми для себя проблемами....

Там получается три действия:

1) Создать и задеплоить файл res/xml/provider_paths.xml со следующим содержимым:

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

С этим проблем не возникло. Создал, задеплоил

2) Добавить в манифест провайдер:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    ...
    <application
        ...
        <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/provider_paths"/>
        </provider>
    </application>
</manifest>

Вот тут возникли проблемы. После добавления данных строк в манифест проект перестал деплоиться - ругается на недоступный символ "$"

1790639583_.thumb.PNG.053685008e1aae5e62323305f816277b.PNG

3) Поменять код получения Uri картинки...

Uri photoURI = Uri.fromFile(createImageFile());

...меняется на:

Uri photoURI = FileProvider.getUriForFile(MainActivity.this,
        BuildConfig.APPLICATION_ID + ".provider",
        createImageFile());

Однако, в FMX.MediaLibrary.Android.pas код для получения Uri выглядит следующим образом:

procedure TSharingManagerAndroid.AddImage(var AIntent: JIntent; const AImage: TBitmap);
var
  ImageFile: JFile;
  ImageUri: Jnet_Uri;
  ArrayList: JArrayList;
  OutputDir: JFile;
begin
  Assert(AIntent <> nil);
  Assert(AImage <> nil);

  OutputDir := TAndroidHelper.Context.getExternalCacheDir();
  ImageFile := TJFile.JavaClass.createTempFile(StringToJString('attachment'), StringToJString('.png'), OutputDir);
  ImageUri := TJnet_Uri.JavaClass.fromFile(ImageFile);
  AImage.SaveToFile(JStringToString(ImageFile.getAbsolutePath));

  if FDataType = TSharingDataType.Image then
    AIntent.putExtra(TJIntent.JavaClass.EXTRA_STREAM, TJParcelable.Wrap((ImageUri as ILocalObject).GetObjectID))
  else
  begin
    // If we use ACTION_SEND_MULTIPLE action of Intent, we should put image throught Parcelable Array List.
    // Because in this case other application read EXTRA_STREAM like a ArrayList<Uri>
    ArrayList := TJArrayList.Create;
    ArrayList.add(ImageUri);
    AIntent.putParcelableArrayListExtra(TJIntent.JavaClass.EXTRA_STREAM, ArrayList);
  end;
end;

И тут также возникает сложность для меня, т.к. я не представляю как можно получить ImageUri новым способом.

В общем, давайте разбираться, как можно решить данный вопрос...

Ссылка на комментарий

Рекомендуемые сообщения

  • 0
В 14.07.2018 в 17:01, sinuke сказал:

В общем, давайте разбираться, как можно решить данный вопрос...

Не знаю поможет ли это в решении конкретно данной проблемы, но вот на буржуйских просторах нашел общее решение

перевода программ, написанных в Delphi для Android с поддержкой API 26.

Который она "искаропки" не поддерживает. ?

Перевод дельфи приложений на API 26, часть первая

Перевод дельфи приложений на API 26, продолжение

Вроде во второй части есть что-то про  = Accessing “external” URIs =.

Сам еще не пробовал, пока только начал разбираться.

Изменено пользователем Александр Жевлаков
Дополнил сведениями о решении вопроса темы.
Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...