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

Andrey Efimov

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

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

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

    123

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

  1. Like
    Andrey Efimov получил реакцию от Евгений Корепов в Работа с android.hardware.usb.UsbManager   
    Попробуйте так:
    var Device: JUsbDeviceConnection; ... Device := FUsbManager.JavaClass.openDevice();  
    p.s. Учитывайте тот факт, что обёртка могла сгенериться неправильно. Java2Op не всегда отрабатывает как надо, поэтому появляется необходимость проверки и правки результата.
    p.s.2. И вроде как у вас как раз такой случай... Попробуйте вот эту:
    JUsbManagerClass = interface(JObjectClass) ['{1048A6E9-E1B5-4DA5-A168-ED91E8DE5284}'] {class} function _GetACTION_USB_ACCESSORY_ATTACHED: JString; cdecl; {class} function _GetACTION_USB_ACCESSORY_DETACHED: JString; cdecl; {class} function _GetACTION_USB_DEVICE_ATTACHED: JString; cdecl; {class} function _GetACTION_USB_DEVICE_DETACHED: JString; cdecl; {class} function _GetEXTRA_ACCESSORY: JString; cdecl; {class} function _GetEXTRA_DEVICE: JString; cdecl; {class} function _GetEXTRA_PERMISSION_GRANTED: JString; cdecl; {class} property ACTION_USB_ACCESSORY_ATTACHED: JString read _GetACTION_USB_ACCESSORY_ATTACHED; {class} property ACTION_USB_ACCESSORY_DETACHED: JString read _GetACTION_USB_ACCESSORY_DETACHED; {class} property ACTION_USB_DEVICE_ATTACHED: JString read _GetACTION_USB_DEVICE_ATTACHED; {class} property ACTION_USB_DEVICE_DETACHED: JString read _GetACTION_USB_DEVICE_DETACHED; {class} property EXTRA_ACCESSORY: JString read _GetEXTRA_ACCESSORY; {class} property EXTRA_DEVICE: JString read _GetEXTRA_DEVICE; {class} property EXTRA_PERMISSION_GRANTED: JString read _GetEXTRA_PERMISSION_GRANTED; end; [JavaSignature('android/hardware/usb/UsbManager')] JUsbManager = interface(JObject) ['{6F603A25-E816-4012-9B23-054B428A4A75}'] function getAccessoryList: TJavaObjectArray<JUsbAccessory>; cdecl;//Deprecated function getDeviceList: JHashMap; cdecl;//Deprecated function hasPermission(device: JUsbDevice): Boolean; cdecl; overload;//Deprecated function hasPermission(accessory: JUsbAccessory): Boolean; cdecl; overload;//Deprecated function openAccessory(accessory: JUsbAccessory): JParcelFileDescriptor; cdecl;//Deprecated function openDevice(device: JUsbDevice): JUsbDeviceConnection; cdecl;//Deprecated procedure requestPermission(device: JUsbDevice; pi: JPendingIntent); cdecl; overload;//Deprecated procedure requestPermission(accessory: JUsbAccessory; pi: JPendingIntent); cdecl; overload;//Deprecated end; TJUsbManager = class(TJavaGenericImport<JUsbManagerClass, JUsbManager>) end;  
    p.s.3. С правилами создания обёртки можно ознакомиться тут https://delphifmandroid.blogspot.com/2014/07/java.html
    Статья старая, но правила связанные с полями/константами и методами действительны по сей день.
  2. Like
    Andrey Efimov получил реакцию от Ingalime в Ошибка java.lang.IllegalArgumentException: Unable to load native library... libProject1.so   
    Обратите внимание на конечные пути (Remote Path). Цитата, которую вы привели, как раз говорит вам "they should be alongside the libPublicRadio.so files under the lib folder.", т.е. для файлов библиотеки должны быть указаны те же пути, что и для libPublicRadio.so.
  3. Like
    Andrey Efimov получил реакцию от Алиса Романец в Как получить объект стиля?   
    Вроде как можно искать объект стиля, например иконку в ListBoxItem:
    var   StyleObject: TFmxObject;   StyleIcon: TControl; begin   // Ищем объект стиля - картинка. Лучше закешировать один раз, избежав постоянный поиск картинки    StyleObject := Item.FindStyleResource('icon');   if (StyleObject <> nil) and (StyleObject is TControl) then   begin     StyleIcon := TControl(StyleObject);     // и дальше работаем как с обычным контролом   end; end; попробуйте, может поможет.
  4. Like
    Andrey Efimov получил реакцию от Alexander Samosyuk в Покупки из приложения   
    Вы пробовали пользоваться поиском на форуме? (Думаю нет...) Работа с TInAppPurchase
     
    p.s. Тему перенёс в соответствующий раздел "TInAppPurchase"
  5. Like
    Andrey Efimov получил реакцию от Yarpda в Зарезервировать данные приложения на Google Drive   
    Есть ещё вот такие компоненты: CData Enterprise Connectors
  6. Like
    Andrey Efimov получил реакцию от Ingalime в Зарезервировать данные приложения на Google Drive   
    Есть ещё вот такие компоненты: CData Enterprise Connectors
  7. Like
    Andrey Efimov отреагировална krapotkin в Ошибка java.lang.IllegalArgumentException: Unable to load native library... libProject1.so   
    В процессе разработки столкнулся с очень странной ситуацией, корни которой до сих пор неясны, но решение нашлось.
    Итак. Делфи 10.3.3. Чистое приложение - пустая форма и кнопка. Отлично работает на разных устройствах кроме Samsung Galaxy Tab A (2016). Android 5.1.1
    Программа падает, не успев даже загрузиться. Любая. При этом она же, скомпилированная на другом компе, запускается нормально. И даже после изменения SDK/NDK на нем, ничего не падает.
    LogCat дает крайне странную картину
    java.lang.IllegalArgumentException: Unable to load native library: /data/app-lib/com.embarcadero.Project1-1/libProject1.so
    Начинаем экспериментировать с SDK, NDK и т.д. Поставил также хотфиксы для 10.3.3.
    Сразу скажу, SDK/NDK ставились отдельно через Android studio, не скачивались вместе с Delphi. Не торопитесь бросать чтение на этом месте!)) На другом компе, где все работает, все ставилось точно так же.
    Короче, очень много комбинаций версий SDK/NDK проверено.
    Результат такой. При постепенном понижении версии NDK все взлетело при NDK v22.

    При этом версия SDK видимо такого большого влияния не имеет, потому что этот вариант нормально работает

    Повторюсь. На других устройствах все работало и на более новых Ndk. Xiaomi Mi Pad4 , Samsung Galaxy Tab A (2019), Xiaomi Redmi 5 и 5Plus
     
    Спасибо за участие и помощь в разборе завалов @Andrey Efimov
     
  8. Like
    Andrey Efimov отреагировална Виталий Иванов в Скорость сборки / компиляции проекта   
    Я недавно или давно писал по поводу почему компилятор при разном наборе USES увеличивает время компиляции где-то от 4 до 10 раз. То есть проект может компилируются за 10 секунд, а при небольших манипуляциях с USES станет компилироваться 40 секунд и тд. Очень хорошо заметно на большом проекте у меня с 1 минуты 18 секунд выросло время компила до 1 часа 40 минут.
    Ну хватит предыстории после анализа зависимостей и проверки логов обращения к файловой системе был выяснен интересный факт :)
    У меня в проекте появился UNIT в котором глобальные методы для так сказать конфигурирования внешнего вида компонентов (компоненты тоже самописные) и получилось следующая ситуация:
    1. В UNIT с формой лежит один из визуальных компонентов назовем его TXXX
    2. соответственно в первом (interface секции) USES данного модуля прописывается автоматом модуль из зависимостей компонента
    3. В нижнем (implementation секции) USES расположен UNIT с глобальными методами (назовем его UNIT XXX) для так сказать конфигурирования его (установка бордера и другой дичи)
    4. В этом UNIT XXX (interface секции) USES также прописаны модули этих визуальных компонентов для передачи их в методы как параметры.
    Так вот из-за такой ошибочной связи время компила увеличивается в разы и по анализу project dependency увеличивается с более менее приемлемых (по времени компиляции) 200 до 500.
    Из сходя из этого начала рефакторинг всего кода и переводить компоненты на интерфейсы это сокращает project dependency проекта и неплохо так, перевод одного компонента который используется почти везде в проекте на интерфейс сократил с 200 до 190 и время компила начала сокращаться.
    Сори за много букавок, но может кому будет интересно или кто с толкнулся с такой проблемой.
     
    Так же в решении и анализе взаимосвязей помог эксперт MMX. 
  9. Like
    Andrey Efimov отреагировална 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.
    Для того, чтобы системный инсталлер запускался, нужно не забыть отметить еще одну галочку

     
     
     
     
     
  10. Thanks
    Andrey Efimov отреагировална Eric Myval в Unable to create process   
    Результат следующий 
    Мой проект корректно работает под
    1) Windows 32/64
    2) Android 32/64
    3) iOS 32/64 (обязательно настроить сертификаты, которые можно создать и прикрепить в Xcode + настроить их в Rad Studio в разделе Project-Deployment-Provisioning, выбрать там ключи как вы их настроили на вашем маке + ОБЯЗАТЕЛЬНО в version info удалить текст в CFBundleIdentifier, должно быть пусто)
    4) MacOS 32/64 
    5) iOS 32/64 simulator - не работает!!!
  11. Like
    Andrey Efimov получил реакцию от Ingalime в Почему в RecordCount не все строки таблицы?   
    Ознакомьтесь с FireDAC.Stan.Option.TFDFetchOptions.RecordCountMode.
    И начните уже пользоваться поиском на форуме... Не один раз обсуждалась эта тема Показаны результаты для 'RecordCount'
     
    p.s. Тему перенёс в подходящий раздел.
  12. Like
    Andrey Efimov отреагировална krapotkin в Проблема TStyleBook при переходе на 10.3.3. Cannot find style resource for 'Android'   
    А также Cannot find style resource fir Windows.
    Воспроизведение
    1. создать новое FMX приложение
    2. кинуть TSyleBook
    3. зайти по двойному щелчку
    4. попытаться добавить платформу
    результат (1)

    5. добавить Windows, Android. Удалить Default. закрыть StyleBook editor
    6. Положить кнопку, ПКМ, Edit Custom Style
    7. Результат

     
    если же просто сначала кинуть кнопку, сделать ПКМ, Edit custom Style, то картина совсем другая

    поэтому и не находит ни Windows ни Android   Соответственно Workaround - найти в FMX Platform = 'Android' и заменить на Platform = 'AndroidL Light' Platform = 'Windows' тоже возможно надо будет заменить, но с ней проблем вроде нет пока.     Все это делал на Windows 7 x64 Pro SP1  
  13. Thanks
    Andrey Efimov получил реакцию от Олег Киреев в Почему в RecordCount не все строки таблицы?   
    Ознакомьтесь с FireDAC.Stan.Option.TFDFetchOptions.RecordCountMode.
    И начните уже пользоваться поиском на форуме... Не один раз обсуждалась эта тема Показаны результаты для 'RecordCount'
     
    p.s. Тему перенёс в подходящий раздел.
  14. Like
    Andrey Efimov отреагировална Eric Myval в Unable to create process   
    Хорошо, спасибо! Как разберусь, то отпишусь о результатах! 
  15. Like
    Andrey Efimov отреагировална dnekrasov в Unable to create process   
    http://docwiki.embarcadero.com/RADStudio/Rio/en/MacOS_Notarization
    Делал как здесь описано - всё получилось.
  16. Like
    Andrey Efimov отреагировална Vitaldj в Unable to create process   
    Можно первое время не покупать серты, а генерировать в Xcode, сделав пустой проект и запустить на телефона, а потом такие же параметры прописать в delphi. С Каталины 32 не поддерживается вообще. До ее, было предупреждение, что вскоре не будет поддерживаться. 
  17. Like
    Andrey Efimov отреагировална Vitaldj в Unable to create process   
    Нет, на симуляторе не нужны серты, но я так и не смог добиться его нормальной работы. Более года назад его сломали, обещали сделать,ьно я не мог понять, сделали его или нет. Так как есть куча живых устройств на iOS , я забил на симулятор.
    Совет. Делайте всегда на последнем  PAservere. Сейчас последний 10.3.3.
  18. Like
    Andrey Efimov отреагировална Barbanel в Динамическое изменение массива записей   
    Большое количество - это сколько?
    100, 100 000, 100 000 000?
    Каждый раз увеличивая размер на один элемент, менеджер памяти ищет непрерывный незанятый кусок памяти такой длины, чтобы уместить все элементы. Хорошо если место под уже выделенный массив позволяет увеличить размер, не упираясь в участики памяти занятые другими данными.
    Иногда после очередного увеличения массива, уже выделенного участка памяти более не хватает. В таком случае менеджеру приходится искать новый, и копировать старые данные в новый участок памяти, а старый участок помечать как свободный.
    Разумеется это занимает время. Именно это и приводит к "не так быстро, как хотелось бы".
    Чтобы избежать этого:
    1 Способ курильщика, простой: Увеличиваем размер массива не на 1 элемент, а сразу на 16/32/128/1024 элемента (вам виднее, в зависимости от того сколько у вас может быть элементов в массиве). Также заводим счетчик - номер последнего занятого элемента в массиве, и после каждого добавления - увеличиваем этот счетчик на единицу. Этот способ не избавит от проблемы, но будет приводить к менее частому перераспределению памяти.
    2 Способ здорового человека, чуть сложнее: используйте указатели. Заведите массив указателей (либо TList), выделяйте место под каждую новую запись (ваш record) вручную, и помещайте указатель на него в ваш массив указателей (или в TList). Не забывайте освобождать выделенную память, когда ваши обьекты больше не нужны. Этот спобоб более правильный, так как в этом случае перераспределение происходит очень редко.
    Кстати, реализация TList использует внутри себя первый способ.
  19. Like
    Andrey Efimov отреагировална CyberStorm в Не могу разобратся с BannerAD   
    /////////// реклама ////////////////////
    try
    BannerAd1.AdUnitID := bkey;
    BannerAd1.LoadAd;
    except
    on E : Exception do ShowMessage(E.Message);
    end;
    вот используйте, ошибку напишет
  20. Like
    Andrey Efimov отреагировална Voron в Не могу разобратся с BannerAD   
    Спасибо! Это мне помогло.
    Была ошибка "java class jadsize could not be found".
    Решение: Target platforms->Android->Libraries, в появившемся меню выбрать Revert System Files to Default.
    Вдруг кому пригодится.
  21. Like
    Andrey Efimov получил реакцию от Ingalime в [Статья][AdMob] Добавляем рекламный блок в приложение   
    Ссылка: http://delphifmandroid.blogspot.ru/2016/07/admob.html
    Автор: Андрей Ефимов
    Описание: Подробная инструкция по добавлению рекламного блока в приложение, разработанное в RAD Studio.
     
  22. Like
    Andrey Efimov отреагировална CyberStorm в Ошибка "Java class JAdSize could not be found"   
    Нужно библиотеки почистить:

    Вот тут еще много написано: 
     
     
  23. Like
    Andrey Efimov получил реакцию от Ingalime в Покупки из приложения   
    Вы пробовали пользоваться поиском на форуме? (Думаю нет...) Работа с TInAppPurchase
     
    p.s. Тему перенёс в соответствующий раздел "TInAppPurchase"
  24. Like
    Andrey Efimov отреагировална CyberStorm в Android 64   
    Спасибо! Благодаря вашим наводкам наткнулся на инструкцию как собрать бандлы: http://docwiki.embarcadero.com/RADStudio/Rio/en/Submitting_Your_Android_App_to_Google_Play
    Пришлось грузить гуглу зашифрованный ключ, пришлось помучаться (https://stackoverflow.com/questions/44103024/how-to-enable-google-play-app-signing)
    И теперь собираются полноценные рабочие приложения!
  25. Like
    Andrey Efimov получил реакцию от CyberStorm в Android 64   
    Как и раньше, но теперь у них(других приложений) доступна версия 64-bit.
    32-bit приложения не блочили. Разработчиков просто обязали в дополнение к 32 битной версии прикладывать 64 битную версию.
    Полный отказ от 32 битных приложений был запланирован на Август 2021.
×
×
  • Создать...