Меню

Настройка rad studio для андроид



Пишем под Android. Embarcadero RAD Studio Delphi XE5. #1

Где-то в начале 2014-ого года, узнал про новую поделку от эмбаркадеро, которая ещё оказывается и под мобильные платформы писать умеет. И вот, совсем недавно я это скачал. По началу впечатления были что ни есть положительные, за исключением непривычного расположения объектов. Сидел я значит, не спеша портировал один проект на мобильную платформу. Заметил, что на тяжёлых циклах этот чёрт вешается. Приложения весят очень, очень много. Всё же, сохранил проект и приостановился. Думаю, нужно мне его ещё поизучать. Всё-таки, это вам уже не тот старый добрый Delphi-7 от борланд…
И вот, решил написать пару статей, пока изучаю сам это чудовище. Не претендую на то, что мои варианты единственно-верно правильные и допускаю критику.

Как обычно, начнём с простейшего и самого бесполезного. Сделаем приветствовалку. Легко, примитивно, бесполезно. В бонус к этому, покажу как можно достаточно неплохо на первое время оптимизировать приложения под разные экраны.

Начнём. Подключаем девайс к компьютеру в режиме отладки. Если компьютер «плохо видит» вашего китайца, рекомендую заглянуть сюда: Не видно телефон / планшет в режиме отладки. Решение.
Эмулировать девайс я крайне не советую. Это очень грузит компьютер и местами очень тяжело даже хорошим ПК.
Запускаем оружие массового уничтожения андроид девайсов делфи.
Нашему взору открывается какое-то ужасно непонятное окно. Сейчас разберёмся, что тут к чему.

Создаём новый мобильный проект. Что к чему в этом окне разобраться успеете.
Как создать такой проект? Во, смотрите.


Следом откроется ещё одно окно. Это будет выбор шаблона. Сейчас нам нужен пустой. (Blank Application)


Теперь, открылось окошко в котором мы и будем работать. Разберём его подробней:

1. Это здесь теперь находятся компоненты. Весьма непривычное расположение. Но здесь есть очень приятный поиск по названиям компонентов. Приятен ещё он тем, что можно помнить название компонента частично. Скажем только конец. Написать его, и поиск его тебе легко найдёт.
2. Непосредственно, форма. её вид, (и сам размер формы касаемо размеров экрана. Если накидать компонентов, то они будут располагаться совершенно по разному на разных «формах») можно выбрать в раскрывающемся меню, отмеченным на рисунке цифрой 6 .
3. Инспектор объектов. Место у него святое. Никуда его не сдвинули, и даже не видоизменили. В нём изменяются свойства для различных объектов.
4. Дерево проекта. Расположение его тоже не затронуто эмбаркадеровцами. В нём можно посмотреть какие компоненты присутствуют в нашем проекте. Удобная штука.
5. Менеджер проекта. Я ещё не до конца въехал в его суть. Но я так понял здесь можно просматривать, выбирать все подключенные к компьютеру девайсы, а так же эмуляторы этих самих девайсов. Ещё я так понимаю, можно глянуть из каких файлов состоит проект.
6. Как я уже сказал — это выезжающее меню для видоизменения формы.

Во. Примерно разобрались. Значит что, разворачиваем спойлёр «Standard» в компонентах, и вытаскиваем оттуда TButton и TLabel. Вытащить их можно как зажав левую клавишу мыши, так и нажав просто дважды на него. Опускаемся ниже, и повторяем тоже самое с TEdit’ом.

Наверняка, у вас на форме творится бардак. Вот, вроде моего:


Раскидал я компоненты по форме более-менее. Кстати, их можно «вытягивать» во все стороны для получения оптимального размера. Но, наверняка, хочется чтобы было ровно по центру, по феншую. Сейчас сделаем ровно.


Значит что делаем. Давим правой кнопкой мыши по компоненту, открываем «Position», клацаем на «Align…»


Откроется вот такое окошко. Отмечаем центр по горизонтали и радуемся.


