В данной статье мы рассмотрим проблему, связанную с крашом приложения на устройствах Xiaomi при попытке использовать камеру в приложении, разработанном с использованием Delphi и FireMonkey. Мы обсудим возможные причины этой проблемы и предложим различные подходы к ее решению.
Описание проблемы
Когда вы используете TakePhotoAction из ActionList в своем приложении, оно переносится в фоновое состояние, и вперед выходит системная камера. Многие производители устройств используют этот момент для очистки памяти, что может привести к приостановке вашего приложения системой. После завершения съемки фотографии метод TPhotoActivityResponseListener.onResponse из FMX.MediaLibrary.Android вызывается, но оригинальный метод LParams.OnDidFinishTaking больше не назначен, так как приложение было приостановлено в процессе.
Порог для этого поведения зависит от настроек управления памятью производителя. По моим наблюдениям: - Устройства Samsung часто являются наиболее агрессивными, приостанавливая приложения, когда использование памяти превышает ~50МБ. - Другие производители могут начинать приостанавливать приложения при использовании памяти около ~100МБ. - Если настройки оптимизации памяти включены производителем, кажется, что ~500МБ является "твердым порогом", при котором ваше приложение приостанавливается почти всегда.
Решение
Для решения этой проблемы необходимо убедиться, что код, выполненный в событии OnTakePhotoFinish, обрабатывает только переданный в событие изображение и что все компоненты, участвующие в этом процессе, корректно доступны после перезапуска приложения. Если необходимо, сохраните текущее состояние приложения с помощью события SaveState. Это позволяет вам восстановить необходимую информацию о приложении и перейти к правильным точкам после перезапуска приложения. Подробнее о FireMonkey Save State можно прочитать в документации: FireMonkey Save State.
На первой форме, созданной после перезапуска приложения, следует подписаться на MessageManager в событии OnCreate. Вот пример кода:
type
TStartForm = class(TForm)
procedure FormDestroy(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private-Deklarationen }
procedure MessageHandlerTakePhoto(const Sender: TObject; const M: TMessage);
end;
procedure TStartForm.FormCreate(Sender: TObject);
begin
TMessageManager.DefaultManager.SubscribeToMessage(TMessageDidFinishTakingImageFromCamera, MessageHandlerTakePhoto);
end;
procedure TStartForm.FormDestroy(Sender: TObject);
begin
TMessageManager.DefaultManager.Unsubscribe(TMessageDidFinishTakingImageFromCamera, MessageHandlerTakePhoto);
end;
procedure TStartForm.MessageHandlerTakePhoto(const Sender: TObject; const M: TMessage);
begin
if M is TMessageDidFinishTakingImageFromCamera then
begin
if Assigned(TMessageDidFinishTakingImageFromCamera(M).Value) then
begin
// Do something with the TMessageDidFinishTakingImageFromCamera(M).Value (TBitmap)
end;
end;
end;
Альтернативное решение
Если вы хотите избежать приостановки приложения, можно использовать альтернативные методы для управления процессом съемки фотографий. Например, вы можете использовать библиотеку TDBXCamera или другие сторонние библиотеки, которые предоставляют более надежные методы для работы с камерой. Эти библиотеки могут быть настроены для более эффективного использования памяти и могут предотвратить приостановку приложения.
Пример использования библиотеки TDBXCamera:
uses
DBXCamera;
procedure TPhotoForm.TakePicture(Sender: TObject);
begin
if TOSVersion.Check(11) then
begin
DBXCamera.TakePhoto;
end;
end;
Заключение
Проблема с крашом приложения на устройствах Xiaomi при использовании камеры может быть связана с настройками управления памятью производителя. Для решения этой проблемы важно корректно обрабатывать состояние приложения после перезапуска и использовать надежные методы для работы с камерой. Следуя предложенным решениям, вы сможете улучшить стабильность и надежность вашего приложения на устройствах Xiaomi и других устройствах с аналогичными настройками управления памятью.
Контекст статьи — проблема краха приложения на устройствах Xiaomi при использовании камеры и предложения по её решению, включая управление состоянием приложения и использование альтернативных библиотек.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS