Перейти к содержанию
Fire Monkey от А до Я
  • 0

[iOS] [iOS10] Приложение падает при использовании камеры в iOS 10 64 bit


Kitty

Вопрос

Пустое приложение. Код из документации. Попытка получить фото с камеры:

void __fastcall TForm1::TakePhotoFromCameraAction1DidFinishTaking(TBitmap *Image)
{
 Image1->Bitmap->Assign(Image);
}

При нажатии на кнопку приложение вылетает. Кому нибудь удавалось получить фото в С++ Builder Берлин в iOS? Спасибо.

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Есть тестовый Project1. iOs у меня 2й день в руках. Согласно https://support.apple.com/ru-ru/HT203033 приложение должно запросить само доступ к камере.

Цитата

Программа не появится в списке, пока она не запросит разрешение на использование ваших данных. Вы можете добавить или удалить разрешение для любой программы, которая запрашивала доступ к данным. Программа может использовать ваши данные, только если вы ей это разрешили.

На девайсе я нашла 2 места где оно может быть. Прилагаю скриншоты.  Я не знаю что сделать... Приложение падает.

IMG_1529.jpg

IMG_1530.jpg

Ссылка на комментарий
  • 0

Чисто предположение: может быть нужно инициализировать камеру, что-то вроде

TPlatformServices.Current.SupportsPlatformService(IFMXCameraService, FCameraService);

Или использовать метод RegisterMediaLibraryServices из FMX.MediaLibrary.iOS.pas

 

Ссылка на комментарий
  • 0

Подскажите, пожалуйста,  для открытия галереи c фотографиями надо также сделать доп. шаги не описанные в документации? Например код ниже также приводит к краху приложения iOS. :(

void __fastcall TFormCamera::TakePhotoFromLibraryAction1DidFinishTaking(TBitmap *Image)

{
 Image1->Bitmap->Assign(Image);
}

 

Ссылка на комментарий
  • 0
19 минут назад, Kitty сказал:

Подскажите, пожалуйста,  для открытия галереи c фотографиями надо также сделать доп. шаги не описанные в документации? Например код ниже также приводит к краху приложения iOS. :(


void __fastcall TFormCamera::TakePhotoFromLibraryAction1DidFinishTaking(TBitmap *Image)

{
 Image1->Bitmap->Assign(Image);
}

 

Это не из-за платформы. Обсуждали на форуме несколько раз уже эту проблему — проблема в том, что работа с UI и Action идет в разных потоках.

Получение снимка через Action Menu я делаю так

procedure TfmPhotos.TakePhotoFromCameraActionDidFinishTaking(Image: TBitmap);
var
  ScaleFactor: Single;
begin
  if System.Math.Max(Image.Width, Image.Height) > 1024 then begin
    ScaleFactor := System.Math.Max(Image.Width, Image.Height) / 1024;
    Image.Resize(Round(Image.Width / ScaleFactor), Round(Image.Height / ScaleFactor));
  end;
  Image1.Bitmap.Assign(Image);
end;

Ну, т.е. так же, как и у тебя.

А... забыл сказать, что нужно вешать Action не на TSpeedButton, а на TButton. выглядят так же, только приложение не падает.

 

Изменено пользователем Pax Beach
Ссылка на комментарий
  • 0

Pax Beach, почему такой код? Чтобы сберечь память?

4 минуты назад, Pax Beach сказал:

Это не из-за платформы. Обсуждали на форуме несколько раз уже эту проблему — проблема в том, что работа с UI и Action идет в разных потоках.

Надо синхронизировать?

Ссылка на комментарий
  • 0
Только что, Rusland сказал:

Pax Beach, почему такой код? Чтобы сберечь память?

Надо синхронизировать?

Да. Но я не стал заморачиваться, просто сменил SpeedButton на Button )

Ссылка на комментарий
  • 0
25 минут назад, Pax Beach сказал:

Да. Но я не стал заморачиваться, просто сменил SpeedButton на Button )

Странно. Я использую обычный Button, но иногда приложение падает на процедуре TakePhotoFromCameraActionDidFinishTaking

Ссылка на комментарий
  • 0
  • Модераторы
10 минут назад, Rusland сказал:

Странно. Я использую обычный Button, но иногда приложение падает на процедуре TakePhotoFromCameraActionDidFinishTaking

оборачиваешь в синхронизацию?

Ссылка на комментарий
  • 0
  • Модераторы
Только что, Rusland сказал:

нет... в примерах же Embarcadero не оборачивает

ну желательно обернуть, т.к. это нативная штука. что там творится в недрах не видно. хуже не будет, но и не факт что поможет.

Ссылка на комментарий
  • 0
6 минут назад, Kitty сказал:

У меня везде только TButton... :(

А так получится?

  FThread := TThread.CreateAnonymousThread(
    procedure
    begin
      TThread.Synchronize(TThread.CurrentThread,
        procedure
        begin
          try
            Image1.Bitmap.Assign(Image);
          except
          end;
        end);
    end);

  FThread.FreeOnTerminate := true;
  FThread.Start;

 

Ссылка на комментарий
  • 0
  • Модераторы
Только что, Pax Beach сказал:

А так получится?


  FThread := TThread.CreateAnonymousThread(
    procedure
    begin
      TThread.Synchronize(TThread.CurrentThread,
        procedure
        begin
          try
            Image1.Bitmap.Assign(Image);
          except
          end;
        end);
    end);

  FThread.FreeOnTerminate := true;
  FThread.Start;

 

эм, зачем такая конструкция? какой смысл?

Ссылка на комментарий
  • 0
  • Модераторы
14 минут назад, Pax Beach сказал:

Размышления на тему синхронизации. А как лучше?

этого достаточно

 TThread.Synchronize(TThread.CurrentThread,
        procedure
        begin
          try
            Image1.Bitmap.Assign(Image);
          except
          end;
        end);
Ссылка на комментарий
  • 0
8 минут назад, ZuBy сказал:

 


 TThread.Synchronize(TThread.CurrentThread,
        procedure
        begin
          try
            Image1.Bitmap.Assign(Image);
          except
          end;
        end);

Раз пошла такая пьянка, то есть ли разница TThread.CurrentThread или nil?:

 TThread.Synchronize(nil,
        procedure
        begin
          try
            Image1.Bitmap.Assign(Image);
          except
          end;
        end);

 

Ссылка на комментарий
  • 0
  • Модераторы

как я думаю TThread.CurrentThread используется в TThread.Queue (), в обычном TThread.Synchronize() разницы никакой

Изменено пользователем ZuBy
Ссылка на комментарий
  • 0
  • Модераторы
2 минуты назад, Rusland сказал:

Может как-то так?


TThread::Synchronize(TThread::CurrentThread, Update);

void __fastcall Update(void)
{  
  Image1->Bitmap->Assign(Image);
}

 

а где ты возьмешь Image?

Ссылка на комментарий
  • 0
  • Модераторы

проблема как раз в том что Bitmap непотокозащищенный, все операции с Bitmap нужно в основном потоке делать

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...