Повторяем со всеми компонентами. Получается что-то вроде этого:

Теперь, нажимаем на компонент Tlable один раз левой кнопкой мыши . Идём в инспектор объектов и изменяем свойство «Text». С «label1» на «Ваше имя:».


Повторяем с Button1. Пускай «Text» станет равным «Приветствовать».


Ну всё. С оформлением закончено. Теперь, давайте-ка, перейдём к части кода. Нажимаем на компонент кнопки два раза. Откроется скромненький редактор кода с уже сгенерированной функцией OnClick, которая отрабатывает при нажатии на кнопку в уже запущенном приложении.


Впишем туда что-то типа этого:

Значит, разбираем.
showmessage — функция открытия окошка с сообщением. Всё, что в скобочках: «()» — она и покажет.
Edit1.Text — это что-то вроде переменной. Он за пределами кавычек, по этому считается кодом. Вместо Edit1.Text в сообщении будет показано то, что человек ввёл в поле.
+ — это как бы сложение значения в едите, и значения в кавычках в единое сообщение.
‘ приветствую!’ — и есть значение в кавычках. Окончание строки.
; — обязательный символ, означающий окончание действия. Ставится почти во всех строчках в конце.

Теперь, давайте вернёмся к нашей форме и закрепим положения элементов, для нормального отображения приложения на всех (или почти всех) экранах. К форме можно вернуться, нажав «Design» внизу страницы.


Нажимаем на какой-нибудь компонент один раз , и в инспекторе объектов разворачиваем список «якорей» — анкоров.


Это и есть те самые крепления для объектов. Все их включать вовсе не нужно. Ибо при одновременном akTop и akBottom (сверху и снизу), компоненты на маленьких экранах может сплюснуть до пиксельной полоски, не видной человеческому глазу. По этому оставляем включенными только akLeft, akRight, и один из двух — akTop, или akBottom. (Я предпочитаю akTop оставлять выключенным, а акBottom — включённым)


Повторяем это дело со всеми объектами.

Теперь, сохраняем наш проект куда-нибудь.

Ну всё. Осталось только запустить этот огромный комплекс. Подключаем девайс в режиме отладки (Если уже не подключили).
Разворачиваем вот такое дерево в менеджере проектов, активируем подключённый девайс двойным нажатием левой кнопки мыши. Он должен стать жирным.

Читайте также:  Настройка sip на samsung galaxy


Следом, давим F9 и ждём полной сборки проекта и установки его на устройстве. Запуститься на девайсе приложение должно само.

После запуска, пишем в поле наше имя и нажимаем на кнопку.

Источник

Серия статей, как настроить Android, OS X, iOS Simulator, iOS с RAD Studio (Delphi, C++ Builder)

Рекомендуемые сообщения

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Похожий контент

Всем привет, с помощью Java2Op сделал обертку библиотеки получил модуль с интерфейсами.
Теперь сам вопрос в JavaInterfaces.pas есть описание:

