Вопрос, поднятый пользователем iken, связан с использованием интентов в компоненте TForm1 для запуска внешнего приложения, в данном случае галереи изображений, и последующим получением результата выбора. Однако, по его словам, метод onActivityResult не вызывается после выбора изображения.
Контекст
Пользователь iken уже привел пример кода, который позволяет открыть галерею и выбрать изображение. Однако, для обработки результата выбора используется нестандартный подход с использованием TMessageManager. Dave Nottage предложил альтернативный способ обработки результата, демонстрируя использование TMessageResultNotification и MessageResultNotificationMessageHandler для получения данных о результате выбора.
Разбор проблемы
Проблема заключается в том, что стандартный механизм обработки результатов startActivityForResult не используется, и, возможно, это вызывает проблемы в процессе взаимодействия с Android-компонентами.
Предложенное решение
Dave Nottage предложил использовать TMessageResultNotification для получения результата работы интента. Этот подход требует дополнительной настройки и может быть менее интуитивно понятным для разработчиков, не знакомых с этим механизмом.
Альтернативное решение
Для корректной работы с интентами следует использовать стандартный механизм обработки onActivityResult. Ниже представлен пример кода, который демонстрирует правильное использование startActivityForResult и onActivityResult для работы с галереей изображений:
unit Unit1;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, System.Messaging,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Controls.Presentation, FMX.StdCtrls,
Androidapi.Helpers, Androidapi.JNIBridge, Androidapi.JNI.Os, Androidapi.JNI.JavaTypes;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
FRequestCode: Integer;
procedure OnActivityResult(ACmd: Integer; ARequestCode: Integer; AResultCode: Integer; const AData: TObject);
public
constructor Create(AOwner: TComponent); override;
end;
var
Form1: TForm1;
implementation
{$R *.fmx}
const
cRequestCode = 1234; // Код запроса для идентификации результата
constructor TForm1.Create(AOwner: TComponent);
begin
inherited;
FRequestCode := cRequestCode;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
LIntent: JIntent;
begin
LIntent := TJIntent.Create;
LIntent.setAction(TJIntent.JavaClass.ACTION_PICK);
LIntent.setType(StringToJString('image/*'));
TAndroidHelper.Activity.startActivityForResult(LIntent, FRequestCode);
end;
procedure TForm1.OnActivityResult(ACmd: Integer; ARequestCode: Integer; AResultCode: Integer; const AData: TObject);
begin
if ARequestCode = FRequestCode then
begin
if AResultCode = TJActivity.JavaClass.RESULT_OK then
begin
// AData содержит данные о выбранном изображении
// Обработка данных
end;
end;
end;
end.
Заключение
Использование onActivityResult является стандартным и предпочтительным способом обработки результатов интентов в Delphi для Android-разработки. Следует обратить внимание на корректное использование startActivityForResult и onActivityResult, а также правильно определенный FRequestCode для идентификации запроса. Это позволит избежать ошибок, связанных с невызовом обработчика результатов, и обеспечит корректную работу приложения.
Пользователь столкнулся с проблемой, связанной с невызовом метода `onActivityResult` после выбора изображения в галерее при использовании компонента `TForm1` в Delphi для Android-разработки, и рассматривает альтернативные способы обработки результатов ра
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.