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

Yarpda

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

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

  • Посещение

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

    8

Активность репутации

  1. Sad
    Yarpda получил реакцию от Hevard в Книга. Обучение мобильной разработке не Delphi   
    Доброго дня.
    Недавно узнал, что вышла (еще не все главы, но все-же) бесплатная электронная книга на русском "Обучение мобильной разработке на Delphi", но никак не могу себя заставить скачать (нужно регистрироваться) и попробовать.
    Но может быть кто-то уже скачал и ознакомился. Хотел узнать как впечатления?
    Книга доступна по ссылке https://lp.embarcadero.com/DelphiBookInRussian?utm_source=Eloqua&utm_medium=email&utm_content=Learn-Delphi-eBook-200709
    P.S. Смотрю тут тем про эту книгу нет, хотя она судя по оглавлению довольно интересная должна быть, тем более на русском и бесплатно. Может быть о ней кто-то не знал.
  2. Sad
    Yarpda получил реакцию от Hevard в Книга. Обучение мобильной разработке не Delphi   
    Да. Спасибо. отправил в личку.
  3. Like
    Yarpda получил реакцию от krapotkin в [ANDROID] Смена USER-AGENT компонента Webbrowser   
    Публикую решение вопроса смены UserAgent под андроид (больше спасибо Ярославу!).
    Оказалось все до боли просто, но сам бы я до этого никогда не дошел...
    В общем. На форме лежит TWebBrowser с именем WB.
    1. Добавляем в Uses       Androidapi.Jni.Embarcadero, Androidapi.helpers;
    2. На кнопку вешаем:
     
    var NativeBrowser:JWebBrowser; begin if Supports(WB,JWebBrowser,NativeBrowser) then NativeBrowser.getSettings.setUserAgentString(stringToJString('MyUserAgent')); WebBrowser1.Navigate('https://www.whatsmyua.info'); // переходим на сайт, чтобы посмотреть что все получилось. end; И это все! Жесть. 3 дня на это убил. Может быть кому-то пригодится.
  4. Like
    Yarpda отреагировална OnePeople в Как добавить в приложение проверку наличия соединения с Интернетом?   
    ну да, это не мое решение так разделить, написал на скорую для Вас
    function checkNetwork: Boolean; var ConnectivityServiceNative: JObject; cm: JConnectivityManager; activeNetwork: JNetworkInfo; begin try // подключаемся к сервису (в данном случае соединений) ConnectivityServiceNative := TAndroidHelper.Context.getSystemService(TJContext.JavaClass.CONNECTIVITY_SERVICE); // если не подключились то выход c результататом функции FALSE if not Assigned(ConnectivityServiceNative) then exit(false); // получаем менеджер соединений cm := TJConnectivityManager.Wrap((ConnectivityServiceNative as ILocalObject).GetObjectID); // если не получили то выход c результататом функции FALSE if not Assigned(Result) then exit(false); // запрашиваем информацию о активном соединении activeNetwork := cm.getActiveNetworkInfo; // если есть информация и статус соединения подключено то результат функции TRUE Result := Assigned(ActiveNetwork) and ActiveNetwork.isConnected; except // при любой ошибке выход c результататом функции FALSE Exit(false); end; end;  
  5. Like
    Yarpda получил реакцию от fredhack в Проблемма с публикацией в Google Play   
    Обе версии и 32 и 64 бит должны быть в одном пакете apk или aab. Если версия делфи 10.4.2, то можно попробовать попробовать бангл создать, но сам я не проверял, работает ли он сейчас.  В версиях раньше, это работало плохо (версия 32 бит, все равно не запускалась на некоторых устройствах). Можно еще вручную добавить 32 битный so файл в 64 apk. Подробнее об этом написано здесь:
    И ниже пост, чуть попроще но суть та же самая.
     
  6. Like
    Yarpda отреагировална krapotkin в Как сделать управление в TWebBrowser под Win как на мобильных платформах   
    дык я ж с самого начала сказал про chromium? ))
  7. Like
    Yarpda отреагировална qz5 в Как сделать управление в TWebBrowser под Win как на мобильных платформах   
    Есть еще вариант использовать CEF4Delphi - https://github.com/salvadordf/CEF4Delphi
     
  8. Like
    Yarpda отреагировална krapotkin в Как сделать управление в TWebBrowser под Win как на мобильных платформах   
    хм. а ведь в каждом браузере есть встроенный режим "смартфон" в панели разработчика
  9. Like
    Yarpda получил реакцию от destroyer86 в А не сделать ли уроки по стилям FMX for free?   
    Заметил что ссылка на уроки по стилям FMX уже не доступна. Как я понял Ярослав не планирует больше продавать эти уроки, т.к. ушел в FGX Native, но по сути там довольно интересный материал (я их проходил в свое время и много раз использовал то, что узнал на них), и раз он уже не продается, может быть сделать доступ к этим урокам бесплатным? Я полагаю это могло бы популяризировать FMX. Там действительно без бутылки видео-уроков не разберешься
  10. Like
    Yarpda получил реакцию от Ingalime в А не сделать ли уроки по стилям FMX for free?   
    Заметил что ссылка на уроки по стилям FMX уже не доступна. Как я понял Ярослав не планирует больше продавать эти уроки, т.к. ушел в FGX Native, но по сути там довольно интересный материал (я их проходил в свое время и много раз использовал то, что узнал на них), и раз он уже не продается, может быть сделать доступ к этим урокам бесплатным? Я полагаю это могло бы популяризировать FMX. Там действительно без бутылки видео-уроков не разберешься
  11. Like
    Yarpda получил реакцию от Tumaso в А не сделать ли уроки по стилям FMX for free?   
    Заметил что ссылка на уроки по стилям FMX уже не доступна. Как я понял Ярослав не планирует больше продавать эти уроки, т.к. ушел в FGX Native, но по сути там довольно интересный материал (я их проходил в свое время и много раз использовал то, что узнал на них), и раз он уже не продается, может быть сделать доступ к этим урокам бесплатным? Я полагаю это могло бы популяризировать FMX. Там действительно без бутылки видео-уроков не разберешься
  12. Like
    Yarpda отреагировална OnePeople в Возможность реализации экспорта/импорта данных приложения в виде файлов   
    assets\internal - TPath.GetHomePath
    Именно так, только всё это делать вы должны из вашего приложения, так как только оно имеет доступ к этой папке!
  13. Like
    Yarpda отреагировална brunnengi в Android 10 (API уровня 29)   
    Здравствуйте.
    Некоторые пользователи Delphi 10.3 столкнулись с тем что даже при указании SDK 29 в манифесте проекта, при запуске скомпилированного приложения на платформе Android 10 происходило его падение.
    В августе 30 числа 2020 года было дано решение как пофиксить эту проблему.
    Переход на версию Delphi 10.4 не для всех является приемлемым решением, по разным причинам, к примеру у кого то платные компоненты и нет возможности обновиться до актуальных версий.
    Ниже представлен перевод статьи. В конце будет ссылка на оригинал.
    Приведенное здесь решение нацелено на обновление функции 'dlopen' в файле 'ICU.inc' (он включен в файл 'System.pas'). Вот шаги, необходимые для решения указанной проблемы:
    Откройте проводник и перейдите в папку по следующему пути: C:\Program Files (x86)\Embarcadero\Studio\20.0\source Скопируйте файлы из архива "missing_source_files.zip", который приложен в посту, в папку source из пункта "1" (комментарий от переводчика: в "missing_source_files.zip" лежит папка "rtl" в которой две папки - "posix", "sys". Лично я сделал сначала backup папки rtl из папки source, что и вам советую. Затем скопировал rtl папку из "missing_source_files.zip" и вставил в папку source) Переходим по пути: C:\Program Files (x86)\Embarcadero\Studio\20.0\source\rtl\sys Открываем файл "ICU.inc" в текстовом редакторе (пожалуйста, сделайте backup файла 'ICU.inc' для пущей безопасности). (комментарий от переводчика: орудовать в этой папке без прав админа не вариант. Поэтому я советую сначала скопировать файл "ICU.inc" куда нибудь в другое место, к примеру в папку Documents и там уже открыть его в том же Блокноте и сделав необходимые изменения сохранить файл и затем уже переместить его в C:\Program Files (x86)\Embarcadero\Studio\20.0\source\rtl\sys с заменой) В текстовом редакторе надо изменить функцию InitICU:
    Было вот так: А сделать надо что было вот так:
     


     
    Сохраняем сделанные изменения в файле "ICU.inc"
    Возвращаемся в проводник и переходим в папку %USERPROFILE%
    Скопируйте файл "build.bat" из архива "build_script.zip" , который приложен в этому посту в папку из пункта 7.
    Запустите от имени Администратора файл "build.bat". (Он создаст папку %USERPROFILE%\build в которой будет несколько папок с файлами. Из них нам нужны будут только System.o, но об этом ниже)
    Возвращаемся в проводник и переходим в папку C:\Program Files (x86)\Embarcadero\Studio\20.0\lib\android\debug
    Скопируйте файл "System.o" из папки %USERPROFILE%\build\android\debug в папку из шага 10 (не забывайте сделать backup всех файл что вы заменяете, на всякий случай).
    Теперь переходим в проводник в папку C:\Program Files (x86)\Embarcadero\Studio\20.0\lib\android\release
    Скопируйте файл "System.o" из папки %USERPROFILE%\build\android\release в папку из шага 12 (не забывайте сделать backup всех файл что вы заменяете, на всякий случай).
    Переходим в проводник в папку C:\Program Files (x86)\Embarcadero\Studio\20.0\lib\android64\debug
    Скопируйте файл "System.o" из папки %USERPROFILE%\build\android64\debug  в папку из шага 14 (не забывайте сделать backup всех файл что вы заменяете, на всякий случай).
    Переходим в проводник в папку C:\Program Files (x86)\Embarcadero\Studio\20.0\lib\android64\release
    Скопируйте файл "System.o" из папки %USERPROFILE%\build\android64\release в папку из шага 16 (не забывайте сделать backup всех файл что вы заменяете, на всякий случай).
     
    На этом всё. Автор данного перевода лично прошел по всем шагам и сделал всё как было сказано, а также протестил на приложении что уже было в PlayMarket'е но не запускалось под Android 10. Я его обновил и запустил как на Android ниже 10, так и на Android 10. 

    ЕСЛИ ВЫ НЕ ДОВЕРЯЕТЕ ПЕРЕВОДУ И/ИЛИ ВЫЛОЖЕННЫМ ФАЙЛАМ, ТО НИЖЕ ДАНА ССЫЛКА НА ОРИГИНАЛ СТАТЬИ
    // файлы выложенные здесь, взяты с форума где оригинал статьи.

    Ссылка на оригинал https://quality.embarcadero.com/browse/RSP-27218
    Если нет логина, то под споллером скрины экрана с форума ссылки выше:
     
     
    Отдельное спасибо пользователю Stanislau Ihnatovich за сообщение в Telegram о том что есть решение
     
    build_script.zipmissing_source_files.zip
     
  14. Like
    Yarpda отреагировална Олег Киреев в Книга. Обучение мобильной разработке не Delphi   
    Здравствуйте.
    У меня она есть. Файл формата pdf 31 мегабайт. Я дополнил его повставлял закладки по главам для быстрого поиска. У меня впечатления самые лучшие. СпасиБО Всеволоду Леонову. Могу прислать на вашу личную почту.
    С Уважением. Олег.
  15. Like
    Yarpda получил реакцию от Ingalime в TMediaPlayer & TMediaPlayerControl - отрисовка на кадре   
    Да, такая возможность в Аlcinoe точно есть. Вот пример, реализованный на этих компонентах.
  16. Like
    Yarpda отреагировална Slym в Чтение QR кода, нужен компонент или тулза   
    hints: TDictionary<TDecodeHintType, TObject>;   l: TList<TBarcodeFormat>; begin     if not Assigned(FScanManager) then     begin       hints := TDictionary<TDecodeHintType, TObject>.Create();       l:=TList<TBarcodeFormat>.Create;       l.Add(TBarcodeFormat.QR_CODE);       hints.Add(ZXing.DecodeHintType.POSSIBLE_FORMATS, l);       FScanManager := TScanManager.Create(TBarcodeFormat.QR_CODE, hints); не тестил
  17. Like
    Yarpda получил реакцию от Ingalime в Проблема с Android Service   
    Тоже заметил, что с aab есть проблемы. Иногда почему-то устанавливается 64 битная версия на 32 битный аппарат, соотвественно дальше сплеша на таких устройствах не идет. Если делать Apk с двумя версиями, то такой проблемы не наблюдается.
    Но вышеописанное можно сделать гораздо проще. Надо в деплое 64 битной версии добавить файл  so из 32 битной версии и помещаем его в папку library\lib\armeabi-v7a\ .
    Для создания APK из двух версии. сначала компилируем 32 битную версию, потом 64 битную, но в Apk 64 битной версии уже попадет и 32 битная. И заморачиваться с отдельным подписанием не надо будет. Все сделает среда.
  18. Like
    Yarpda отреагировална Dmitry Stolyarov в Получить фото из галереи через Intent   
    Рабочий код:
    procedure TForm1.HandleActivityMessage(const Sender: TObject; const M: TMessage); var RequestCode, ResultCode: Integer; Intent: JIntent; uri : Jnet_Uri; bitmap: JBitmap; surface: TBitmapSurface; begin if not(M is TMessageResultNotification) then exit; TMessageManager.DefaultManager.Unsubscribe(TMessageResultNotification, FMessageSubscriptionID); FMessageSubscriptionID := 0; RequestCode:=TMessageResultNotification(M).RequestCode; ResultCode:=TMessageResultNotification(M).ResultCode; Intent:=TMessageResultNotification(M).Value; if (ResultCode = TJActivity.JavaClass.RESULT_OK) and Assigned(Intent) then begin try uri:=Intent.getData; bitmap := TJImages_Media.JavaClass.getBitmap(SharedActivity.getContentResolver, uri); surface := TBitmapsurface.Create; JBitMapToSurface(bitmap,surface); Image1.Bitmap.Assign(surface); finally surface.Free; end; end;  
  19. Like
    Yarpda отреагировална OnePeople в не работает в Андроид TTabTransition.Slide   
    SetActiveTabWithTransitionAsync
  20. Like
    Yarpda отреагировална juppy в Компоненты для современного мобильного интерфейса   
    Есть такая библиотека
    https://github.com/amarildolacerda/KernowSoftwareFMX
    То, что на скриншотах - это компонент ksVirtualListView. 
    Его работа показана в примере https://github.com/amarildolacerda/KernowSoftwareFMX/tree/master/Samples/Action Buttons
    Но мне не понравилось как он работает.
    Там ЭкшнБаттоны не тянутся за свайпом, а сами появляются поняв, что свайп сделан.
    На IOS такое поведение не очень ожидаемо.
    Но в целом работает очень даже миленько.
     
  21. Thanks
    Yarpda получил реакцию от Сергей Сергеев в Проблема с Андроид 6   
    Я тоже долго мучился и не понимал почему некоторые жалуются на то, что приложение не запускается на некоторых устройствах. Вот методом проб и ошибок пришел к такому варианту. Пусть он и корявый, но рабочий! ))
  22. Like
    Yarpda получил реакцию от Сергей Сергеев в Проблема с Андроид 6   
    Попробуйте собрать APK из версий для 32 и 64 бит (нужно в деплое на 64 добавить so файл собранного ранее проекта на 32 бит в папку  library\lib\armeabi-v7a\ ). Тогда уже устройство локально будет решать какую версию приложения использовать. По крайней мере у меня так сработало.
  23. Like
    Yarpda отреагировална Andrey Efimov в Зарезервировать данные приложения на Google Drive   
    Есть ещё вот такие компоненты: CData Enterprise Connectors
  24. Like
    Yarpda отреагировална krapotkin в Свой APK updater. Использование Fileprovider   
    У меня в работе два приложения, и оба они не предназначены для Play market, так как имеют ограниченный круг использования, по сути, чисто внутрикорпоративные. Так что нежелательно и выкладывание их и на альтернативные магазины приложений. 
    Автоматически возникает вопрос обновления. Если в  первый раз мы можем установить приложение сами при помощи админов, то обновлять их не так просто. А контингент пользователей не справится с "скачайте APK по ссылке, найдите, куда его скачал браузер, и запустите вручную именно последний скачанный, а не какой попало"...
    Простейший способ - дать приложению скачать свежую копию с сайта и натравить на полученный файл системный инсталлер.
    Вот только свежие Andoird делать это напрямик запрещают. Нужен filepropvider. Целый день шуровал по мануалам и YT,
    Вот то что получилось  в результате.
    Если у вас 10.3.3 как у меня, уже можно не вносить <provider>...</provider> в манифест и свой файл file_paths.xml (или как вам его советуют назвать в интернетах) в деплой.
    Теперь все это делается хоть несколько странно и однобоко, но автоматически, путем установки галочки Secure File Sharing

    после этого в манифесте автоматически пропишется один из вариантов размещения файлов, которые вы можете найти в интернете. Используется алиас external-path
    файл, показанный на рисунке, создается автоматически самой делфи.

    теперь остается отгадать, какой путь реально подставится вместо "."
    Как показала практика, все пути выглядят не так, как кажется, если исходить из простого здравого смысла. Целый день использования GetHomeDir и других полезных методов TPath завел меня совсем в тупик.
    Оказалось все проще (?)
    st:TMemoryStream; OutputDir: JFile; ApkFile: JFile; ApkUri: Jnet_Uri; path, filename: string; ... OutputDir := TAndroidHelper.Context.getExternalCacheDir(); path := JStringToString(OutputDir.getAbsolutePath); filename := path+'/ASDroid2.apk'; ApkFile := TJfile.JavaClass.init( StringToJstring(filename)); FApkUri := TAndroidHelper.JFileToJURI(ApkFile); st.Position := 0; st.SaveToFile(filename); обратите внимание, в provider_paths мы задаем external-paths, а в коде ищем ExternalCacheDir.!!!  (For.Unbelievably.Creative.Knowers!)
    Потом все просто. FApkUri передаем в интент и запускаем 
    итоговый код примерно таков. (скачивание в потоке с использованием небольшого собственного API, но там ничего важного, можно не обращать внимания)
    procedure TasdSettingsFrame.bDownloadClick(Sender: TObject); begin {$IFDEF ANDROID} bDownload.Enabled := False; DownloadAndRun(); {$ENDIF} end; {$IFDEF ANDROID} procedure TasdSettingsFrame.DownloadAndRun(); begin ttask.Run(procedure var aapi:TasdAPI; st:TMemoryStream; OutputDir: JFile; ApkFile: JFile; ApkUri: Jnet_Uri; path, filename: string; begin st := TMemoryStream.Create; aapi := TasdAPI.Clone(_API); try aapi.OnReceiveData := OnReceiveData; aapi.getApk(st); if aapi.Err.Code=0 then begin OutputDir := TAndroidHelper.Context.getExternalCacheDir(); path := JStringToString(OutputDir.getAbsolutePath); filename := path+'/ASDroid2.apk'; ApkFile := TJfile.JavaClass.init( StringToJstring(filename)); FApkUri := TAndroidHelper.JFileToJURI(ApkFile); st.Position := 0; st.SaveToFile(filename); TThread.Synchronize(nil,procedure begin bDownload.Enabled := true; StartActivity(FApkUri); end); end; finally st.Free; aapi.Free; end; end); end; procedure StartActivity(ApkUri: Jnet_Uri); var Intent: JIntent; begin Intent := TJIntent.Create(); Intent.setAction(TJIntent.JavaClass.ACTION_VIEW); Intent.addFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK or TJIntent.JavaClass.FLAG_ACTIVITY_CLEAR_TOP or TJIntent.JavaClass.FLAG_GRANT_WRITE_URI_PERMISSION or TJIntent.JavaClass.FLAG_GRANT_READ_URI_PERMISSION); Intent.setDataAndType(apkuri, StringToJString('application/vnd.android.package-archive')); TAndroidHelper.Activity.startActivity(Intent); end; procedure TasdSettingsFrame.OnReceiveData(const Sender: TObject; AContentLength: Int64; AReadCount: Int64; var Abort: Boolean); begin tthread.Synchronize(nil, procedure begin pb1.Max := AContentLength; pb1.Value := AReadCount; end); end; {$ENDIF} Вопросы остались конечно, почему так странно с каталогами, но выяснять пока нет желания. Работает - не трожь.
    Всем удачи.
    UPD.
    Для того, чтобы системный инсталлер запускался, нужно не забыть отметить еще одну галочку

     
     
     
     
     
  25. Like
    Yarpda получил реакцию от Евгений Корепов в [DELPHI FMX Android] [6.0] Не удается загрузить SSL библиотеку   
    Спасибо! Действительно многое открылось. )) ThttpClient  заработал как и хотелось  и без танцев с бубном над библиотеками SSL.
×
×
  • Создать...