JUsbManagerClass = interface(JObjectClass) [‘<1048A6E9-E1B5-4DA5-A168-ED91E8DE5284>‘] function _GetACTION_USB_ACCESSORY_ATTACHED: JString; cdecl; function _GetACTION_USB_ACCESSORY_DETACHED: JString; cdecl; function _GetACTION_USB_DEVICE_ATTACHED: JString; cdecl; function _GetACTION_USB_DEVICE_DETACHED: JString; cdecl; function _GetEXTRA_ACCESSORY: JString; cdecl; function _GetEXTRA_DEVICE: JString; cdecl; function _GetEXTRA_PERMISSION_GRANTED: JString; cdecl; function getAccessoryList: TJavaObjectArray ; cdecl;//Deprecated function openAccessory(accessory: JUsbAccessory): JParcelFileDescriptor; cdecl;//Deprecated function openDevice(device: JUsbDevice): JUsbDeviceConnection; cdecl;//Deprecated procedure requestPermission(device: JUsbDevice; pi: JPendingIntent); cdecl; overload;//Deprecated property ACTION_USB_ACCESSORY_ATTACHED: JString read _GetACTION_USB_ACCESSORY_ATTACHED; property ACTION_USB_ACCESSORY_DETACHED: JString read _GetACTION_USB_ACCESSORY_DETACHED; property ACTION_USB_DEVICE_ATTACHED: JString read _GetACTION_USB_DEVICE_ATTACHED; property ACTION_USB_DEVICE_DETACHED: JString read _GetACTION_USB_DEVICE_DETACHED; property EXTRA_ACCESSORY: JString read _GetEXTRA_ACCESSORY; property EXTRA_DEVICE: JString read _GetEXTRA_DEVICE; property EXTRA_PERMISSION_GRANTED: JString read _GetEXTRA_PERMISSION_GRANTED; end; [JavaSignature(‘android/hardware/usb/UsbManager’)] JUsbManager = interface(JObject) [‘<6F603A25-E816-4012-9B23-054B428A4A75>‘] function getDeviceList: JHashMap; cdecl;//Deprecated function hasPermission(device: JUsbDevice): Boolean; cdecl; overload;//Deprecated function hasPermission(accessory: JUsbAccessory): Boolean; cdecl; overload;//Deprecated procedure requestPermission(accessory: JUsbAccessory; pi: JPendingIntent); cdecl; overload;//Deprecated end; TJUsbManager = class(TJavaGenericImport ) end; Что бы получить доступ к методам интерфейса используется следующая конструкция:
JavaObject := TAndroidHelper.Context.getSystemService(TJContext.JavaClass.USB_SERVICE); FUsbManager := TJUsbManager.Wrap((JavaObject as ILocalObject).GetObjectID); теперь я могу получить доступ к методам JUsbManager, а как получить доступ к методам JUsbManagerClass
Вот пример кода на Java, который хочу реализовать в Delphi:
UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE); List availableDrivers = UsbSerialProber.getDefaultProber().findAllDrivers(manager); if (availableDrivers.isEmpty()) < return; >// Open a connection to the first available driver. UsbSerialDriver driver = availableDrivers.get(0); //Вот тут мы видим что из экземпляра класса мы вызываем openDriver, как это сделать в Delphi UsbDeviceConnection connection = manager.openDevice(driver.getDevice()); Как мы можем заметить этого метода в описании интерфейса нет, но есть в классе, как получить доступ к экземпляру класса?

Недавно решил написать небольшое приложение под андроид, которое будет в удобном виде показывать расписание моего ВУЗа (они нам передают 20 летний привет в виде экселя), ну и задно изучить FMX.
Написал за пару дней парсер, все более менее работает. Встал вопрос — какими компонентами все это удобно и красиво отобразить? Перечитал кучу инфы по стандартным компонентам и, кажется, они мне не подойдут
Для того чтобы было понятно, чего именно я хочу — набросал схему. Границы для наглядности.
Каким компонентом это можно реализовать? Если все-таки коробочные тоже годятся, то ткните лицом куда читать 🙂
Заранее спасибо.

Добрый день! Я собрал приложение и подготовил IPA файл, заполнил всю информацию, прикрепил все иконки. Когда загружаю приложение в App Store Connect и пытаюсь отправить на проверку, мне выдают следую ошибку:
В каталог объектов Xcode необходимо добавить значок приложения с разрешение 1024х1024.
Как это сделать? Уже всю голову сломал.

Использую Rad Studio 10.3.3 + PAServer 20 + самый свежий Xcode и последняя обнова на маке
Пробовал и Rad Studio 10.4 + PAServer 21, аналогичная проблема
Остальные ошибки не важны, их решить легко. Интересен только последний пункт.

Последние посетители 0 пользователей онлайн

Ни одного зарегистрированного пользователя не просматривает данную страницу

Источник

Пример создания Android приложения в RAD Studio 10 Seattle для работы c сервером MySQL. Работа с компонентами UniDAC от Devart.

Вопросы

Pax Beach 251

Pax Beach 251

Столкнулся с проблемой взаимодействия своего приложения 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 .

