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

Andrey Efimov

Модераторы
  • Постов

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

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

    123

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

  1. Like
    Andrey Efimov получил реакцию от Aleksandr в Определение положение ползунка громкости   
    Где-то был материал...
    У меня в блоге есть вот такие статьи: 
    Как создавать обёртки для JAVA-кода Как подключить и использовать свой JAVA-класс Страничка с готовым кодом: JNI Code Snippet и ещё куча примеров использования Android API в самих статьях  
    Кстати, это не вы случаем задали вопрос "Здравствуйте. А есть ли возможность определить текущее положение ползунка громкости?" в блоге?
     
    Примерный код:
    uses   Androidapi.JNI.JavaTypes,   Androidapi.JNI.Media,   Androidapi.Helpers,   Androidapi.JNI.App,   Androidapi.JNIBridge; procedure TForm1.Button1Click(Sender: TObject); var   AudioObj: JObject;   Audio: JAudioManager;   CurrentVolume: Integer; begin   AudioObj = SharedActivity.getSystemService(TJActivity.JavaClass.AUDIO_SERVICE);   Audio := TJAudioManager.Wrap((AudioObj as ILocalObject).GetObjectID);   CurrentVolume = Audio.getStreamVolume(TJAudioManager.JavaClass.STREAM_MUSIC); end;
  2. Like
    Andrey Efimov получил реакцию от Hevard в Как узнать версию приложения под Android?   
    Например, вот так:
    {for Delphi XE6/XE7: Add to "uses" module "Androidapi.Helpers"} uses   Androidapi.JNI.JavaTypes, FMX.Helpers.Android,   Androidapi.JNI.GraphicsContentViewText; var   PackageManager: JPackageManager;   VersionPackage,PackageName: JString; begin   PackageManager := SharedActivity.getPackageManager;   PackageName := SharedActivityContext.getPackageName;       VersionPackage := PackageManager.getPackageInfo(PackageName, 0).versionName;   Label1.Text := JStringToString(VersionPackage); p.s. Для подобных вопросов, у меня в блоге есть страничка "JNI Code Snippet"
  3. Like
    Andrey Efimov отреагировална krapotkin в FDConnection   
    начнем с важных вещей:
    образно выражаясь, сначала вводят логин и пароль, а только потом нажимают кнопку, иначе в чем смысл логина вообще?
    у вас тут - сначала подключаемся, потом заполняем свойства. Кому они там нужны уже?
              FDConnection1.Connected := true;
              FDConnection1.Params.Pooled := false;
              FDConnection1.LoginPrompt := false;
              FDConnection1.Params.DriverID := 'MSAcc';....
    то же и с запросом. Сначала сделать запрос с пустым текстом, а текст запроса пообещать позже дослать?
              FDQuery1.Active := true;
              FDQuery1.SQL.Add('SELECT * FROM usersbase');
    логично, что сервер говорит SQL_NO_DATA. запроса-то нет.
    кроме того, если несколько раз нажать, то каждый раз к запросу будет добавляться строка SQL.Add(...)? зачем?
    параметры БД действительно нужно заполнять перед подключением, а вот тексты запросов, если они не меняются, достаточно один раз - в дизайн-тайме. и больше не трогать. Ну или хотя бы
              FDQuery1.SQL.Text := 'SELECT * FROM usersbase';
              FDQuery1.Active := true;
    Во всех этих ошибках нет никакой специфики FireDac. Для ADO все идентично прям на 102%
    еще по мелочам
    -ConnectionString это совсем не Database Name. Нужно читать доки. Примечание про ADO в силе. Там точно так же.
    -это конечно волшебное решение в процедуру подключения передавать параметром TLabel. Нафига ??
    -сама форма с компонентами доступа тоже не нужна. Нужен модуль данных.
    -ну и наименования форм конечно.
    Можно говорить о том, что проект исключительно мой и как хочу, так и делаю, тогда вопрос - а почему тогда он тут? И почему я должен пробираться сквозь мысли автора чтобы решить его проблему? 
    - последнее, ваш архив весит 30+ МБайт. Мой - 25 КБайт. Для чего мне все эти остальные файлы?
    CagortaModified.7z
  4. Like
    Andrey Efimov отреагировална krapotkin в FDConnection   
    форма нужна для отображения визуальных компонентов
    подключение и датасеты вообще ни разу не визуальные
    кроме того если датасеты еще можно положить на каждую форму/фрейм отдельно, то подключение лучше держать одно. Какой смысл для этого держать форму, там же нет взаимодействия с пользователем ??
    Не очень важное, но...
    Главной формой приложения становится первая созданная форма. А вот модуль данных можно создавать до форм. И подключение проводить тоже до. Если этого требует логика приложения.
     
  5. Like
    Andrey Efimov отреагировална gonzales в не могу скомпилить проект в delphi 11   
    Я разобрался, откуда вылезли эти грабли. У меня почему-то прописалось прямо в файле проекта (dproj файл), что Андроид64 использует SDK 25.2.5. После того, как я удалил эту привязку, все скомпилилось.
    А вообще 26 SDK у меня нормально существует)))

  6. Like
    Andrey Efimov отреагировална Roma77751 в не могу скомпилить проект в delphi 11   
    Собрал проект, все отлично! Вот подробное решение, если вдруг кто столкнулся с подобной проблемой!
    Проблема была в том что старая версия sdk прописалась в dproj. Решение очень простое, открываем dproj(можно простым блокнотом) находим строчку <Platform SDK Condition....> и удаляем ее. И будет счастье😃 Рекомендую прежде чем лезть туда, сделать резервную копию этого файла. Всем успехов!
     
    Спасибо gonzales и человеку с ником Hemul GM в телеге, что откликнулись  и приняли участие в небольшом, но продуктивном мозговом штурме👍🏻💪🏻
     
  7. Like
    Andrey Efimov отреагировална Tumaso в Как научиться верстать дизайн?   
    Рекомендую посмотреть курс по стилям FireMonkey на канале Ярослава Бровина:
    https://www.youtube.com/c/YaroslavBrovin
  8. Like
    Andrey Efimov отреагировална Slym в MSPOS - смарт-терминалы от компании Мультисофт   
    multisoft.zip
    Проект jar файла, aidl+ exceptioncallback
  9. Like
    Andrey Efimov отреагировална BenTen в MSPOS - смарт-терминалы от компании Мультисофт   
    Добрый день!
    Большое спасибо уважаемому Slym  за помощь и поддержку в разработке тестового проекта на Embarcadero Delphi для доступа к фискальному ядру смарт-терминала MSPOS.
    Выкладываю в открытый доступ этот проект. Пользуйтесь на здоровье.
    MSPOSFiscalCore_Delphi.7z
  10. Like
    Andrey Efimov получил реакцию от Ingalime в Android 11   
    В 8 сообщении этой темы (https://fire-monkey.ru/topic/6814-android-11/?do=findComment&comment=39589) есть ссылка на другую тему (в которой описано решение) https://fire-monkey.ru/topic/6801-android-10-api-уровня-29/?do=findComment&comment=39593
  11. Like
    Andrey Efimov получил реакцию от GASCHE в [Статья][Android] Автоматическая смена названия приложения в зависимости от языка системы   
    Ссылка: http://delphifmandroid.blogspot.ru/2016/04/blog-post.html
    Автор: Андрей Ефимов
    Описание: Автоматическая смена названия приложения в зависимости от языка системы
  12. Like
    Andrey Efimov отреагировална Slym в Линковка Kotlin (Котлин) библиотек в Delphi   
    Линковка Kotlin (Котлин) библиотек в Delphi, как делаю:
    Хедеры линкуемых библиотек обычно громадны описанием всех типов...
    Я обычно делаю свой jar на java в нем линкую зависимости и наружу для дельфи оставляю один объект с простыми функциями.
    Хедер дельфи получается компактным и понятным:
    package com.MyCompany.evotor; public interface J2DCallback { void Log(String str); String Trans(String str); String GetValue(String name); void SetValue(String name, String value); Activity GetActivity(); Context GetContext(); } public class FiscalCoreConnection { final private Global Instance; public FiscalCoreConnection(J2DCallback aj2d) throws NullPointerException { Instance = new Global(aj2d); } public String SendJSON(String JSON){ try{ return Instance.SendJson(JSON); } catch (Exception e) { return FiscalCoreException.MakeJson(e); } } } type J2DCallbackClass = interface(IJavaClass) ['{856654D5-7939-44DF-ACD5-E2EF8C6D3AA4}'] end; [JavaSignature('com/MyCompany/evotor/J2DCallback')] J2DCallbackIntf = interface(IJavaInstance) ['{025B14E9-C041-4105-9E85-83CC127CC340}'] procedure Log(str:JString); cdecl; function Trans(str:JString):JString; cdecl; function GetValue(name:JString):JString; cdecl; procedure SetValue(name:JString; value:JString); cdecl; function GetActivity():JActivity; cdecl; function GetContext():JContext; cdecl; end; TJ2DCallbackImp = class(TJavaGenericImport<J2DCallbackClass, J2DCallbackIntf>) end; [JavaSignature('com/MyCompany/evotor/FiscalCoreConnection')] JFiscalCoreConnection = interface(JObject) ['{5797747D-D61D-4EF6-94F7-5E8994545CC2}'] function SendJSON(JSON:JString):JString; cdecl; end; JFiscalCoreConnectionClass = interface(JObjectClass) ['{81782882-DFCF-4FA9-BD37-02CCCF2409EA}'] function init(j2d : J2DCallbackIntf) : JFiscalCoreConnection; cdecl; end; TJFiscalCoreConnection = class(TJavaGenericImport<JFiscalCoreConnectionClass, JFiscalCoreConnection>) end; TJ2DCallback = class(TJavaLocal, J2DCallbackIntf) public procedure Log(str:JString); cdecl; function Trans(str:JString):JString; cdecl; function GetValue(name:JString):JString; cdecl; procedure SetValue(name:JString; value:JString); cdecl; function GetActivity():JActivity; cdecl; function GetContext():JContext; cdecl; end; Все зависимости в build.gradle:
    dependencies { implementation 'com.github.evotor:integration-library:v0.4.50' implementation 'com.google.zxing:core:3.4.0' } В Дереве External Libraries забираем jarы зависимостей

    ПКМ Show in Explorer. Копируем в папку своего проекта и даем осознанное имя.
    Там же забираем kotlin-stdlib

    ПКМ Show in Explorer. Копируем в папку своего проекта и даем осознанное имя.
    Но в kotlin-stdlib.jar есть "лишний" файл kotlin-stdlib-1.5.10.jar\META-INF\versions\9\module-info.class
    Открываем архиватором и удаляем файл или всю папку versions

    Почти все готово... Но котлин еще и посыпан сахаром и не хочет Дельфей dexится, хочет -min-sdk-version=26
    Поможем Delphi:
    Ищем CodeGear.Common.Targets, у меня он в "C:\Program Files (x86)\Embarcadero\Studio\21.0\bin"\
    Ищем в нем --output, и перед ним вставим все про sdk. У меня получилось так:
        <DxCmd>PATH $(JDKPath)\bin;$(PATH); %26 set JAVA_HOME=$(JDKPath)%26 "$(JavaDxPath)" --dex --min-sdk-version=26 --output=</DxCmd>
    Далее цепляем все jar в проект

    Либа производителя, Либа своя обертка, и котлин
    Иии собираем!

    Если есть еще зависимости делаем аналогично:
    находим jar, выпиливаем META-INF\versions\9\module-info.class, линкуем в проект и собираем...
    Не все зависимости используются и нужны, поэтому добавляем поштучно до тех пор пока не заведется.
  13. Like
    Andrey Efimov отреагировална Евгений Корепов в Узнать размер видеопамяти   
    Разобрался с помощью коллег из https://t.me/fmx_flood, спасибо kami!
    Определение:
    nvmlDeviceGetHandleByPciBusId_v2 : function (const pciBusId : PAnsiChar; pHandle: p_nvmlDevice_t) : nvmlReturn_t; stdcall; Импорт:
    function ProcNV(var Fun: Pointer; const FunName: WideString) : boolean; begin Fun := nil; Fun := GetProcAddress(LibHandleNV, PWideChar(FunName)); Result := Assigned(Fun); end; ... ProcNV(@nvmlDeviceGetHandleByPciBusId_v2, 'nvmlDeviceGetHandleByPciBusId_v2'); Использование:
    В функцию GPUusageNVIDIA надо вместо GPU ID передавать PCI BUS ID.
    PCI BUS ID получаем так
    clStatus := clGetDeviceInfo(PlatformDevices[DevN], CL_DEVICE_PCI_BUS_ID_NV, SizeOf(AValueCardinal), @AValueCardinal, @Returned_Size); if (clStatus = CL_SUCCESS) and (Returned_Size = 4) then ADevicesOpenCL[NumDevicesOpenCL].DevicePCIBusID := AValueCardinal; Ну и получение GPU_Handle :
    var ABusIDText : String; ... ABusIDText := '00000000:' + PCIBusID.ToString.PadLeft(2, '0') + ':00.0'; AnvmlReturn := nvmlDeviceGetHandleByPciBusId_v2(PAnsiChar(AnsiString(ABusIDText)), @GPU_Handle); If AnvmlReturn <> 0 then raise EAbort.Create(''); В nvmlDeviceGetHandleByPciBusId_v2 передается pciBusId, параметр должен быть вида domain:bus:device.function, к примеру '00000000:08:00.0' 
  14. Like
    Andrey Efimov получил реакцию от Ingalime в [Статья][AdMob] Добавляем рекламный блок в приложение   
    Ну, про настройку, вывод и уплату налогов, полно статей в интернете. У меня была цель, описать интеграцию рекламы в приложение, а не общую инструкцию по использованию сайта AdMob.
     
    p.s. Про сервисы Firebase (Analytics, Cloud Messaging и т.д.), ещё не успел рассмотреть эту тему, но в планах есть.
  15. Like
    Andrey Efimov отреагировална gonzales в Delphi 11 - сборка приложения со сторонними библиотеками   
    Оставлю тут информацию, чтобы не потерялась.
    Суть проблемы в следующем, в проекте используются сторонние библиотеки, которые подключены в deployment. Прописаны пути для этих библиотек library\lib\arm64-v8a\. Все работает при отладке на телефоне в Release mode (Development). Для сборки пакета для Goolge Play переключаюсь в Release (Application Store) и создаю aab файл. Google его нормально принимает, приложение выкладывается, и тут возникает ошибка

    то есть программа не может найти библиотеку libavutil.so по адресу data/....
    Причем ошибку наблюдается на Андрод 9 и 10, а на Андроид 11 работает все штатно.
    Открываю aab файл как архив, 

    вот же они, все библиотеки на месте. Напоминаю, что apk файл отрабатывает на устройстве абсолютно нормально, но загрузить его в Google Play не получается, потому как в Development mode не подтягиваются сертификаты, необходимые для выкладки, а в Application Store mode не создается apk файл. 
    На данный момент нашел только одно решение проблемы, возможно кто-нибудь подскажет что-то более вменяемое
    1. Запускаем командную строку
    команда создания сета с apk
    java.exe -jar "C:\Program Files (x86)\Embarcadero\Studio\21.0\bin\Android\bundletool-all-0.13.3.jar" build-apks --mode=universal --bundle="путь до aab файла.aab" --output="путь куда развернуть apks файлы.apks" --ks="путь до keystore файла.keystore" --ks-pass=pass:пароль keystore --ks-key-alias=алиас приложения --key-pass=pass:пароль алиаса
    После непродолжительного ожидания в папке "путь куда развернуть apks файлы" создается apks файл
    2. Открываем получившийся apks файл как архив, вытаскиваем оттуда apk файл. У меня он называется universal.apk
    3. Уже этот apk файл выкладываем в Гугл.
    Метод конечно абсолютно костыльный, вообще непонятно сколько еще Гугл продолжит принимать apk вместо aab, надеюсь, что этот месседж кто-нибудь увидит и эту хрень пофиксят.
  16. Like
    Andrey Efimov получил реакцию от Ingalime в Получить imei на android >=10 версии   
    Restriction on non-resettable device identifiers
    В этом разделе: "Starting in Android 10, apps must have the READ_PRIVILEGED_PHONE_STATE privileged permission in order to access the device's non-resettable identifiers, which include both IMEI and serial number. Caution: Third-party apps installed from the Google Play Store cannot declare privileged permissions."
     
    Best practices for working with Android identifiers
  17. Thanks
    Andrey Efimov получил реакцию от Ingalime в [Androud] установка не из магазина   
    Установить то можно, но только если пользователь подготовлен к этому. Через спец. софт, можно скачать например с Google Play: App Bundle Install (вроде, не помню точно, как называется). На самом деле, подобного софта много.
    Т.к. установка aab не из маркета требует подготовки, то само собой лучше выкладывать на своём сайте сразу apk файлы.
  18. Like
    Andrey Efimov получил реакцию от Андрей Рулин в Запретить помещать приложение во всплывающем окне(Android)   
    Посмотрите эту страницу документации: Configuring your app for multi-window Mode
  19. Like
    Andrey Efimov получил реакцию от Ingalime в Запретить помещать приложение во всплывающем окне(Android)   
    Посмотрите эту страницу документации: Configuring your app for multi-window Mode
  20. Like
    Andrey Efimov отреагировална krapotkin в Почему я не могу изменить программно свойствоTransferType y IdFTP?   
    1. делаем в коде Ctrl+клик по TransferType попадаем в модуль IdFTP выясняем что тип TransferType : TIdFTPTransferType
    2. делаем Ctrl+ клик по TIdFTPTransferType и попадаем в модуль IdFTPCommon
    3. этот модуль вписываем в uses нашего откуда мы начали это увлекательное путешествие.
    4*. (опциональное) в современных версиях принято не просто указывать константу, а еще и тип, чтобы работало автодополнение
    тогда строка выглядит как
    ftpbot.TransferType := TIdFTPTransferType.ftBinary;

    ------------------------------------
    Но вообще это какбэ азы совсем.
  21. Thanks
    Andrey Efimov получил реакцию от Ingalime в Android 10 и муз.плеер   
    Оба apk файла собраны для 64-бит.
    Вам нужно собрать 32 битную версию:

    Честно говоря, я не знаю как вам ещё объяснить это... (раз проблемы возникают даже на таком этапе, то я обязан сообщить, что на форуме существует раздел: Ищу подрядчика)
    Перед тем как вы соберётесь выложить сюда собранный 32-битный apk, проверьте его, открыв например в винраре. Зайдите в папку "lib" и проверьте каждую папку. Выше я уже написал, что будет внутри каждой папки для 32-битного apk и для 64-битного apk (https://fire-monkey.ru/topic/7447-android-10-и-музплеер/?do=findComment&comment=43249). Т.о. в 32-битном apk должна получиться примерно такая структура (на примере Project1):
    armeabi - заглушка libProject1.so. armeabi-v7a - ваш проект libProject1.so, сервис, библиотека bass и т.д. mips - заглушка libProject1.so.  
    p.s. По поводу логов, то они сообщают о том, что не найдена библиотека PublicRadio (что собственно подтверждается и текстом ошибки и вскрытием apk файла, в нем библиотека есть только в папке для 64-бит, т.е. apk файл собран не для 32-бит).
     
  22. Like
    Andrey Efimov отреагировална PowerOwl в Android 10 и муз.плеер   
    Несколькими строчками выше этого пункта есть пункт, где в Remote Path указано library\lib\armeabi-v7a. Попробуйте вручную указать этот же путь.
  23. Like
    Andrey Efimov получил реакцию от PowerOwl в Android 10 и муз.плеер   
    Вот что сейчас я вижу на Delphi 10.4.2 для чистого проекта Project1 и сервиса:
    Релиз для 32 бит (Application store/Development):
    armeabi - заглушка libProject1.so. armeabi-v7a - проект libProject1.so, сервис и т.д. mips - заглушка libProject1.so. Релиз для 64 бит (Development, для Application store создаётся aab файл(который может включать в себя 32 битную версию))
    arm64-v8a - проект libProject1.so, сервис и т.д. Библиотеку bass я бы положил только в armeabi-v7a (для 32 бит) и arm64-v8a (для 64 бит).
    Эти галочки управляются из блока Project Manager, в зависимости от выбранной битности и конфигурации(Debug/Release и Application store/Development). Поэтому, если вы снимали их самостоятельно (через Deployment Manager), то рекомендую поставить их обратно, т.е. вернуть в дефолтное состояние.
    Повторюсь, сейчас нужно собрать 32 битную версию и выложить сюда для теста (возможно, PowerOwl или Олег смогут проверить).
     
     
    p.s. Вопрос, какую версию студии вы используете?
  24. Thanks
    Andrey Efimov получил реакцию от Ingalime в Android 10 и муз.плеер   
    но при этом подсовываете туда библиотеку bass...
    В этих папках (кроме arm64-v8a (для 64 бит) и armeabi-v7a (для 32 бит)) должны лежать заглушки, которые в случае несовместимости с девайсом буду выдавать сообщение типа такого "Application does not support this device".
    Собственно, PowerOwl, уже сделал предположение.
     
     
  25. Like
    Andrey Efimov получил реакцию от PowerOwl в Android 10 и муз.плеер   
    но при этом подсовываете туда библиотеку bass...
    В этих папках (кроме arm64-v8a (для 64 бит) и armeabi-v7a (для 32 бит)) должны лежать заглушки, которые в случае несовместимости с девайсом буду выдавать сообщение типа такого "Application does not support this device".
    Собственно, PowerOwl, уже сделал предположение.
     
     
×
×
  • Создать...