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

Ingalime

Пользователи
  • Постов

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

  • Посещение

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

    5

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

  1. Like
    Ingalime отреагировална Andrey Efimov в Не запускается служба   
    Значит вы не правильно собрали приложение. Этот apk файл собран в "RAD Studio 10.2 Tokyo Release 2 (без фиксов)" только что и протестирован на Андроид 4.4.2 (что под рукой было...).
  2. Like
    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
     
  3. Thanks
    Ingalime отреагировална MAD_EVAL в Альтернатива Google Play   
    Как раз я и публиковал на Амазон, примерно 1/10 эффективность от play market была тогда, сейчас ещё меньше.
     
    Да, все приложения с маркета улетают при бане.
  4. Like
    Ingalime отреагировална krapotkin в После обновления на Андроид 6.01   
    на всех андроид устройствах нет смысла пользоваться прямым указанием папки
    доступные программе папки перечислены в class TPath из System.IOUtils.pas
    пример
    uses System.IOUtils; fname := TPath.combine(TPath.GetDocumentsPath, 'myfile.txt');  
  5. Like
    Ingalime отреагировална Android в [Android]Публикация в маркете   
    Если стоит эта галочка, то на выходе получается не apk, а aab.
    Непонятно тогда, откуда вы берет apk.
  6. Like
    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;  
  7. Like
    Ingalime отреагировална Android в Альтернатива Google Play   
    при первой публикации приложения указать, что оно бесплатное, а потом сделать платным
  8. Like
    Ingalime отреагировална MAD_EVAL в Альтернатива Google Play   
    Или, например, как я, случайно в длинном описании повторилось одно слово 4 раза. Итог - спам ключевыми словами.
  9. Like
    Ingalime отреагировална MAD_EVAL в Альтернатива Google Play   
    А убило окончательно аккаунт использование WebView в приложении, в которым был основной контент, мне хотелось попробовать сделать игру на JS и просто подгрузить её в приложение. Всё, вечный бан после этого последовал. Причина - опасная загрузка контента.
    И вообще с гуглом надо осторожно, акк разраба на вес золота.
  10. Like
    Ingalime отреагировална chfamy5499 в Delphi 10.4.1 и Андроид 11   
    Android 11 & Delphi 10.4.1 Demo - YouTube
    https://www.youtube.com/watch?v=IcXUnPH21OA
     
  11. Like
    Ingalime отреагировална Andrey Efimov в Delphi 10.4.1 и Андроид 11   
    К сожалению, статья (перевод), которую вы рекомендуете, опубликована в закрытом разделе (для пользователей с подпиской FGX Native).
     
    Человек мог просто не знать/не заметить про особенность, озвученную выше.
     
    Вот тут можно прочитать оригинал статьи (на английском): https://quality.embarcadero.com/browse/RSP-27218
     
  12. Like
    Ingalime отреагировална OnePeople в каналы Push Notification   
    И добавить ncb.setsound
  13. Like
    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. И соответственно, писать универсальный код.
  14. Like
    Ingalime отреагировална OnePeople в Biometric Finger Reader on Android Device   
    Он работал
  15. Like
    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)
  16. Like
    Ingalime отреагировална mazayhin в [Android] Воспроизводить аудио   
    Вот я и говорил что не плохо было бы исправить этот код, и в extra отправлять комманды сервису из приложения, например, пауза там, и останавливать так же, посылая интент из приложения
  17. Thanks
    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; Как то так
  18. Thanks
    Ingalime отреагировална mazayhin в [Android] Воспроизводить аудио   
    А, ок, понял. Но сейчас уже ухожу с работы от компа... Если никто не распишет, может, на выходных, или уже в понедельник, распишу.
    Да, и код сервиса "выдран" от куда то, я б, честно, его поменял немного, но ничего.
    По поводу ExtraData - при запуске сервиса предполагается какое-то дальнейшее действие, вот оно в эту дату и прилетает при запуске, и дальше автор что-то с этим значением делает
  19. Like
    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 можно установить свои куки, или удалить их.
  20. Like
    Ingalime отреагировална krapotkin в Оптимизация поток и AniIndicator   
    логика должна быть такой
    в главном потоке запускаем индикатор и доп. поток.
    При окончании работы доп. поток например в событии OnTerminate прячет индикатор. 
    Всё.
    Если есть прямо жестокая необходимость, чтобы доп. поток как-то отчитывался о прогрессе, пусть отправляет сообщения в главный поток.
    Никаких других знаний друг о друге у обоих потоков быть не должно.
    Это идеальная универсальная схема. Ессн бывают всякие обстоятельства, но в целом она рабочая всегда.
    подробнее я писал об этом тут
     
  21. Like
    Ingalime отреагировална Yarpda в А не сделать ли уроки по стилям FMX for free?   
    Заметил что ссылка на уроки по стилям FMX уже не доступна. Как я понял Ярослав не планирует больше продавать эти уроки, т.к. ушел в FGX Native, но по сути там довольно интересный материал (я их проходил в свое время и много раз использовал то, что узнал на них), и раз он уже не продается, может быть сделать доступ к этим урокам бесплатным? Я полагаю это могло бы популяризировать FMX. Там действительно без бутылки видео-уроков не разберешься
  22. Like
    Ingalime отреагировална Tumaso в А не сделать ли уроки по стилям FMX for free?   
    Да, для десктопных приложений курс до сих пор актуален, убеждаюсь по переходящим из VCL и задающим кучу одних и тех же вопросов. А FGX Native увы только для Android и (скоро) для iOS.
  23. Thanks
    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);
  24. Thanks
    Ingalime отреагировална OnePeople в [Android] Воспроизводить аудио   
    Тут немного занялся радио у себя, не забудьте добавить ещё эти файлы http://www.un4seen.com/stuff/bass_ssl-android.zip иначе ссылки начинающие с https могут не играть)
  25. Like
    Ingalime отреагировална Сергей Сергеев в Открытие PDF   
    ну так вот .. в 10.4.1 в ИОС перешли на другой TWebBrowser
    в итоге pdf не открывает, по телефону на странице не звонит.. хорошо 10.3.3. не снес еще.. успеть бы в АппСтор закинуть..

     
    https://www.embarcadero.com/ru/products/rad-studio/whats-new-in-10-4-sydney
×
×
  • Создать...