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

HelleR

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

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

  • Посещение

Сообщения, опубликованные HelleR

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

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

       

    grid.png

  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 репозитории

    Далее я добавил библиотеку в проект, и приступил к созданию файла моста, для связи 

     

    Screenshot_1.jpg.06cc15edf43e9e8c44962f28712cc063.jpg

    Вот сама библиотека: 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 пользователь

    Screenshot_4.thumb.jpg.a31ee3d90cc969a973fd71d220fd02db.jpg

     

    +2 события

    Screenshot_5.thumb.jpg.628b6982051cf69f91ef64854e10c933.jpg

     

     

     

  4. Добрые люди подсказали, что GAv4 это совсем не GA4 Firebird, f 4 -ая версия универсальной аналитики, которая мне не подойдет, так как мне нужна аналитика только для приложений. А библиотеки под Firebase нет, только gradle...

  5. Добрый день.

    Я пытаюсь отправить события из написанного на 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 я не понял. 

    Буду рад любым мыслям, спасибо.

     

  6. Добрый день. 

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

×
×
  • Создать...