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

gonzales

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

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

  • Посещение

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

    27

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

  1. Like
    gonzales получил реакцию от Ingalime в Push в Delphi11   
    Оставлю здесь информацию, как заставить работать пуши при переходе на delphi11. Если Вы заметили, что после перехода на 11 версию у Вас отвалились пуши, система не показывает firebase token, то проблема решается так.
    1. Скачиваем JSON с консоли FireBase

     
    2. Открываем его, видим следующий вид

    3. Вписываем в Настройках проекта в секцию Services в следующем соответствии:
    API key - current_key
    Application id - mobilesdk_app_id
    Project id - project_id
    GSM sender id - project_number
    4. И не забываем выставить в секцию Entitlement List галочку Receive push notifications.
    После этого все опять начинает работать. 
  2. Like
    gonzales отреагировална Slym в Изменение TDragOperation в процессе перетаскивания   
    uses Winapi.Windows;
  3. Like
    gonzales отреагировална CyberStorm в Компонент/библиотека для работы с bzip2   
    А стандартные библиотеки если использовать, типа System.Zip?
      zip: TZipFile;
      zip := TZipFile.Create;
      zip.Open(TPath.Combine(TPath.GetDocumentsPath, 'DATA.zip'), TZipMode.zmRead);
      zip.ExtractAll(TPath.GetDocumentsPath);
      zip.Close;
      zip.free;
  4. Like
    gonzales отреагировална 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.
    Для того, чтобы системный инсталлер запускался, нужно не забыть отметить еще одну галочку

     
     
     
     
     
  5. Like
    gonzales получил реакцию от Alisson R Oliveira в TTreeViewItem Расчёт высоты элемента для размещения всего текста   
    Может это поможет
    function CalcTextSize(text: string; Font: TFont; Size: single = 0): TSizeF; var TextLayout: TTextLayout; begin TextLayout := TTextLayoutManager.DefaultTextLayout.Create; try TextLayout.BeginUpdate; try TextLayout.text := text; TextLayout.MaxSize := TPointF.Create(9999, 9999); TextLayout.Font.Assign(Font); if not SameValue(0, Size) then begin TextLayout.Font.Size := Size; end; TextLayout.WordWrap := False; TextLayout.Trimming := TTextTrimming.None; TextLayout.HorizontalAlign := TTextAlign.Leading; TextLayout.VerticalAlign := TTextAlign.Leading; finally TextLayout.EndUpdate; end; Result.Width := TextLayout.Width; Result.Height := TextLayout.Height; finally TextLayout.DisposeOf; TextLayout := nil; end; end;  
  6. Like
    gonzales получил реакцию от Andrey Efimov в не могу скомпилить проект в delphi 11   
    Я разобрался, откуда вылезли эти грабли. У меня почему-то прописалось прямо в файле проекта (dproj файл), что Андроид64 использует SDK 25.2.5. После того, как я удалил эту привязку, все скомпилилось.
    А вообще 26 SDK у меня нормально существует)))

  7. Like
    gonzales отреагировална krapotkin в Как отоловить нажатие на чекбокс в итеме?   
    Потому что текст итема тоже задан компонентом и его нужно найти и сделать ему Margin
    либо сделать то же самое - полностью забить на то что там уже есть, оставить их пустыми и сделать все компоненты свои, в коде
    и по мне так это самое быстрое и самое управляемое решение ))
  8. Like
    gonzales получил реакцию от Semitako в Push в Delphi11   
    Оставлю здесь информацию, как заставить работать пуши при переходе на delphi11. Если Вы заметили, что после перехода на 11 версию у Вас отвалились пуши, система не показывает firebase token, то проблема решается так.
    1. Скачиваем JSON с консоли FireBase

     
    2. Открываем его, видим следующий вид

    3. Вписываем в Настройках проекта в секцию Services в следующем соответствии:
    API key - current_key
    Application id - mobilesdk_app_id
    Project id - project_id
    GSM sender id - project_number
    4. И не забываем выставить в секцию Entitlement List галочку Receive push notifications.
    После этого все опять начинает работать. 
  9. Thanks
    gonzales получил реакцию от Sascha в Кто подключил к Firemonkey-проекту библиотеки, написанные на других языках?   
    деплоить библиотеку используя RemotePath library\lib\arm64-v8a\ (это для Android64) 
    DLL_PATH:=TPath.GetLibraryPath+'/'; function MySafeLoadLibrary(ModuleName:string):HMODULE; var   errorMsg:string; begin   Result:=0;   ModuleName:=DLL_PATH+ModuleName;   if FileExists(ModuleName) then   begin     Result:=LoadLibrary(PChar(ModuleName));   end;   if Result = 0 then   begin     errorMsg:=string(UTF8Decode(dlerror));     errorMsg:=Format('Can not load %s error:%s', [ModuleName, errorMsg]);     ShowMessage(errorMsg);     raise Exception.Create(errorMsg);   end; end;  
  10. Like
    gonzales получил реакцию от Andrey Efimov в Delphi 11 - сборка приложения со сторонними библиотеками   
    Оставлю тут информацию, чтобы не потерялась.
    Суть проблемы в следующем, в проекте используются сторонние библиотеки, которые подключены в deployment. Прописаны пути для этих библиотек library\lib\arm64-v8a\. Все работает при отладке на телефоне в Release mode (Development). Для сборки пакета для Goolge Play переключаюсь в Release (Application Store) и создаю aab файл. Google его нормально принимает, приложение выкладывается, и тут возникает ошибка

    то есть программа не может найти библиотеку libavutil.so по адресу data/....
    Причем ошибку наблюдается на Андрод 9 и 10, а на Андроид 11 работает все штатно.
    Открываю aab файл как архив, 

    вот же они, все библиотеки на месте. Напоминаю, что apk файл отрабатывает на устройстве абсолютно нормально, но загрузить его в Google Play не получается, потому как в Development mode не подтягиваются сертификаты, необходимые для выкладки, а в Application Store mode не создается apk файл. 
    На данный момент нашел только одно решение проблемы, возможно кто-нибудь подскажет что-то более вменяемое
    1. Запускаем командную строку
    команда создания сета с apk
    java.exe -jar "C:\Program Files (x86)\Embarcadero\Studio\21.0\bin\Android\bundletool-all-0.13.3.jar" build-apks --mode=universal --bundle="путь до aab файла.aab" --output="путь куда развернуть apks файлы.apks" --ks="путь до keystore файла.keystore" --ks-pass=pass:пароль keystore --ks-key-alias=алиас приложения --key-pass=pass:пароль алиаса
    После непродолжительного ожидания в папке "путь куда развернуть apks файлы" создается apks файл
    2. Открываем получившийся apks файл как архив, вытаскиваем оттуда apk файл. У меня он называется universal.apk
    3. Уже этот apk файл выкладываем в Гугл.
    Метод конечно абсолютно костыльный, вообще непонятно сколько еще Гугл продолжит принимать apk вместо aab, надеюсь, что этот месседж кто-нибудь увидит и эту хрень пофиксят.
  11. Like
    gonzales получил реакцию от A_l_ex в не могу скомпилить проект в delphi 11   
    Я разобрался, откуда вылезли эти грабли. У меня почему-то прописалось прямо в файле проекта (dproj файл), что Андроид64 использует SDK 25.2.5. После того, как я удалил эту привязку, все скомпилилось.
    А вообще 26 SDK у меня нормально существует)))

  12. Like
    gonzales получил реакцию от krapotkin в Push в Delphi11   
    Оставлю здесь информацию, как заставить работать пуши при переходе на delphi11. Если Вы заметили, что после перехода на 11 версию у Вас отвалились пуши, система не показывает firebase token, то проблема решается так.
    1. Скачиваем JSON с консоли FireBase

     
    2. Открываем его, видим следующий вид

    3. Вписываем в Настройках проекта в секцию Services в следующем соответствии:
    API key - current_key
    Application id - mobilesdk_app_id
    Project id - project_id
    GSM sender id - project_number
    4. И не забываем выставить в секцию Entitlement List галочку Receive push notifications.
    После этого все опять начинает работать. 
  13. Like
    gonzales получил реакцию от Tumaso в Push в Delphi11   
    Оставлю здесь информацию, как заставить работать пуши при переходе на delphi11. Если Вы заметили, что после перехода на 11 версию у Вас отвалились пуши, система не показывает firebase token, то проблема решается так.
    1. Скачиваем JSON с консоли FireBase

     
    2. Открываем его, видим следующий вид

    3. Вписываем в Настройках проекта в секцию Services в следующем соответствии:
    API key - current_key
    Application id - mobilesdk_app_id
    Project id - project_id
    GSM sender id - project_number
    4. И не забываем выставить в секцию Entitlement List галочку Receive push notifications.
    После этого все опять начинает работать. 
  14. Like
    gonzales отреагировална Равиль Зарипов (ZuBy) в vkbdhelper - поднятие компонентов над клавиатурой   
    Как пользоваться:
    поместить файл в папку с проектом, прописать в uses желательно в .dpr файле. Всё
  15. Like
    gonzales отреагировална Равиль Зарипов (ZuBy) в vkbdhelper - поднятие компонентов над клавиатурой   
    Привет Всем!
     
    vkbdhelper.pas
     
    Давно пользовался vkbdhelper'ом, но он был только для андроида.
    руки добрались и до этого, теперь его можно использовать и на IOS
     
    изменения
    * почистил uses секцию
    * убрал зависимость от платформ (кросс-платформенный)
    * добавил глобальную переменную VKOffset
     
    VKOffset - расстояние между контролом и клавиатурой
                     для тех случаев когда включены подсказки/автозамена
                     и контрол оказывается под доп. панелькой
     
    Не все клавиатуры включают доп. панели в свой размер!
    Например для IOS нужно всегда прибавлять 30-32 пикселя, панель с кнопкой Done перекрывает контрол
    {$IFDEF IOS} VKOffset := 31; {$ELSE} VKOffset := 0; // на свой вкус // не знаю как определить размер доп. панельки // когда она не входит в размер клавиатуры // и определить есть ли панелька вообще... {$ENDIF} vkbdhelper.zip
  16. Like
    gonzales получил реакцию от Ingalime в на Android 11 приложение не видно в списке открытых   
    Удалил какие-то приложения (удалял сразу несколько, поэтому не могу сказать точно, какие) и все заработало?
  17. Thanks
    gonzales получил реакцию от Ingalime в Рабочая комбинация программ для публикации в AppStore   
    Оставлю здесь полезную информацию. Если при добавлении сертификата в связку ключей у Вас, как у меня появляется ошибка сертификата "Сертификат ненадежен", то проблема решается следующим образом
     
  18. Thanks
    gonzales отреагировална Andrey Efimov в Прощай, APK. Google переходит на новый формат Android-приложений   
    Android App Bundle Support
  19. Like
    gonzales получил реакцию от Ingalime в Прощай, APK. Google переходит на новый формат Android-приложений   
    Ну вот и приехали((
    https://4pda.to/2021/06/30/387350/proschaj_apk_google_perekhodit_na_novyj_format_android_prilozhenij/
     
    Генерация Android App Bundle появилась только в 10.4.2, но работает криво. У меня не подтянулись доп. библиотеки, криво работает TListboxItem, возможно еще есть какие-то косяки. 
    Но тем не менее советую уже сейчас посматривать в сторону перехода на новую версию
     
     
  20. Like
    gonzales получил реакцию от Ingalime в IOS и Push. На иконке в IOS всегда стоит ЕДИНИЧКА - как убрать ?   
    У меня исчезает при запуске приложения.
    А вообще, если Вы пользовались примером Равиля для отправки пуша, то в нем функция, в ней параметр badge отвечает за цифру
    function pushSend($title, $text, $tokens, $server_key) { $url = 'https://fcm.googleapis.com/fcm/send'; $headers = array('Authorization: key=' . $server_key, 'Content-Type: application/json'); if (is_array($tokens)) $fields['registration_ids'] = $tokens; else $fields['registration_ids'] = array($tokens); $fields['priority'] = 'high'; $badge = 1; $fields['notification'] = array('body' => $text, 'title' => $title, 'sound' => 'default', 'badge' => $badge); $fields['data'] = array('message' => $text, 'title' => $title); $jsonfields = json_encode($fields); print_r($jsonfields); $ch = curl_init(); curl_setopt_array($ch, array( CURLOPT_URL => $url, CURLOPT_POST => true, CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_SSL_VERIFYHOST => 0, CURLOPT_SSL_VERIFYPEER => false, CURLOPT_POSTFIELDS => json_encode($fields) )); $result = curl_exec($ch); curl_close($ch); if ($result === false) return false; $json = json_decode($result, true); if ($json['success'] == 0) return false; else return true; }  
  21. Haha
    gonzales отреагировална slav_z в LSP Server for Delphi   
    Оставил без присмотра IDE 10.4.2 на 2 часа... возвращаюсь, смотрю:  комп гудит... выгрузил IDE...но это осталось и уже полчаса что-то пытается делать... вот не дурак?

     
    не знаю..  временами уже хочется дать программистам (маркетологам?) embarcadero пизд*юлей..  терпения нет уже...  а по модулям в uses так и не переходит.... хоть и говорят что исправили... даже хуже стало...  похоже скоро вообще без отладки оставят... "на ощупь" программы пишу уже... как в блокноте... рассылки их дурацкие..  книги-пустышки бесплатные... вебинары ни о чем... хоть бы что-нибудь путное было... толку от их разработчиков-пенсионеров "марко канту" которые ничего не делают для сообщества... все!!! все компоненты содержат серьезные ошибки и недоработки.. ВСЕ!!!!! 10 лет фреймворку FMX!!! каждый день как на битву... с у к а...
  22. Like
    gonzales отреагировална slav_z в Canvas GPU Alpha+Opacity   
    для GPU (Android и iOS) неверно работает установка цвета при следующих условиях: Rectangle.Fill.Color:=$3CF865F7 и Rectangle.Opacity=0.5 (одновременно установить цвет элемента с альфа-каналом < $FF и прозрачностью элемента < 1).
    Это может понадобиться, к примеру, для анимации "исчезающего" элемента. Ошибке много лет... исправляется внесением изменений в исходный код модуля FMX.Canvas.GPU.pas (необходимо скопировать модуль FMX.Canvas.GPU.pas к себе в проект и внести изменения ).
    Оригинальный код:

    Исправленный код:

  23. Thanks
    gonzales отреагировална krapotkin в Delphi 10.4.2 и Андроид 10   
    <AndroidSDK>\Tools\monitor.bat
  24. Haha
    gonzales отреагировална krapotkin в Delphi 10.4.2 и ComboBox   
    в кб текстовые итемы и listBoxItems хранятся раздельно
    и видимо, прямая связь - создание итемов по тексту - осталась, а обратная - потерялась в какой то переделке)
  25. Like
    gonzales получил реакцию от Astin Wolfone в поломались ПУШи в 10.4   
    Нашел причину,
    В недрах класса TPushService
    TPushService = class abstract public type TPropPair = TPair<string, string>; TPropArray = TArray<TPropPair>; // commonly used names TServiceNames = record public const GCM = 'gcm'; // deprecated 'Is not available anymore. Please use FCM instead'; // Google cloud messaging FCM = 'fcm'; // Google Firebase cloud messaging APS = 'aps'; // Apple end; Соответственно нужно исправить
    FPushService := TPushServiceManager.Instance.GetServiceByName(TPushService.TServiceNames.GCM);
    на
    FPushService := TPushServiceManager.Instance.GetServiceByName(TPushService.TServiceNames.FCM);
     
    Все работает
×
×
  • Создать...