Ingalime
-
Постов
354 -
Зарегистрирован
-
Посещение
-
Победитель дней
5
Активность репутации
-
Ingalime отреагировална Andrey Efimov в Не запускается служба
Значит вы не правильно собрали приложение. Этот apk файл собран в "RAD Studio 10.2 Tokyo Release 2 (без фиксов)" только что и протестирован на Андроид 4.4.2 (что под рукой было...).
-
Ingalime отреагировална 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
-
Ingalime отреагировална MAD_EVAL в Альтернатива Google Play
Как раз я и публиковал на Амазон, примерно 1/10 эффективность от play market была тогда, сейчас ещё меньше.
Да, все приложения с маркета улетают при бане.
-
Ingalime отреагировална krapotkin в После обновления на Андроид 6.01
на всех андроид устройствах нет смысла пользоваться прямым указанием папки
доступные программе папки перечислены в class TPath из System.IOUtils.pas
пример
uses System.IOUtils; fname := TPath.combine(TPath.GetDocumentsPath, 'myfile.txt');
-
Ingalime отреагировална Android в [Android]Публикация в маркете
Если стоит эта галочка, то на выходе получается не apk, а aab.
Непонятно тогда, откуда вы берет apk.
-
Ingalime отреагировална juppy в FMX асинхронное управление интерфейсом в процедуре до её завершения.
Светлана, вот как делаю я:
procedure TMainClient.ОбновитьДанныеВПотоке begin TThread.CreateAnonymousThread(procedure () begin TThread.Synchronize (nil, //Из потока обращаемся к контролам только через главгый поток procedure () begin Показываем котролы запускаем мультик end); Выполняем обработку данных без использования визуальных элементов TThread.Synchronize(nil, procedure () begin Выполняем остановку мультика скрываем контролы end); end).Start; end;
-
Ingalime отреагировална Android в Альтернатива Google Play
при первой публикации приложения указать, что оно бесплатное, а потом сделать платным
-
Ingalime отреагировална MAD_EVAL в Альтернатива Google Play
Или, например, как я, случайно в длинном описании повторилось одно слово 4 раза. Итог - спам ключевыми словами.
-
Ingalime отреагировална MAD_EVAL в Альтернатива Google Play
А убило окончательно аккаунт использование WebView в приложении, в которым был основной контент, мне хотелось попробовать сделать игру на JS и просто подгрузить её в приложение. Всё, вечный бан после этого последовал. Причина - опасная загрузка контента.
И вообще с гуглом надо осторожно, акк разраба на вес золота.
-
Ingalime отреагировална chfamy5499 в Delphi 10.4.1 и Андроид 11
Android 11 & Delphi 10.4.1 Demo - YouTube
https://www.youtube.com/watch?v=IcXUnPH21OA
-
Ingalime отреагировална Andrey Efimov в Delphi 10.4.1 и Андроид 11
К сожалению, статья (перевод), которую вы рекомендуете, опубликована в закрытом разделе (для пользователей с подпиской FGX Native).
Человек мог просто не знать/не заметить про особенность, озвученную выше.
Вот тут можно прочитать оригинал статьи (на английском): https://quality.embarcadero.com/browse/RSP-27218
-
-
Ingalime отреагировална krapotkin в RadStudio 10.3.3 и эмулятор BlueStacks: проблемы.
Сама Делфи к любым андроид-эмуляторам, -компиляторам, -утилитам, и вообще всему, что нужно для Андроид-разработки, никакого отношения не имеет. Все это - Google SDK. Этот SDK меняется каждый год. Туда добавляются и пропадают самые разные вещи. В том числе и AVD manager и SDK manager. Полный SDK теперь вообще можно поставить только вместе с Android Studio, и потом в Делфи указать пути к нему. Так что никаких изъятий инструментов мобильной разработки Rad Studio не производит.
Далее.
В мобильной разработке совершенно не будут работать те подходы, которые применяются на десктопах.
Например, упомянутые диалоги открытия и сохранения файлов бессмысленны, если доступа к файловой системе по сути и нет вовсе, как на IOS, или частично и только по специальному разрешению как в Андроид. Поэтому их и нет и не может быть для мобил.
На бесплатный TChart тоже я бы не стал возлагать большие надежды. Если честно, вам гораздо проще будет либо самостоятельно нарисовать график на Canvas. либо изготовить некий веб-сервер и с помощью к-нить JS-библиотеки подготовить данные, после чего открыть пользователю страницу с графиком.
При этом, до определенного предела вполне работает подход, когда программа пишется на FMX на Win32/64, (с характерными для телефона размерами окна, конечно) отлаживается, а потом время от времени запускается на Android. Я лично так делал. Но там нужно держать в голове серьезные отличия по работе с памятью вследствие ARC - Automatic Reference Counting. И соответственно, писать универсальный код.
-
-
Ingalime отреагировална krapotkin в RadStudio 10.3.3 и эмулятор BlueStacks: проблемы.
я понимаю, доверия ко мне нет, когда пара статей 2015 года говорит, что все зашибись
тогда почитаем Marco Cantu - продакт-менеджера Delphi
Posted November 6, 2019
https://en.delphipraxis.net/topic/1920-64bit-testing-hardwareemulation/?do=findComment&comment=15048
As for emulators, the issue is they are mostly Intel-based, so Java apps run fine, but native ones require a ARM emulator like libHoudini (this was an Intel library, but I think they stopped all development since they exit the Android world)
Что касается эмуляторов, проблема в том, что они в основном основаны на Intel, поэтому приложения Java работают нормально, но для нативных требуется эмулятор ARM, такой как libHoudini (это была библиотека Intel, но я думаю, что они остановили всю разработку, так как они вышли из мира Android)
-
Ingalime отреагировална mazayhin в [Android] Воспроизводить аудио
Вот я и говорил что не плохо было бы исправить этот код, и в extra отправлять комманды сервису из приложения, например, пауза там, и останавливать так же, посылая интент из приложения
-
Ingalime отреагировална OnePeople в [Android] Воспроизводить аудио
if TJBuild_VERSION.JavaClass.SDK_INT > 26 then // JBuild_VERSION_CODES.JavaClass.O begin {$ifdef VER330} // new ways for SDK > 26 (won't be called when API < 26 anyways) // Создаем канал уведомления ServiceChannel := TJNotificationChannel.JavaClass.init( StringtoJString('com.radio.one'), //CHANNEL_ID StrToJCharSequence('Public radio Channel'), TJNotificationManager.JavaClass.IMPORTANCE_DEFAULT ); // Получаем указатель на сервис работы с увдомлениями Obj := TAndroidHelper.Context.getSystemService( TJContext.JavaClass.NOTIFICATION_SERVICE); // Выдергиваем оттуда менеджер уведомлений NotificationManager := TJNotificationManager.Wrap(Obj); // Передаем менеджеру наш канал уведомлений NotificationManager.createNotificationChannel(ServiceChannel); // Создаем намерение с параметрами нашего приложения NewIntent:= TAndroidHelper.Context.getPackageManager().getLaunchIntentForPackage( TAndroidHelper.Context.getPackageName()); NewIntent.setAction(TJIntent.JavaClass.ACTION_MAIN); NewIntent.addCategory(TJIntent.JavaClass.CATEGORY_LAUNCHER); NewIntent.addFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK); // Создаем намерение для передачи другому приложению действия с правами нашего приложения PendingIntent := TJPendingIntent.JavaClass.getActivity( TAndroidHelper.Context, 0, NewIntent, TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK ); // Создаем уведомление ncb := TJNotificationCompat_Builder.JavaClass.init( TAndroidHelper.Context, StringToJString('com.radio.one') ); // Указываем параметры уведомления // Заголовок уведомления ncb.setContentTitle(StrToJCharSequence('PublicRadio')); // Текст для служб специальных возможностей // Начиная с выпуска L, этот текст больше не отображается на экране, но он по-прежнему полезен для служб специальных возможностей (где он служит звуковым объявлением о появлении уведомления). // ncb.setTicker(StrToJCharSequence('MyCommsService')); // can't remember why this is commented out to be honest // Иконка уведомления ncb.setSmallIcon(JavaService.getApplicationInfo.icon); // Действие при нажатии на уведомления ncb.setContentIntent(PendingIntent); // Действие при нажатии на уведомления // Установите, является ли это "текущим" уведомлением. Текущие уведомления не могут быть отклонены пользователем, поэтому ваше приложение или служба должны позаботиться об их отмене. Они обычно используются для обозначения фоновой задачи, которой пользователь активно занят (например, воспроизведение музыки) или которая каким-то образом ожидает выполнения и поэтому занимает устройство (например, загрузка файла, операция синхронизации, активное сетевое подключение). ncb.setOngoing(True); // Выводим уведомление ntf := ncb.build; Как то так
-
Ingalime отреагировална mazayhin в [Android] Воспроизводить аудио
А, ок, понял. Но сейчас уже ухожу с работы от компа... Если никто не распишет, может, на выходных, или уже в понедельник, распишу.
Да, и код сервиса "выдран" от куда то, я б, честно, его поменял немного, но ничего.
По поводу ExtraData - при запуске сервиса предполагается какое-то дальнейшее действие, вот оно в эту дату и прилетает при запуске, и дальше автор что-то с этим значением делает
-
Ingalime отреагировална mazayhin в [TWebbrowser] как вытащить куки
{$IFDEF ANDROID} uses Androidapi.Helpers, Androidapi.JNI.Webkit; (...) var CookieManager: JCookieManager; Cookie: string; begin CookieManager := TJCookieManager.JavaClass.getInstance; Cookie := JStringToString(CookieManager.getCookie(StringToJString(WebBrowser1.URL))); CookieManager := nil; end; Результат - строка формата HTTP-заголовка Cookie - PHPSESSID=298zf09hf012fh2; csrftoken=u32t4o3tb3gg43; _gat=1
Так же, через менеджер для URL можно установить свои куки, или удалить их.
-
Ingalime отреагировална krapotkin в Оптимизация поток и AniIndicator
логика должна быть такой
в главном потоке запускаем индикатор и доп. поток.
При окончании работы доп. поток например в событии OnTerminate прячет индикатор.
Всё.
Если есть прямо жестокая необходимость, чтобы доп. поток как-то отчитывался о прогрессе, пусть отправляет сообщения в главный поток.
Никаких других знаний друг о друге у обоих потоков быть не должно.
Это идеальная универсальная схема. Ессн бывают всякие обстоятельства, но в целом она рабочая всегда.
подробнее я писал об этом тут
-
Ingalime отреагировална Yarpda в А не сделать ли уроки по стилям FMX for free?
Заметил что ссылка на уроки по стилям FMX уже не доступна. Как я понял Ярослав не планирует больше продавать эти уроки, т.к. ушел в FGX Native, но по сути там довольно интересный материал (я их проходил в свое время и много раз использовал то, что узнал на них), и раз он уже не продается, может быть сделать доступ к этим урокам бесплатным? Я полагаю это могло бы популяризировать FMX. Там действительно без бутылки видео-уроков не разберешься
-
Ingalime отреагировална Tumaso в А не сделать ли уроки по стилям FMX for free?
Да, для десктопных приложений курс до сих пор актуален, убеждаюсь по переходящим из VCL и задающим кучу одних и тех же вопросов. А FGX Native увы только для Android и (скоро) для iOS.
-
Ingalime отреагировална OnePeople в [Android] Воспроизводить аудио
Ну так вы смотрите сразу справку гуугл
CHANNEL_ID -
The id of the channel. Must be unique per package. The value may be truncated if it is too long.
Идентификатор канала. Должно быть уникальным для каждого пакета. Значение может быть усечено, если оно слишком длинное.
Допустим пусть это будет имя пакета + '_id_1'
Смысл в том что приложение может создать несколько уведомлений, и что если вам нужно удалить уведомление вы
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); // The id of the channel. String id = имя пакета + '_id_1'; notificationManager.deleteNotificationChannel(id); -
Ingalime отреагировална OnePeople в [Android] Воспроизводить аудио
Тут немного занялся радио у себя, не забудьте добавить ещё эти файлы http://www.un4seen.com/stuff/bass_ssl-android.zip иначе ссылки начинающие с https могут не играть)
-
Ingalime отреагировална Сергей Сергеев в Открытие PDF
ну так вот .. в 10.4.1 в ИОС перешли на другой TWebBrowser
в итоге pdf не открывает, по телефону на странице не звонит.. хорошо 10.3.3. не снес еще.. успеть бы в АппСтор закинуть..
https://www.embarcadero.com/ru/products/rad-studio/whats-new-in-10-4-sydney