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

Andrey Efimov

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

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

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

    123

Весь контент Andrey Efimov

  1. Ну смотрите: 1) Как я уже говорил, вам необходимо ознакомиться с основами транслирования и использования АПИ. Например тут: Как создавать обёртки для JAVA-кода и тут: Как подключить и использовать свой JAVA-класс (статьи "малость" старые, но суть сохранилась.) Единственное, что могу добавить (про обёртки): Всё, что находится в interface(JObjectClass) вызывается так: TJНазваниекласса.JavaClass.НазваниеМетода/Поля Всё, что находится в interface(JObject) вызывается только через предварительно созданный/полученный объект. 2) На форуме, для кода используйте тег "Код", без подсветки кода (или как вам угодно). Это помогает повысить читабельность поста, отделить код от текста. Если вы используете обёртку не из стандартной поставки, то прикладывайте её к посту. Не редкость, что ошибки бывают в самих обёртках. 3) Из-за первого пункта вы начали копировать другие решения (не обдумывая). Я буду исходить из вашего изначального кода. Вам должно быть достаточно подключения AndroidAPI.JNI.GraphicsContentViewText, там всё уже реализовано (это я про обёртку для использования JBitmap и JBitmapFactory). Далее моё "гадание на кофейной гуще" (т.к. обёртку для WallpaperManager в вашем сообщении я не вижу). Исхожу из того, что она сгенерирована правильно. Значит в вашем коде, перед использованием метода setBitmap(Image); необходимо получить доступ к объекту WallpaperManager. Заходим по ссылке Android API: WallpaperManager, смотрим на описание и методы, видим метод Android API: WallpaperManager#getInstance, делаем вывод, что с помощью этого метода сможем получить доступ к объекту WallpaperManager, а далее попытаться использовать метод setBitmap. На этом, моё предсказание завершено (само собой не факт, что оно верное, но если бы передо мной стояла такая задача, то в самом начале, я поступил бы именно так), остаётся только попробовать. p.s. Автоматический генератор обёрток иногда сбоит, рекомендую всегда проверять генерируемые обёртки. Результаты этих сбоев встречались как в личном опыте, так и у других разработчиков на форуме.
  2. Используйте вот такое обращение к этому методу Image := TJBitmapFactory.JavaClass.decodeFile(str);
  3. Для стандартного АПИ, в большинстве случаев, достаточно иметь только обёртку (.pas файл). Какая то часть обёрток для АПИ всегда идёт со студией в комплекте (найти можно тут: C:\Program Files (x86)\Embarcadero\Studio\версиястудии\source\). Если нужной вам обёртки нет в комплекте со студией, то либо генерите её самостоятельно, либо скачиваете с GitHub'а. На форуме есть упоминание об этом: Полностью транслированное Android API 7-23 уровня Для сторонних jar - библиотек, необходимо иметь саму библиотеку в виде jar файла и обёртку к ней. В вашем случае, должно хватить (если не брать во внимание callback OnColorsChangedListener) простого указания .pas файла в секции uses вашего приложения. p.s. Все начальные вопросы уже много раз обсуждались на форуме и в различных блогах, ищите, читайте, пробуйте p.s.2. Можете "покопаться", например, тут (https://delphifmandroid.blogspot.com/p/blog-page_27.html), тут (https://github.com/AndrewEfimov) и тут (http://yaroslavbrovin.ru/). Ну и конечно же, если вы хотите использовать специфичные функции Андроида, то необходимо ознакомиться https://developer.android.com
  4. Посмотрите в сторону Android API: WallpaperManager, вероятно, с помощью этого апи можно менять обои.
  5. К сожалению, статья (перевод), которую вы рекомендуете, опубликована в закрытом разделе (для пользователей с подпиской FGX Native). Человек мог просто не знать/не заметить про особенность, озвученную выше. Вот тут можно прочитать оригинал статьи (на английском): https://quality.embarcadero.com/browse/RSP-27218
  6. Используйте System.IOUtils и ListBox (но лучше ListView). Не забудьте кидать пользователю запрос разрешений. Ну и я точно знаю, что на некоторых девайсах вам не удастся получить список папок и файлов из корня (стандартными средствами).
  7. Andrey Efimov

    Android Services

    Всё возможно... В данном случае, у Джима код отрабатывал как ожидается, по причине того (я предполагаю), что он тестировал его на Nexus 5 (2015 чистый Android 6). Я также занимался изучением сервисов примерно в 2016, но тестировал этот код на многих девайсах. Как помню, на Android 4.4.2 всегда отрабатывал как ожидается. А вот на более новых версиях + (это жирный плюс, влияющий очень на многое) девайсах разных производителей (очень выделялись на тот момент Xiaomi) дела обстояли очень плохо, т.к. производители вводили свои ограничения для приложений (например, "авто запуск приложения/сервиса" - пользователь должен был разрешить подобное поведение в настройках приложения). Учитывая свой опыт, могу дать такой совет: Попробуйте дать все возможные разрешения на автозапуск приложения/сервиса примерно тут: "Безопасность – Разрешения – Автозапуск – Название вашего приложения" и проверить код ещё раз. Вот ещё небольшое описание из моего старого проекта: Из-за всех этих изменений от производителей, тема стала достаточно непростой. По этой причине считаю, что начинать нужно с нуля, т.е. с официальной справки гугла: Службы Foreground services
  8. Попробуйте так: 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 Статья старая, но правила связанные с полями/константами и методами действительны по сей день.
  9. Вы не видите Location потому что получаете заголовки уже после редиректа, т.е. заголовки уже для самого файла. А Location появляется во время первого запроса по адресу https://telegram.org/dl/desktop/win, там то как раз сервер и сообщает (в заголовках), что ваш запрос будет перенаправлен по адресу https://updates.tdesktop.com/tsetup/tsetup.2.4.2.exe и выдаёт вам новую порцию заголовков без Location. Чтобы убедиться в этом, достаточно установить HandleRedirects = False.
  10. Обратите внимание на конечные пути (Remote Path). Цитата, которую вы привели, как раз говорит вам "they should be alongside the libPublicRadio.so files under the lib folder.", т.е. для файлов библиотеки должны быть указаны те же пути, что и для libPublicRadio.so.
  11. Есть ещё вот такие компоненты: CData Enterprise Connectors
  12. Пожалуйста. Способ изначально был задуман для плавного перехода на новое АПИ, но видимо забыли убрать его... Вот ваш реальный манифест из файла который вы выложили выше. (Надеюсь приложение не несёт никакого вреда?))
  13. это не баг. Я же выше расписал вам в чём дело. Я декомпилировал ваш файл и там лежит другой манифест.
  14. Ааа, ну всё ясно... Вы выложили не тот манифест... В вашем приложении используется способ обхода о котором я говорил. Если бы сразу исходники предоставили, то всё решилось бы быстро. На самом деле у вас указано minSdkVersion= 14 и targetSdkVersion=14. Это способ обхода запроса разрешений, но гугл обещал его выпилить... видимо забыли...)) Возвращаясь к вашему вопросу, студия 10.3.* просто меняет значения на новые (или даже пересоздаёт файл манифеста, выяснять не буду) и поэтому разрешения не выдаются. Вот и вся загадка... Да, кстати, приложение ваше не запускается. Падает с чёрным экраном.
  15. Ок. сообщение с файлом я скрыл, т.к. не вызывает доверия. Было бы не плохо, получить от вас хоть какие-то исходники. Если такое происходит и с хеллоуворлд, то хотя бы эти исходники. Тут дело в том, что я компилю на 10.3.3 хеллоу ворлд с такими же разрешениями и у меня они не выдаются... О багах, дырах и т.п. сообщать сюда https://quality.embarcadero.com/
  16. Скинуть исходники в личку есть возможность? Я знаю только один способ, но не исключено, что есть ещё...
  17. Сейчас я разбираюсь как вы получили разрешения в обход системы безопасности...
  18. Отлично, теперь давайте по порядку. и скорее всего это не соответствует действительности. Объясню почему, кратко. А подробнее можно почитать по ссылке ниже. С Android 6 (API 23) были усилены меры безопасности. Разрешения (Uses Permissions) были поделены на две категории "Обычные" и "Опасные". Отличие заключается в том, что: на версиях Андроид до 6 достаточно прописать разрешения в манифесте на версиях Андроид 6 и выше, опасные разрешения необходимо прописать в манифесте и запрашивать в режиме реального времени, т.е. прямо во время выполнения приложения. Тут важно добавить, что есть способ обойти эти меры безопасности, но не факт что он будет работать на новых версиях Андроида, поэтому озвучивать его не буду. В вашем манифесте море опасных разрешений и соответственно они не могли быть получены через манифест на версиях Андроид >=6. Вы явно указываете, что ваше приложение поддерживает Андроид 4.0 и разрабатывалось для Андроид 9. А значит вы уже обязаны запрашивать разрешения в режиме реального времени. Примечание. Студия 10.2.* и 10.3.* официально не поддерживают Андроид 4.0-4.4.4, но приложения запускаются. Однако при использовании студии версии 10.3.3 и некоторых компонентов вы увидите кучу ошибок или AV на версиях Андроид 4.0-4.4.4. Есть серия статей, которые могут быть вам полезны: [Статья][Android] Серия статей на тему Uses Permissions
  19. А где сам манифест? Какие разрешения пытаетесь получить? Версия Андроида? Дайте больше инфы, на форуме нет телепатов.
  20. Ознакомьтесь с FireDAC.Stan.Option.TFDFetchOptions.RecordCountMode. И начните уже пользоваться поиском на форуме... Не один раз обсуждалась эта тема Показаны результаты для 'RecordCount' p.s. Тему перенёс в подходящий раздел.
  21. Вы пробовали пользоваться поиском на форуме? (Думаю нет...) Работа с TInAppPurchase p.s. Тему перенёс в соответствующий раздел "TInAppPurchase"
×
×
  • Создать...