TakePhotoAction сбои приложение Android и снова начинается с Xiaomi Android 12Android

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 TakePhotoAction сбои приложение Android и снова начинается с Xiaomi Android 12

Сообщение Anonymous »

CrossPost: https://en.delphipraxis.net/topic/12872 ... ndroid-12/
< 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
TakePhoto передает требуемые данные факту client.takephoto (lrequestparams); , который реализован в файле JAR. Это всегда работает, как и ожидалось - он запускает диалог системной камеры. Если приложение снимается, сначала, Application.run запускается, то TphotoActivityResponselistener.onresponse . Но когда приложение вылетает, lparams.ondidfinishaking недействительны, потому что приложение перезагружается. Так что здесь все выглядит нормально-нет очевидных проблем. Возможно, Android пытается освободить ресурсы и закрывает мое приложение, пока камера открыта. Чтобы проверить это, я вручную установил APK и отключил все оптимизации батареи для моего приложения. Сбой по -прежнему произошел. Каждый раз, когда использование оперативной памяти приложения составляет около 150 - 450 мб, система иногда приостанавливает приложение при открытии системной камеры (потому что мое приложение идет на фоновой речь). Если ОЗУ превышает 500 МБ, она снимается каждый раз. Я проверил это даже с помощью демонстрационного приложения Embarcadero и смог воспроизвести неудачу. Приложение может регенерировать даже при перезапуске, чтобы получить звонок со событием от Onfinishevent. Есть идеи о том, как получить растровый карту, если форма начала не то же самое, что изначально назвала фото -действие? Вот код от fmx.medialibrary.android. Интересная часть - та, которую я использую tmessagemanager. < /p>
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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»