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

HelleR

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

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

  • Посещение

Посетители профиля

Блок последних пользователей отключён и не показывается другим пользователям.

  1. Спасибо за ответ. Попробовал по вашему совету: Canvas.FillText(TextRect, Value.ToString, false, 100, [TFillTextFlag.RightToLeft],TTextAlign.Center, TTextAlign.Leading); Не понятно зачем Opacity = 100 в примере helpe В данном случае все работало, как и прежде. Проблема осталась прежняя, написать новую надпись получается, в любом стиле и цвете, а вот старую область затереть, корректно не получалось: Canvas.ClearRect(TextRect, 0); На Windows работает как надо, на маке рисует бекраунд непонятного цвета. FillRect под Win тоже все красиво затирает прежним цветом, но под Mac тоже цвет неправильный. Пробовал обработку DrawColumnBackground - все также. Решил, убрав DefaultDrawing в false; и перерисовав все ячейки, не трогая отрисовку фона. Теперь все ок, и при смене стилей и на всех платформах.
  2. Добрый день. Подскажите пожалуйста, есть приложение fmx для win и osX . Надо немного изменить текст на TStringGrid, например вывести текст более серым. На Windows все выглядит хорошо, но на osX исчезает прозрачность области под текстом. На фото слева win справа osX, если отключить опцию чередования строк, проблема остается. if Column = sc_Number then begin OldColor:= 0; TextRect:= Bounds; TextRect.Left := TextRect.Left; TextRect.Bottom := TextRect.Bottom; TextRect.Inflate(-HorzTextMargin, -VertTextMargin); //Canvas.FillRect(TextRect, 0, 0, AllCorners, 1); // При очистке области, если второй параметр 0 или отсутствует, должен закрасится цветом до перерисовки Canvas.ClearRect(TextRect, OldColor); TextLayout := TTextLayoutManager.DefaultTextLayout.Create; try TextLayout.BeginUpdate; try TextLayout.WordWrap:= False; TextLayout.Opacity:= Column.AbsoluteOpacity; TextLayout.Trimming := TTextTrimming.Character; TextLayout.TopLeft := TextRect.TopLeft; TextLayout.Text := Value.ToString; TextLayout.MaxSize:= PointF(TextRect.Width, TextRect.Height); TextLayout.Font.Family := 'Arial'; TextLayout.Font.Size:= 12; TextLayout.Color:= claGray; finally TextLayout.EndUpdate; end; TextLayout.RenderLayout(Canvas); finally TextLayout.Free; end; end; При очистке области, [ Canvas.ClearRect(TextRect, OldColor) ] если второй параметр 0 или отсутствует, должен закрасится цветом до перерисовки. Под Windows все работает нормально, но osX ставит туда другой цвет. Можно вручную указать цвет, но если стилей будет несколько, то прийдется это делать под каждый стиль. Если у кого есть мысли как исправить, буду очень признателен.
  3. Подключить Firebase не получилось. Напишу по памяти, так как время прошло уже прилично и это мои собственные умозаключения не претендующие на истину. Было много различных попыток подключить Firebase , основная проблема, что нет в наличии библиотеки jar, последняя библиотека лежит в maven репозитории и она уже устарела, по-моему от 2019 года. Ссылка на maven репозиторий Firebase, да и многие другие предлагают использовать только Gradle, что не дает мне возможность использовать это для Delphi . После общения с поддержкой от Firebase (если сильно упростить), мне предложили изменить среду разработки. Но приложение уже было полностью готово для двух мобильных платформ, и мне пришлось искать другие SDK. Я перебрал многие, которые предлагали помимо установки с помощью Gradle, скачать SDK в виде файла jar или aar (из aar иногда можно добыть jar, но это только иногда, например в последних firebase его там нет) Забыл сказать, что для всех манипуляций, обязательно нужна установленная и запущенная Android Studio, и подключенный телефон, на который Delphi устанавливает приложение. В Android Studio я собрал проект с таким же именем, как и у моего Delphi приложения, для удобства отладки и контроля логов logcat. В приложение на Android Studio я подключил через Gradle нужное мне SDK и проверил его работоспособность, скопировал логи правильной работы приложения, отследил результаты на сайте аналитики, увидел что они действительно появились, и все данные телефона (размер экрана, марка ...) пришли в аналитику. Включил режим debag на стороне аналитики. Эти действия я проделывал и с Firebase, приложение написанное на Android Studio запускалось без проблем, приложение написанное на Delphi, в силу отсутствия новой библиотеки jar не запускалось и сыпало в logcat целые "простыни" ошибок, никакие данные в аналитику не приходили. Я пробовал вытащить нужную мне библиотеку Firebase из собранного в Android Studio dex файла, рабочего приложения. Затем вычленить из него нужные мне файлы и прикрепить их Delphiпроекту в виде jar библиотеки, но появлялась новая проблема, конфликты с уже установленными библиотеками на Delphi, отключение которых уже не позволяло собрать dex файл для Delphi проекта. Остановился я на SDK AppsFlyer, интеграция была возможна, так как сервис предлагал добавление SDK с помощью Gradle и возможность скачать и установить вручную. Саму библиотеку я подключил, но возникла проблема с получением событий, которые приходили например от google play Вот пример того что не получилось сделать: AppsFlyerConversionListener conversionListener = new AppsFlyerConversionListener() { @Override public void onConversionDataSuccess(Map<String, Object> conversionData) { for (String attrName : conversionData.keySet()) { Log.d("LOG_TAG", "attribute: " + attrName + " = " + conversionData.get(attrName)); } } Эти события, никак не удалось получить, и решить проблему не удалось, информации я не нашел. Было принято решение попробовать другое SDK. На этот раз это была Yandex AppMetrica, эта интеграция получилась. Для начала у них в доках по интеграции написано что есть возможность скачать jar и что все библиотеки (старые версии мне в дальнейшем тоже пригодились) есть в maven репозитории Далее я добавил библиотеку в проект, и приступил к созданию файла моста, для связи Вот сама библиотека: com.yandex.androidmobmetricalib3.20.1.jar.7z Файл мост я создавал с помощью утилиты java2op, которая находится в ... Embarcadero\Studio\21.0\bin\converters Но, при создании я получил ошибку, что-то там дублировалось и что-то мешало. Пытался проделать это с конкретным классом, но ничего не получилось. Оставалось только или делать файл ручками, или надеяться что в одной из старых библиотек все сгенерируется. Эмпирическим методом была найдена старая библиотека, в которой название методов нужного мне класса осталось прежним, а ошибка с дубликатами ушла. Файл мост был создан. Android.JNI.Yandex.pas.7z Осталось подключить его к моему приложению. Был создан класс, который работал с нужными мне методами SDK Yandex аналитики (Android.JNI.Yandex): unit YandexAnalytics; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, {$IFDEF ANDROID} Android.JNI.Yandex, Androidapi.Helpers, Androidapi.JNI.JavaTypes, Androidapi.JNI.GraphicsContentViewText, Androidapi.JNI.Os, Androidapi.JNI.App, {$ENDIF} FMX.Types; type TYandexMetrica = class private public {$IFDEF ANDROID} YAC : JYandexMetricaConfig; YA : JYandexMetrica; {$ENDIF} constructor Create; procedure SendEvent(Category, Action, LabelName : String; LabelValue : Integer); end; implementation constructor TYandexMetrica.Create; var AnKey, AnRepKey : JString; begin try AnKey := StringToJString('86e64a77-XXXX-XXXX-XXXX-XXXXXXXcbbc'); AnRepKey := StringToJString('20799a27-XXXX-XXXX-XXXX-XXXXXXX14180'); YAC := TJYandexMetricaConfig.JavaClass.newConfigBuilder(AnKey).withLogs().build; YA := TJYandexMetrica.Create; TJYandexMetrica.JavaClass.activate(TAndroidHelper.Context, YAC); TJYandexMetrica.JavaClass.enableActivityAutoTracking( TAndroidHelper.Activity.getApplication ); Log.d('================= TYandexMetrica.Created ======================'); EXCEPT on E : Exception do Begin Log.d( E.ClassName + 'YandexMetrica.Create -> ' + E.Message ); End; END; end; procedure TYandexMetrica.SendEvent(Category, Action, LabelName : String; LabelValue : Integer); begin {$IFDEF ANDROID} try Log.d( 'TRY YandexMetrica.SendEvent -> ' + Category + ',' + Action + ',' + LabelName + ',' + LabelValue.ToString ); TJYandexMetrica.JavaClass.reportEvent(StringToJString(Category), StringToJString('{"Action":"' + Action + '", "LabelName":"' + LabelName + '", "LabelValue":"' + LabelValue.ToString + '"}')); Log.d('================= Event Sended ======================'); EXCEPT on E : Exception do Begin Log.d( E.ClassName + 'YandexMetrica.SendEvent -> ' + E.Message ); End; END; {$ENDIF} end; end. В событии приложения onCreate создал экземпляр класса, и отправил событие YA := TYandexMetrica.Create; YA.SendEvent('AppEvent','Started',User.Client_Id, 0); Было добавлено в файл AndroidManifest.template.xml (информация из яндекс документов по интеграции) <%services%> <service android:name="com.yandex.metrica.MetricaService" android:enabled="true" android:exported="true" android:process=":Metrica"> <intent-filter> <category android:name="android.intent.category.DEFAULT" /> <action android:name="com.yandex.metrica.IMetricaService" /> <data android:scheme="metrica" /> </intent-filter> <meta-data android:name="metrica:api:level" android:value="16" /> </service> <receiver android:name="com.yandex.metrica.MetricaEventHandler" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="com.yandex.metrica.intent.action.SYNC" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.PACKAGE_ADDED" /> <action android:name="android.intent.action.PACKAGE_DATA_CLEARED" /> <data android:scheme="package" /> </intent-filter> <!-- Необходимо для трэкинга кампаний --> <intent-filter> <action android:name="com.android.vending.INSTALL_REFERRER" /> </intent-filter> </receiver> Пример логов из logcat, из которых видно что библиотека инициализирована, и отправлены два события [AppEvent] и [Balance] 2021-07-01 14:02:17.108 15138-15168/? I/AppMetrica: [ru.yandex.mobile.appmetrica] : [27889a6e-xxxx-xxxx-xxxx-xxxxxxxx3c64] Initializing of Metrica, Release type, Version 3.5.3, API Level 76, Dated 30.01.2019. 2021-07-01 14:58:48.979 18460-18460/? I/AppMetrica: Initializing of Metrica, Release type, Version 3.20.1, API Level 94, Dated 14.04.2021. 2021-07-01 14:58:49.033 18460-18531/? I/AppMetrica: Activate AppMetrica with APIKey 86e64a77-xxxx-xxxx-xxxx-xxxxxxxxcbbc 2021-07-01 14:58:49.033 18460-18531/? I/AppMetrica: [com.soclikes_ig] : [86e64a77-xxxx-xxxx-xxxx-xxxxxxxxcbbc] Enable activity auto tracking 2021-07-01 14:58:49.033 18460-18531/? I/AppMetrica: [com.soclikes_ig] : [86e64a77-xxxx-xxxx-xxxx-xxxxxxxxcbbc] Event received: AppEvent. With value: {"Action":"Started", "LabelName":"2905202123125", "LabelValue":"0"} 2021-07-01 14:58:49.034 18460-18531/? I/AppMetrica: Activate reporter with APIKey 20799a27-xxxx-xxxx-xxxx-xxxxxxxx4180 2021-07-01 14:58:49.233 18542-18567/? I/AppMetrica: Initializing of Metrica, Release type, Version 3.20.1, API Level 94, Dated 14.04.2021. 2021-07-01 14:58:49.263 18542-18567/? I/AppMetrica: Activate reporter with APIKey 20799a27-xxxx-xxxx-xxxx-xxxxxxxx4180 2021-07-01 14:59:13.975 18460-18531/? I/AppMetrica: [com.soclikes_ig] : [86e64a77-xxxx-xxxx-xxxx-xxxxxxxxcbbc] Event received: AppEvent. With value: {"Action":"ProfilesDeleted", "LabelName":"alex", "LabelValue":"319"} 2021-07-01 14:59:31.368 18460-18531/? I/AppMetrica: [com.soclikes_ig] : [86e64a77-xxxx-xxxx-xxxx-xxxxxxxxcbbc] Event received: Balance. With value: {"Action":"TrStart", "LabelName":"2905202123125", "LabelValue":"3"} Вот такие данные пришли в аналитику. +1 пользователь +2 события
  4. P.S. Приведенный выше класс, вполне рабочий для универсальной гугл аналитики.
  5. Добрые люди подсказали, что GAv4 это совсем не GA4 Firebird, f 4 -ая версия универсальной аналитики, которая мне не подойдет, так как мне нужна аналитика только для приложений. А библиотеки под Firebase нет, только gradle...
  6. Добрый день. Я пытаюсь отправить события из написанного на Delphi 10.4.2 приложения в Firebase Google Analytics [ GAv4 ] Пытался работать по инструкции предложенной в посте, но пришлось переделать. Использую com-google-android-gms.play-services-analytics-impl.16.0.8.jar и обвертку Androidapi.JNI.PlayServices После запуска в логах приходит следующее: 04-23 15:03:50.835 30878 30878 I GAv4 : Google Analytics 12.4.51 is starting up. To enable debug logging on a device run: 04-23 15:03:50.835 30878 30878 I GAv4 : adb shell setprop log.tag.GAv4 DEBUG 04-23 15:03:50.835 30878 30878 I GAv4 : adb logcat -s GAv4 04-23 15:03:50.869 30878 30878 D GAv4 : setLocalDispatchPeriod (sec): 5 04-23 15:03:51.506 30878 30986 D GAv4 : Sending first hit to property: 269XX9293 04-23 15:03:51.508 30878 30986 D GAv4 : Hit delivery requested: ht=1619179430868, _s=0, _v=ma12.4.51, a=2027768350, adid=7b03fae1-XXXX-4820-892a-ba3983eb6b7e, aid=com.XXXXXXX, an=XXXXXXX, ate=1, av=1.0.1, cid=24213dea-e355-XXXX-8b91-17087584684a, ea=lo gin, ec=login, el=login, ev=87, sr=1080x2030, t=event, tid=269XX9293, ul=ru-ru, v=1 04-23 15:03:51.737 30878 30986 D GAv4 : Hit sent to the device AnalyticsService for delivery Добавил в AndroidManifest.xml <receiver android:name="com.google.android.gms.analytics.AnalyticsReceiver" android:enabled="true"> <intent-filter> <action android:name="com.google.android.gms.analytics.ANALYTICS_DISPATCH" /> </intent-filter> </receiver> <service android:name="com.google.android.gms.analytics.AnalyticsService" android:enabled="true" android:exported="false"/> <!-- Optionally, register CampaignTrackingReceiver and CampaignTrackingService to enable installation campaign reporting --> <receiver android:name="com.google.android.gms.analytics.CampaignTrackingReceiver" android:exported="true"> <intent-filter> <action android:name="com.android.vending.INSTALL_REFERRER" /> </intent-filter> </receiver> <service android:name="com.google.android.gms.analytics.CampaignTrackingService" /> unit GoogleAnalytics; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, {$IFDEF ANDROID} Androidapi.JNI.PlayServices, Androidapi.Helpers, Androidapi.JNI.JavaTypes, Androidapi.JNI.GraphicsContentViewText, {$ENDIF} FMX.Types; type TwGoogleAnalytics=class private FCollectDataPermission : boolean; FGoogleAppId, fClient_Id : String; {$IFDEF ANDROID} FTracker : Janalytics_Tracker; FGoogleAId, JClient_Id : JString; {$ENDIF} public {$IFDEF ANDROID} JGA : Janalytics_GoogleAnalytics; property CollectDataPermission: boolean read FCollectDataPermission write FCollectDataPermission; {$ENDIF} constructor Create; procedure SetParams(const aGoogleAppID, aClient_Id:string); property GoogleAppId:string read FGoogleAppId; end; implementation constructor TwGoogleAnalytics.Create; begin FGoogleAppId := ''; fClient_Id := ''; end; procedure TwGoogleAnalytics.SetParams(const aGoogleAppID, aClient_Id : String); var Map1 : JMap; Hit : JHitBuilders_HitBuilder; EventHit : JHitBuilders_EventBuilder; Loger : Janalytics_Logger; begin {$IFDEF ANDROID} CollectDataPermission := true;//(Ini.CollectDataPermission = PERMISSION_YES); JGA := TJanalytics_GoogleAnalytics.JavaClass.getInstance( TAndroidHelper.Context ); JGA.setDryRun(false); JGA.reportActivityStart( SharedActivity ); FGoogleAId := StringToJString(aGoogleAppID); JClient_Id := StringToJString(aClient_Id); FTracker := JGA.newTracker(FGoogleAid); if FTracker <> nil then Begin FTracker.enableAutoActivityTracking(true); FTracker.enableAdvertisingIdCollection(true); EventHit:= TJHitBuilders_EventBuilder.Create; EventHit.setAction(StringToJString('login')); EventHit.setCategory(StringToJString('login')); EventHit.setLabel(StringToJString('login')); EventHit.setValue(87); Map1 := EventHit.build; FTracker.send(Map1); JGA.setLocalDispatchPeriod(5); End; {$ENDIF} FGoogleAppId:=aGoogleAppID; end; ... end. Но никакой информации в аналитику не приходит. Из описания наверняка не понятно что передается в параметре TrackingId (tid) поэтому передавал туда, все что было в google-services.json (перебирал варианты) и также идентификатор потока и id ресурса гугл аналитики. Возможно библиотека из дистрибутива delphi 10.4.2 [ com-google-android-gms.play-services-analytics-impl.16.0.8.jar ] устарела, а как обновить до 17.4.1 я не разобрался, везде предлагают gradle, но как получить в итоге jar я не понял. Буду рад любым мыслям, спасибо.
  7. Добрый день. Есть готовое приложение, но для его продвижения, нужно добавить аналитику, желательно Firebase. Или любую другую, из которой можно передать данные о конверсии в google рекламу. Разработано на Delphi 10.4.2, в списке подключенных библиотек есть: - com-google-firebase.firebase-analytics.16.4.0.dex.jar - com-google-android-gms.play-services-analytics-impl.16.0.8.dex.jar - com-google-android-gms.play-services-analytics.16.0.8.dex.jar Пытался реализовать как было предложено выше, но не получается. Во время компиляции unit GoogleAnalytics; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, {$IFDEF ANDROID} Androidapi.JNI.Analytics, Androidapi.Helpers, Androidapi.JNI.JavaTypes, // androidapi.JNI.Os, Androidapi.JNI.GraphicsContentViewText, {$ENDIF} FMX.Types; type /// вспомогат. класс для работы с GoogleAnalytics - только андроид! TwGoogleAnalytics=class private FCollectDataPermission: boolean; FGoogleAppId : String; {$IFDEF ANDROID} FTracker : JTracker; FGoogleAId : JString; {$ENDIF} public {$IFDEF ANDROID} JGA : JGoogleAnalytics; property CollectDataPermission: boolean read FCollectDataPermission write FCollectDataPermission; {$ENDIF} constructor Create; procedure SetParams(const aGoogleAppID:string); /// procedure SendControl(const aCtrlDesc:string); procedure SendEvent(const aCat,aAction,aLabel:string; aGValue:Integer); procedure SendException(const aExMessage:string; aFatalFlag:Boolean=false); /// property GoogleAppId:string read FGoogleAppId; end; {var Tr:JTracker; JGA:JGoogleAnalytics; begin implementation constructor TwGoogleAnalytics.Create; begin FGoogleAppId := ''; end; procedure TwGoogleAnalytics.SetParams(const aGoogleAppID:string); begin {$IFDEF ANDROID} CollectDataPermission := true;//(Ini.CollectDataPermission = PERMISSION_YES); // Ошибка, не найден класс Exception class EJNI with message 'Java type JGoogleAnalytics could not be found' // в Androidapi.JNIBridge JGA := TJGoogleAnalytics.JavaClass.getInstance( TAndroidHelper.Context ); /// FGoogleAId := StringToJString(aGoogleAppID); FTracker := JGA.getTracker(FGoogleAid); /// JGA.setDefaultTracker(FTracker); JGA.setDebug(true); /// {$ENDIF} FGoogleAppId:=aGoogleAppID; end; procedure TwGoogleAnalytics.SendControl(const aCtrlDesc:string); begin {$IFDEF ANDROID} FTracker.setAppScreen(StringToJString(aCtrlDesc)); FTracker.sendView; {$ENDIF} end; procedure TwGoogleAnalytics.SendEvent(const aCat,aAction,aLabel:string; aGValue:Integer); begin {$IFDEF ANDROID} FTracker.sendEvent(StringToJString(aCat), StringToJString(aAction),StringToJString(aLabel), TJLong.JavaClass.init(aGValue)); {$ENDIF} end; procedure TwGoogleAnalytics.SendException(const aExMessage:string; aFatalFlag:Boolean=false); begin {$IFDEF ANDROID} FTracker.sendException(StringToJString(aExMessage),aFatalFlag); {$ENDIF} end; end. procedure TForm1.FormCreate(Sender: TObject); begin GA := TwGoogleAnalytics.Create; GA.SetParams('xxx2392xx'); .......... end; Во время выполнения ошибка возникает в Androidapi.JNIBridge // Ошибка, не найден класс Exception class EJNI with message 'Java type JGoogleAnalytics could not be found' // в Androidapi.JNIBridge JGA := TJGoogleAnalytics.JavaClass.getInstance( TAndroidHelper.Context ); Связующий модуль Androidapi.JNI.Analytics подключен, искомый интерфейс есть. JGoogleAnalytics = interface;//com.google.analytics.tracking.android.GoogleAnalytics По всей видимости нет данных в самой библиотеке. Прошу помочь, или любые мысли в направлении как подключить аналитику. Есть библиотека firebase, но непонятно как работать с ее аналитикой. Firebase Push уведомления подключены и работают.
×
×
  • Создать...