Как все знаете, с весны этого года Google требует для всех новых приложений поддержку новейших API (а осенью затребует и от уже опубликованных). В FMX-приложениях это делается изменением targetAPI в манифесте. Что я собственно и сделал. Но столкнулся с неприятной особенностью. А именно: невозможно отправить картинку с помощью ShareSheetAction. При попытке отправить вылетает вот такая ошибка:
В интернете наткнулся на статью (ссылка), в которой говорится, что начиная с API 24 механизм отправки картинок через Intent поменялся. Там же приводится решение того, как это сделать по новым требованиям. И конечно же это решение на Java, в Delphi решения данного вопроса нет. Решил попробовать реализовать, но столкнулся с непреодолимыми для себя проблемами....
Там получается три действия:
1) Создать и задеплоить файл res/xml/provider_paths.xml со следующим содержимым:
Вот тут возникли проблемы. После добавления данных строк в манифест проект перестал деплоиться - ругается на недоступный символ "$"
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 новым способом.
В общем, давайте разбираться, как можно решить данный вопрос...
Вопрос
sinuke
Всем привет
Как все знаете, с весны этого года Google требует для всех новых приложений поддержку новейших API (а осенью затребует и от уже опубликованных). В FMX-приложениях это делается изменением targetAPI в манифесте. Что я собственно и сделал. Но столкнулся с неприятной особенностью. А именно: невозможно отправить картинку с помощью ShareSheetAction. При попытке отправить вылетает вот такая ошибка:
В интернете наткнулся на статью (ссылка), в которой говорится, что начиная с API 24 механизм отправки картинок через Intent поменялся. Там же приводится решение того, как это сделать по новым требованиям. И конечно же это решение на Java, в Delphi решения данного вопроса нет. Решил попробовать реализовать, но столкнулся с непреодолимыми для себя проблемами....
Там получается три действия:
1) Создать и задеплоить файл res/xml/provider_paths.xml со следующим содержимым:
С этим проблем не возникло. Создал, задеплоил
2) Добавить в манифест провайдер:
Вот тут возникли проблемы. После добавления данных строк в манифест проект перестал деплоиться - ругается на недоступный символ "$"
3) Поменять код получения Uri картинки...
...меняется на:
Однако, в FMX.MediaLibrary.Android.pas код для получения Uri выглядит следующим образом:
И тут также возникает сложность для меня, т.к. я не представляю как можно получить ImageUri новым способом.
В общем, давайте разбираться, как можно решить данный вопрос...
1 ответ на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.