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

Pax Beach

Пользователи
  • Постов

    414
  • Зарегистрирован

  • Посещение

  • Победитель дней

    12

Весь контент Pax Beach

  1. Не удается пока переделать модуль для работы в среде {$IFDEF NEXTGEN}, да и крайне мало времени стало. Дело в том, что модуль отлично работает с восьмибитными символами, и тот же UTF8 в Windows варианте компиляции приводится к строке с восьмибитными символами. Пока я это не понял, пытался добиться одинаковой матрицы (изображения QR-code) на Windows и Android. Потом понял, что кодировать строки нужно по-разному, в первом случае обрабатывать 8 бит, во втором — 16, поэтому изображение для одной строки будет разное. ОК. Теперь строки я кодирую правильно, но при считывании кода, русские буквы все равно читаются неправильно. Может дело в кодировке, а может в кодировании служебной информации. Убил 3 дня на разбор чужого кода. Понял, что автор кода не довел работу и до середины — ошибки в коде, работа только под windows и OSX, реализована 3 метода кодирования QR из заявленных 10, а мне нужно найти документацию по форматам кодирования QR и написать заново модуль. В общем, пока откладываю работу над проектом до свободного времени.
  2. я неправильно сделал, что не добавил строчку: Canvas.Stroke.Kind := TBrushKind.Solid; рисовать квадратами, тоже хорошо получилось. Модуль в моей редакции (в архиве выше) под Windows хорошо с UTF8 работает, а вод под Android разбираюсь. Спасибо за указание на ошибку.
  3. Выше я привел в пример код, который так и делает, рисует большие квадратные точки (на моем HTC ONE 17 пикселей). Только почему-то на канве в андроиде они не выводятся. А в окнах работает пример хорошо.
  4. Посмотрел несколько раз, полезно. Но так и не пришел к решению, как проверять, включены ли у пользователя фиктивные координаты.
  5. Подскажите пожалуйста логику, как через сурфейс сделать. Я попробую ее реализовать.
  6. Ophion, удалось решить вопрос? Я уже все параметры перебрал у TImage, Bitmap, Canvas компонента TImage и Canvas битмапа, не выводится QR корректно на Android (изображение на холст либо не выводится, либо размазанное). Ключевыми методами, влияющими на работу в Android выявил следующие: Bitmap.SetSize (от размера зависит, будет ли исходный битмап размазанным), Canvas.DrawBitmap (последний параметр const HighSpeed: Boolean), WrapMode = Original, Stretch, Fit - в зависимости от размера конечного битмапа, DisableInterpolation — вообще ни как не влияет. Под Windows идеально работает в разных размерах конечного битмапа и параметров WrapMode. В итоге переписал код отрисовки TImage, поточечно вывожу на канву исходный битмап — Windows идеально, в Android — вообще на канву не рисует. Слезы текут на клавиатуру. Помогите пожалуйста победить канву и битмап в Android. Как правильно рисовать на канве в Android? public ImageQR: TImage; QRCodeBitmap: TBitmap; procedure TfmMainQRShare.ImageQRPaint(Sender: TObject; Canvas: TCanvas; const ARect: TRectF); var rSrc, rDest: TRectF; Row, Column: Integer; xPos, yPos, RectSize: Single; pixelColor: TAlphaColor; Img: TImage; begin Img := (Sender as TImage); if Assigned(QRCode) and (not QRCode.Data.IsEmpty) then begin Img.Bitmap.SetSize(Canvas.Width, Canvas.Height); RectSize := min(Img.Width, Img.Height) / QRCode.Columns; if RectSize > then if Canvas.BeginScene then try Img.Bitmap.Canvas.Clear(TAlphaColors.White); for Row := to QRCode.Rows - 1 do begin for Column := to QRCode.Columns - 1 do begin if (QRCode.IsBlack[Row, Column]) then pixelColor := TAlphaColors.Black else pixelColor := TAlphaColors.White; xPos := Column * RectSize + 0.5 * RectSize; yPos := Row * RectSize + 0.5 * RectSize; Canvas.StrokeThickness := RectSize + 1; Canvas.StrokeCap := TStrokeCap.Flat; Canvas.StrokeJoin := TStrokeJoin.Miter; Canvas.StrokeDash := TStrokeDash.Solid; Canvas.Stroke.Color := pixelColor; Canvas.DrawLine(TPointF.Create(xPos, yPos), TPointF.Create(xPos, yPos), 1); end; end; Canvas.EndScene; finally Canvas.EndScene; end; end; end; Пример моего проекта прилагаю. MakeQRCodes.zip
  7. var strImagem: TMemoryStream; B: TBitmap; begin //создаем битмап меньше исходного в 4 раза B := TBitmap.Create(rectSign.Width div 2, rectSign.Height div 2); B.Clear(TAlphaColorRec.White); //переносим исходное изображение в созданынй битмап if B.Canvas.BeginScene then try layoutPhoto.PaintTo(B.Canvas, TRectF.Create(, , B.Width, B.Height)); finally B.Canvas.EndScene; end; try //поток для изображения strImagem := TMemoryStream.Create; //загружаем в него битмап B.SaveToStream(strImagem); //возвращаем курсор потока в начало strImagem.Position := ; dm.qMDevice.SQL.Text := 'UPDATE Orders SET PHOTO = :PHOTO WHERE ROWID = :RowId'; dm.qMDevice.ParamByName('RowId').AsInteger := SourceROW; //загружаем в запрос изображение из потока dm.qMDevice.ParamByName('PHOTO').LoadFromStream(strImagem, ftBlob); dm.qMDevice.ExecSQL; dm.qMDevice.Close; except on e: Exception do Toast('Не удалось сохранить фото #7702:'#13#10 + e.Message); end; //освобождем ресурсы FreeAndNil(B); FreeAndNil(strImagem); end; Как-то так делаю я. Наверняка можно более изящно, с меньшим количеством кода. Подключитесь пожалуйста коллеги!
  8. Сделал пример в одном проекте включения/выключения Wi-Fi, переход к настройкам местоположения и опрос статуса датчика location. Качайте, кому нужно. TestWifi.zip
  9. Здравствуйте, коллеги! Я не хочу, чтобы в моем приложении пользователь мог подставлять фиктивные координаты своего местоположения, используя для этого функцию разработчика "mock location". Помогите пожалуйста правильным кодом или советом, как определять, включена ли данная функция на устройстве, чтобы соответственно ее обрабатывать?
  10. Ярослав, спасибо за статью, очень интересно! Коллеги, помогите пожалуйста примером, как правильно ловить и обрабатывать событие, когда пользователь устройства в стандартном будильнике «откладывает звонок будильника на попозже». Т.е. человек занят, и не готов, что сейчас будет выполняться некая процедура, и нажимает кнопку «отложить на 10 минут». Возможно ли такое событие ловить не только в Android, но и в iOS? Задайте пожалуйста наводящий вопрос, если я непонятно высказался.
  11. Большое спасибо. Это решает проблему включения/выключения Wi-Fi.
  12. Этот способ открывает форму настроек «Местоположение». Уже не плохо, спасибо! Но я искал, как перейти сразу в окно «Способ определения координат». Не уверен, правда, что это возможно.
  13. Коллеги, подскажите пожалуйста, как в Delphi из своего приложения перейти к настройкам устройства Android, в частности Wi-Fi и GPS? По нажатию кнопки пытаюсь выполнить такой код (нашел по теме на просторах), ничего не происходит ни в отладчике ни на экране. А, по идее, должна открыться Activity «Способ определения координат». var Intent: JIntent; WiFIServiceNative: JWifiManager; begin Intent := TJIntent.Create; Intent.setClassName(StringToJString('com.android.settings'), StringToJString('com.android.settings.widget.SettingsAppWidgetProvider')); Intent.addCategory(TJIntent.JavaClass.CATEGORY_ALTERNATIVE); Intent.setData(StrToJURI('3')); TAndroidHelper.Activity.sendBroadcast(Intent); ... Вот еще, здесь же пытаюсь программно выключить Wi-Fi — приложение вылетает с ошибкой «...class segmentation fault (11).», в отладчике методы Wi-Fi менеджера выполняются бесконечное количество раз, пока не вылетает указанная ошибка, т.е. нажатие F8 возвращает обратно на ту же строчку выполнения метода. WiFIServiceNative := JWifiManager(TAndroidHelper.Activity.getSystemService(TJContext.JavaClass.WIFI_SERVICE)); if Assigned(WiFIServiceNative) then begin memo1.Lines.Add('Has Wifi manager'); memo1.Lines.Add('Wifi state: ' + IntToStr(WiFIServiceNative.getWifiState)); memo1.Lines.Add('Try to Wi-Fi off:'); if WiFIServiceNative.setWifiEnabled(false) then memo1.Lines.Add(' - OK') else memo1.Lines.Add(' - FAIL'); Прошу вашей помощи — как правильно работать с настройками Android? Приложение пустое — кнопка и мемо. Permissions для проекта такие: <!-- This is the platform API where NativeActivity was introduced. --> <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="14" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CALL_PHONE" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.CHANGE_CONFIGURATION" /> <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.READ_CALENDAR" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.WRITE_CALENDAR" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" />
  14. Мне не помогло это. При деплое все равно в манифесте появляется строчка «android:debuggable="True"»
  15. Можно пожалуйста примеры?
  16. Согласен с вами со всеми. Инф. безопасность — наше все. Но есть своя специфика в задаче: нет Windows-машин рядом, в силу распределения полномочий разных служб компании нет доступного веб-сервера в сети, чтобы подвесить прослойку, есть MySQL сервер, который отдали для транзита данных и задача работать с ним напрямую. Поставленная задача решается, как я описал в топике. Сам бы я проектировал обмен по-другому, но проектирование опишем в другой ветке форума =)
  17. Столкнулся с проблемой взаимодействия своего приложения Android с сервером MySQL в локальной сети. Задача простая: скачать на планшет таблицу с данными с сервера MYSQL в локальной сети, выполнить на планшете действия с данными, выгрузить обратно на MySQL уже в другую таблицу результат действий. Начал разбираться, пересмотрел и перечитал множество примеров других разработчиков. Оказалось, что в RAD Studio 10 Seattle нет компонентов, способных заставить работать Android устройство напрямую с сервером MySQL. Конечно есть FireDAC, dbExpress. По факту, хоть разработчики dbExpress и заявляют, что компонент TSQLConnection работает с Android platform, но при попытке открыть соединение с MySQL сервером на Android устройстве сообщает об ошибке. На Windows компонент отрабатывает соединение нормально. Разработчики FireDAC честно заявили, что их соединение с MySQL на Android работать не будет. Какие есть выходы: 1. Создать DataSnap сервер, который будет установлен на сервере и взаимодействовать с Android клиентом и сервером MySQL. DataSnap будет являться прослойкой между Android и MySQL, через него можно осуществлять обмен данными, обернутыми в JSON. Для меня этот вариант не подходит, потому что по различным причинам устанавливать на сервер (или даже рабочую станцию) дополнительный сервер приложений не представляется возможным. 2. Использовать дополнительные компоненты, позволяющие работать с MySQL из-под Android и iOS. Поиск нужных компонентов для RAD Studio показал, что все они платные. И уж если бесплатных не найти, покупать нужно хороший продукт, которые поддерживает как минимум MySQL, SQLite, SQLServer. Не буду начинать холивар, скажу только, что для меня наиболее подходящим оказался компонент UniDAC от Харьковской компании Devart. Решающими факторами стали: удобнная политика лицензирования, приемлемая для задач цена, быстрая скорость ответа технической поддержки, конечно, поддержка всех распространенных серверов баз данных и нужных мне платформ, работа с большими объемами данных (более 100 тыс. записей), возможность 2 месяца тестировать компоненты, получить существенную скидку при покупке, рекомендации разработчиков с форума www.fire-monkey.ru . На сайте www.devart.com выбрал свою версию RAD Studio и скачал инсталяторы компонентов UniDAC и MyDAC. Установил и запустил RAD Studio. В главном меню RAD Studio появились соответствующие пункты меню, а в палитру компонентов добавились три закладки. Вы самостоятельно может скачать и попробовать компоненты можно по этой ссылке https://www.devart.com/unidac/ Реализация кода: Итак, я собрал тестовый стенд. На котором разместил 3 соединения, 3 набора данных, три кнопки для соединения и разъединения с сервером MySQL, и две метки, в которые при успешном соединении записываю случайную запись «Название компании» из таблицы «Покупатели», в одну Ansi формат, в другую UTF8. В качестве демонстрационной базы данных использую Northwind, поставляемую с RAD Studio. Как видно на рисунке, тестировалась работа компонентов dbExpress, MyDAC, UniDAC. Двойной щелчок на компоненте соединения, открываются свойства соединения, прописываем для компонентов необходимые параметры и запускаем. Я прилагаю пример приложения, который вы самостоятельно сможете запустить на своей RAD Studio. В результате, как и ожидалось, компоненты dbExpress не смогли соединиться с базой данных и вывалился с ошибкой “TDBXError: Unable to find procedure DBXLoader_GetDriver”. Которую было не просто отловить из-за отсутствия в компоненте обработчика Connection Timeout. Компоненты MyDAC и UniDAC мгновенно соединялись с MySQL и считывали записи. Моя задача решена, переписываю решение в рабочий проект. Надеюсь и вам будет полезен этот пример. MyDACvsDbExpressDemo.zip
  18. Коллега, а вот не понятно, как решился этот вопрос. Помогите пожалуйста и другим понять.
  19. Да, спасибо, получилось, как вы написали. В «FMX.Media.pas» для CameraComponent есть свойство FocusMode с такими вариантами значений. В приложении доработал пример работы TCameraComponent с возможностью фокусировки камеры. На моем HTC One фокусировка работает только в значении fmContinuousAutoFocus. procedure RegisterAliases; begin AddEnumElementAliases(TypeInfo(TDevicePosition), ['dpUnspecified', 'dpFront', 'dpBack']); AddEnumElementAliases(TypeInfo(TFlashMode), ['fmAutoFlash', 'fmFlashOff', 'fmFlashOn']); AddEnumElementAliases(TypeInfo(TFocusMode), ['fmAutoFocus', 'fmContinuousAutoFocus', 'fmLocked']); AddEnumElementAliases(TypeInfo(TTorchMode), ['tmModeOff', 'tmModeOn', 'tmModeAuto']); AddEnumElementAliases(TypeInfo(TVideoCaptureQuality), ['vcPhotoQuality', 'vcHighQuality', 'vcMediumQuality', 'vcLowQuality']); AddEnumElementAliases(TypeInfo(TCameraKind), ['ckDefault', 'ckFrontCamera', 'ckBackCamera']); end; Мое мнение, компонент TCameraComponent не пригоден пока для промышленной эксплуатации — очень тяжело работает, для примеров разве что. Решил в проекте использовать Standart Action — TTakePhotoFromCameraAction — стандартная камера устройства сама сделает качественное фото, остается только его обработать. CameraComponentWith.zip
  20. Здравствуйте! Не смог понять, как на лету настраивать четкость изображения с TCameraComponent. FPS — 2-3 кадра в секунду меня устраивает, но четкость камера сама не настраивает, как это делает нативная камера смартфона. В основном страдает задняя камера, фронтальная почему-то нормальную четкость держит. Может знаете, как регулировать четкость фотографии (свойство, метод)?
×
×
  • Создать...