< H2> среда: < /strong> < /h2>
- delphi 12.2 (последний sp) < /li>
Приложение для Android и iOS < /li>
Аппаратный Pixel 7a (Android 15) /Xiaomi Redmi (Android 12 Sp1) < /li>
< /ul>
Проблема :
Проблема происходит только на устройстве Xiaomi (или, возможно, других брендов, которые я не тестировал). Он отлично работает на пикселе. Затем я делаю фотографии и сохраняю их вместе с загруженными данными. < /P>
Вот проблематичный код: < /p>Код: Выделить всё
procedure TPhotoForm.TakePicture(Sender: TObject); begin if TOSVersion.Check(11) then ActionTakePhotoFromCamera.Execute; end; Я использую тот же код из примера Embarcadero: https://docwiki.embarcadero.com/codeexamples/athens/en/fmx.photoeditordemo_sample Проблема возникает после вызова процедуры. Системная камера открывается, и я могу сфотографироваться. Однако, когда я выбираю картинку (чтобы запустить событие OnfinishAkingPicture), приложение вылетает. Там нет сообщения об ошибке - приложение просто перезагружается, как я запустил его снова. После нескольких попыток (3–4 попыток), или, если я перезагружаю приложение, процесс снятия фотографий работает нормально. Как только он работает, он будет продолжать работать - если я не перезагружен приложение. Удалите приложение < /li> Переустановите его < /li> Сделайте снимок при первом забеге. Сбой происходит каждый раз в этом сценарии. < / li> [b] исследования до сих пор: [/b] [b] Что работает [/b] Приложение образца от Embarcadero прекрасно работает на устройстве Xiaomi. Поняв это, я проверил несколько вещей: [b] Права доступа [/b] Сначала я подумал, что это была проблема с правами доступа или манифестом Android. Я обновил все, чтобы соответствовать демонстрационному проекту. Я также обнаружил, что вам на самом деле не нужны разрешения на камеру при использовании диалогового окна системной камеры. Интересно, но это не помогло - проблема все еще возникает. Затем я посмотрел глубже в код для taction.takephoto . Я отслеживал его до fmx.medialibrary.android . Есть два ключевых метода, которые я исследовал: < /p> TImageManagerAndroid.TakePhoto
- TImageManagerAndroid.TPhotoActivityResponseListener.onResponse
try
LConverted := JBitmapToBitmap(LNativeBitmap, LBitmap);
LNativeBitmap.recycle;
if LConverted then
begin
if Assigned(LParams.OnDidFinishTaking) then
begin
log.d('OnDidFinishTaking is Assigned');
LParams.OnDidFinishTaking(LBitmap)
end
else
begin
log.d('OnDidFinishTaking is not Assigned');
LRequestKind := response.getRequestKind;
if LRequestKind.equals(TJPhotoActivityRequestKind.JavaClass.PICK) then
TMessageManager.DefaultManager.SendMessage(Self, TMessageDidFinishTakingImageFromLibrary.Create(LBitmap))
else if LRequestKind.equals(TJPhotoActivityRequestKind.JavaClass.TAKE) then
TMessageManager.DefaultManager.SendMessage(Self, TMessageDidFinishTakingImageFromCamera.Create(LBitmap));
end;
end;
finally
LBitmap.Free;
end;
Подробнее здесь: https://stackoverflow.com/questions/793 ... android-12