Читайте также:  Автоматические настройки ммс теле2 для айфон

На сайте 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 и считывали записи.

Моя задача решена, переписываю решение в рабочий проект. Надеюсь и вам будет полезен этот пример.

Отредактировал 27 декабря, 2015 Pax Beach

Поделиться сообщением

Ссылка на сообщение

5 ответов на этот вопрос

Рекомендуемые сообщения

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Похожий контент

Всем привет, с помощью Java2Op сделал обертку библиотеки получил модуль с интерфейсами.
Теперь сам вопрос в JavaInterfaces.pas есть описание:

JUsbManagerClass = interface(JObjectClass) [‘<1048A6E9-E1B5-4DA5-A168-ED91E8DE5284>‘] function _GetACTION_USB_ACCESSORY_ATTACHED: JString; cdecl; function _GetACTION_USB_ACCESSORY_DETACHED: JString; cdecl; function _GetACTION_USB_DEVICE_ATTACHED: JString; cdecl; function _GetACTION_USB_DEVICE_DETACHED: JString; cdecl; function _GetEXTRA_ACCESSORY: JString; cdecl; function _GetEXTRA_DEVICE: JString; cdecl; function _GetEXTRA_PERMISSION_GRANTED: JString; cdecl; function getAccessoryList: TJavaObjectArray ; cdecl;//Deprecated function openAccessory(accessory: JUsbAccessory): JParcelFileDescriptor; cdecl;//Deprecated function openDevice(device: JUsbDevice): JUsbDeviceConnection; cdecl;//Deprecated procedure requestPermission(device: JUsbDevice; pi: JPendingIntent); cdecl; overload;//Deprecated property ACTION_USB_ACCESSORY_ATTACHED: JString read _GetACTION_USB_ACCESSORY_ATTACHED; property ACTION_USB_ACCESSORY_DETACHED: JString read _GetACTION_USB_ACCESSORY_DETACHED; property ACTION_USB_DEVICE_ATTACHED: JString read _GetACTION_USB_DEVICE_ATTACHED; property ACTION_USB_DEVICE_DETACHED: JString read _GetACTION_USB_DEVICE_DETACHED; property EXTRA_ACCESSORY: JString read _GetEXTRA_ACCESSORY; property EXTRA_DEVICE: JString read _GetEXTRA_DEVICE; property EXTRA_PERMISSION_GRANTED: JString read _GetEXTRA_PERMISSION_GRANTED; end; [JavaSignature(‘android/hardware/usb/UsbManager’)] JUsbManager = interface(JObject) [‘<6F603A25-E816-4012-9B23-054B428A4A75>‘] function getDeviceList: JHashMap; cdecl;//Deprecated function hasPermission(device: JUsbDevice): Boolean; cdecl; overload;//Deprecated function hasPermission(accessory: JUsbAccessory): Boolean; cdecl; overload;//Deprecated procedure requestPermission(accessory: JUsbAccessory; pi: JPendingIntent); cdecl; overload;//Deprecated end; TJUsbManager = class(TJavaGenericImport ) end; Что бы получить доступ к методам интерфейса используется следующая конструкция:
JavaObject := TAndroidHelper.Context.getSystemService(TJContext.JavaClass.USB_SERVICE); FUsbManager := TJUsbManager.Wrap((JavaObject as ILocalObject).GetObjectID); теперь я могу получить доступ к методам JUsbManager, а как получить доступ к методам JUsbManagerClass
Вот пример кода на Java, который хочу реализовать в Delphi:
UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE); List availableDrivers = UsbSerialProber.getDefaultProber().findAllDrivers(manager); if (availableDrivers.isEmpty()) < return; >// Open a connection to the first available driver. UsbSerialDriver driver = availableDrivers.get(0); //Вот тут мы видим что из экземпляра класса мы вызываем openDriver, как это сделать в Delphi UsbDeviceConnection connection = manager.openDevice(driver.getDevice()); Как мы можем заметить этого метода в описании интерфейса нет, но есть в классе, как получить доступ к экземпляру класса?

