< h2>Окружающая среда:
- Delphi 12.2 (последняя версия SP)
- APP для Android и iOS
- Аппаратное обеспечение Pixel 7a (Android 15) / Xiaomi Redmi (Android 12 SP1)
Проблема возникает только на устройствах Xiaomi (или, возможно, на устройствах других марок, которые я не тестировал). На Pixel он работает нормально.
В моем проекте я загружаю данные из конечной точки API в локальную базу данных SQLite. Затем я делаю фотографии и сохраняю их вместе с загруженными данными.
Вот проблемный код:
Код: Выделить всё
procedure TPhotoForm.TakePicture(Sender: TObject);
begin
if TOSVersion.Check(11) then
ActionTakePhotoFromCamera.Execute;
end;
https://docwiki.embarcadero.com/CodeExa ... emo_Sample
Проблема возникает после вызова процедуры. Системная камера открывается, и я могу сделать снимок. Однако когда я выбираю изображение (чтобы вызвать событие OnFinishTakingPicture), приложение вылетает. Сообщения об ошибках нет — приложение просто перезапускается, как будто я запустил его снова.
И вот в чем особенность: это происходит не каждый раз. После нескольких повторов (3–4 попытки) или перезапуска приложения процесс фотосъемки работает нормально. Как только все заработает, оно продолжит работать, пока я не перезапущу приложение.
Чтобы последовательно воспроизвести проблему:
- Удалите приложение.
- Установите его заново.
- Сделайте фотографию при первом запуске.
В этом сценарии сбой происходит каждый раз. - li>
Что работает
Пример приложения от Embarcadero отлично работает на устройстве Xiaomi. Осознав это, я проверил несколько вещей:
Права доступа
Сначала я подумал, что это проблема. с правами доступа или манифестом Android. Я обновил все, чтобы соответствовать демо-проекту. Я также обнаружил, что вам на самом деле не нужны разрешения камеры при использовании системного диалога камеры. Интересно, но это не помогло — проблема все еще возникает.
Ошибка в FMX.MediaLibrary.Android
Затем я более подробно изучил код TAction.TakePhoto. Я отследил его до FMX.MediaLibrary.Android. Я исследовал два ключевых метода:
Код: Выделить всё
TImageManagerAndroid.TakePhoto
Код: Выделить всё
TImageManagerAndroid.TPhotoActivityResponseListener.onResponse
Код: Выделить всё
TakePhoto
Метод onResponse вызывается каждый раз, когда диалоговое окно камеры закрывается, даже при сбое приложения. В случае сбоя приложения сначала запускается Application.Run, затем TPhotoActivityResponseListener.onResponse. Но когда приложение выходит из строя, LParams.OnDidFinishTaking недействителен, поскольку приложение перезапускается. Так что здесь все выглядит нормально — никаких очевидных проблем.
Управление энергопотреблением
Это похоже на какую-то проблему экономии заряда батареи. Возможно, Android пытается освободить ресурсы и закрывает мое приложение, пока камера открыта. Чтобы проверить это, я вручную установил APK и отключил всю оптимизацию батареи для своего приложения. Сбой все равно произошел.
Файлы журналов
Я также проверил журналы ADB. Каждый раз, когда происходит сбой, регистрируется определенное сообщение, но я не смог найти никакой информации об этом в Интернете и не знаю, является ли это проблемой или нет. Вот фрагмент логов:
Код: Выделить всё
2025.01.23 09:48:27.293 W 5929 System.err org.json.JSONException: No value for cannong
2025.01.23 09:48:27.298 W 5929 System.err at org.json.JSONObject.get(JSONObject.java:398)
2025.01.23 09:48:27.298 W 5929 System.err at org.json.JSONObject.getJSONObject(JSONObject.java:618)
2025.01.23 09:48:27.298 W 5929 System.err at android.util.MiuiMultiWindowUtils.initFreeFormResolutionArgsOfDevice(MiuiMultiWindowUtils.java:1436)
2025.01.23 09:48:27.298 W 5929 System.err at android.util.MiuiMultiWindowUtils.initFreeFormResolutionArgs(MiuiMultiWindowUtils.java:1430)
2025.01.23 09:48:27.298 W 5929 System.err at android.util.MiuiMultiWindowUtils.(MiuiMultiWindowUtils.java:212)
2025.01.23 09:48:27.298 W 5929 System.err at com.android.internal.policy.DecorViewMultiWinStubImpl.(DecorViewMultiWinStubImpl.java:19)
2025.01.23 09:48:27.298 W 5929 System.err at com.android.internal.policy.DecorViewMultiWinStubImpl$Provider.provideNewInstance(DecorViewMultiWinStubImpl$Provider.java:14)
2025.01.23 09:48:27.298 W 5929 System.err at com.android.internal.policy.DecorViewMultiWinStubImpl$Provider.provideNewInstance(DecorViewMultiWinStubImpl$Provider.java:8)
2025.01.23 09:48:27.298 W 5929 System.err at com.miui.base.MiuiStubRegistry.get(MiuiStubRegistry.java:129)
2025.01.23 09:48:27.298 W 5929 System.err at com.miui.base.MiuiStubUtil.newInstance(MiuiStubUtil.java:77)
2025.01.23 09:48:27.298 W 5929 System.err at com.android.internal.policy.DecorViewMultiWinStub.newInstance(DecorViewMultiWinStub.java:11)
2025.01.23 09:48:27.298 W 5929 System.err at com.android.internal.policy.DecorView.(DecorView.java:335)
2025.01.23 09:48:27.298 W 5929 System.err at com.android.internal.policy.PhoneWindow.generateDecor(PhoneWindow.java:2380)
2025.01.23 09:48:27.298 W 5929 System.err at com.android.internal.policy.PhoneWindow.installDecor(PhoneWindow.java:2760)
2025.01.23 09:48:27.299 W 5929 System.err at com.android.internal.policy.PhoneWindow.getDecorView(PhoneWindow.java:2140)
2025.01.23 09:48:27.299 W 5929 System.err at android.view.Window.findViewById(Window.java:1516)
2025.01.23 09:48:27.299 W 5929 System.err at android.app.Activity.findViewById(Activity.java:3492)
2025.01.23 09:48:27.299 W 5929 System.err at com.embarcadero.firemonkey.keyboard.VirtualKeyboardFrameObserver.(VirtualKeyboardFrameObserver.java:56)
2025.01.23 09:48:27.299 W 5929 System.err at com.embarcadero.firemonkey.keyboard.VirtualKeyboard.(VirtualKeyboard.java:41)
2025.01.23 09:48:27.299 W 5929 System.err at com.embarcadero.firemonkey.FMXNativeActivity.onCreate(FMXNativeActivity.java:125)
2025.01.23 09:48:27.299 W 5929 System.err at android.app.Activity.performCreate(Activity.java:8176)
2025.01.23 09:48:27.299 W 5929 System.err at android.app.Activity.performCreate(Activity.java:8143)
2025.01.23 09:48:27.299 W 5929 System.err at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1329)
2025.01.23 09:48:27.299 W 5929 System.err at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3752)
2025.01.23 09:48:27.299 W 5929 System.err at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3946)
2025.01.23 09:48:27.299 W 5929 System.err at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:106)
2025.01.23 09:48:27.299 W 5929 System.err at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
2025.01.23 09:48:27.299 W 5929 System.err at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
2025.01.23 09:48:27.299 W 5929 System.err at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2324)
2025.01.23 09:48:27.299 W 5929 System.err at android.os.Handler.dispatchMessage(Handler.java:106)
2025.01.23 09:48:27.300 W 5929 System.err at android.os.Looper.loopOnce(Looper.java:210)
2025.01.23 09:48:27.300 W 5929 System.err at android.os.Looper.loop(Looper.java:299)
2025.01.23 09:48:27.300 W 5929 System.err at android.app.ActivityThread.main(ActivityThread.java:8273)
2025.01.23 09:48:27.300 W 5929 System.err at java.lang.reflect.Method.invoke(Native Method)
2025.01.23 09:48:27.300 W 5929 System.err at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:576)
2025.01.23 09:48:27.300 W 5929 System.err at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1073)
Подробнее здесь: https://stackoverflow.com/questions/793 ... android-12