Недавно решил написать небольшое приложение под андроид, которое будет в удобном виде показывать расписание моего ВУЗа (они нам передают 20 летний привет в виде экселя), ну и задно изучить FMX.
Написал за пару дней парсер, все более менее работает. Встал вопрос — какими компонентами все это удобно и красиво отобразить? Перечитал кучу инфы по стандартным компонентам и, кажется, они мне не подойдут
Для того чтобы было понятно, чего именно я хочу — набросал схему. Границы для наглядности.
Каким компонентом это можно реализовать? Если все-таки коробочные тоже годятся, то ткните лицом куда читать 🙂
Заранее спасибо.

поделитесь пожалуйста пустым проектом, готовым к публикации для TV устройств.
что-то никак не получается опубликовать, сейчас отклонили с такими ошибками:
APK:8
No Now Playing notification [card]»
Your App does not contain a “Now Playing” notification [card] for when the user has selected the HOME button within the app. Please refer to our Displaying a Now Playing Card documentation for more details.
APK:8
Play/Pause key event is not respected during playback
Your media apps that play video or music content must respect the play/pause key during playback. Please refer to our Media Play/Pause documentation and Update the Playback State documentation for details.
Missing DPad functionality
Your app requires user interaction for menus or app navigation. Please make sure that all menus and app navigation are fully functional using a DPad. Please refer to our DPAD Control and Hardware Declaration documentation.
ну и баннер не прилепил
No full-size app banner
Your app does not contain a full-size app banner or is it not visible in the launcher. We are targeting 1080P, which we consider xhdpi. Apps should include the banner in the xhdpi (320 dpi) drawables folder with a size of (320px × 180px). Please refer to our Home Screen Banner and UI Patterns documentation.
The title should help users identify apps in the launcher. Please refer to our Visual Design and User Interaction documentation for more information.
был бы очень благодарен за рабочий пустой костяк с манифестом.

Читайте также:  Настройка монитора samsung s24b350

В процессе разработки столкнулся с очень странной ситуацией, корни которой до сих пор неясны, но решение нашлось.
Итак. Делфи 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

в манифест и свой файл 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.
Для того, чтобы системный инсталлер запускался, нужно не забыть отметить еще одну галочку

Приветствую. На просторах интернета нашел BASS-библиотеку для Android и соответственно обертку для нее под Delphi.

Вроде бы все работает нормально, но вот при настройке библиотеки при помощи методов
BASS_GetConfigPtr, BASS_SetConfigPtr для работы со строковыми параметрами возникает проблема.
На Windows с этим я легко работал, там достаточно использовать такую конструкцию

PAnsiChar(BASS_GetConfigPtr(configId)) и получаем значение. BASS_SetConfigPtr(configId, PAnsiChar(value)) и задаем значение. Но вот под Android такой способ не проходит, как минимум по одной причине — он не понимает, что такое PAnsiChar. На docwiki.emarcadero.com, есть вот такая статейка. В которой написано, что PAnsiChar нужно заменить одним из трех: System.String, System.MarshalledString или System.SysUtils.TStringBuiler
Только вот, если использовать MarshalledString, то при попытке получить значение приложение просто намертво зависает и все.
Потом я подумал, так как библиотека написана на Java (вероятно), то может стоит попробовать использовать JNI в работе с ней, так как в Java файле, который прилагался вместе с библиотекой. Там я нашел объявления этих функций и заметил, что тип возвращаемого значения Object (ну, не зная Java я просто предположил, что это тоже просто ссылка на значение, например как PAnsiChar в Delphi на Windows).

Но, при попытке как-либо использовать это натыкаюсь на проблемы в виде ошибки компиляции, либо очередном зависании приложения.
Так как возвращается Object, то решил попробовать вариант с JObject и JString, но ни один вариант не хочет работать, опять ошибки на стадии компиляции, либо зависание приложение. Может быть, я что-то не так делаю.

В общем, буду признателен за помощь!

Источник