当前位置: 首页 > 知识库问答 >
问题:

在Delphi 10.4.2中使用Google Analytics GA4

华良平
2023-03-14

我正在尝试将事件从我的移动应用程序发送到Google Analytics。已连接外部库:com-google-android-gms.play-services-analytics-impl.16.0.8.jarandroidapi.jni.playservices

启动应用程序后,我得到以下内容。

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" />     

要使用Java类,可以使用以下类com-google-android-gms.play-services-analytics-impl.16.0.8.jar:

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.

但没有数据用于分析。图书馆有可能已经过时了。但是如何下载一个新的,我不知道,在SDK的描述中有一个选项,只与Gradle工作。据我所知,这在德尔福是不可能的。我会等待任何建议。

共有1个答案

湛玄裳
2023-03-14

在文件里翻了一圈之后。GoogleAnalytics我发现了这个。

此代码用于通用分析,而不是GA4,因此,如果您试图使用此代码向GA4发送数据,它将不起作用。

package com.example;

 class MyApp extends Application {
   public static GoogleAnalytics analytics;
   public static Tracker tracker;

   @Overwrite
   public void onCreate() {
     analytics = GoogleAnalytics.getInstance(this);
     analytics.setLocalDispatchPeriod(1800);

     tracker = analytics.newTracker("UA-000-1"); // Replace with actual tracker id
     tracker.enableExceptionReporting(true);
     tracker.enableAdvertisingIdCollection(true);
     tracker.enableAutoActivityTracking(true);
   }
 }

我给团队打了个电话,看看是否有一个GA4版本。

 类似资料:
  • 我一直试图获得一个简单的web操作来向API发出一个经过身份验证的get请求(我已经从示例代码中删除了实际的url和秘密)。 我已经在本地成功地运行了这一点,但是当我测试web动作时,它只是在记录“调用Axios”之后死亡。 它不会报告错误,我尝试实现一个承诺,认为线程在api响应之前就结束了,但没有效果。有什么线索吗?

  • 问题内容: 我想使用Android Studio使用Gradle构建工具开发应用程序。我无法在上插入存储库和库。我的文件如下: 如何在项目中添加OpenCV? 问题答案: 您可以在Android Studio中轻松完成此操作。 请按照以下步骤将Open CV作为库添加到您的项目中。 libraries在项目主目录下创建一个文件夹。例如,如果您的项目是OpenCVExamples,则将创建一个Ope

  • 我想使用Android Studio开发一个应用程序使用Gradle构建工具。我无法在上插入OpenCV repo和库。我的文件如下所示: 我如何在我的项目中添加OpenCV?

  • 问题内容: 我有一个简单的Entitly类,(和单独类中的字段)。然后,我使用Spring Data()访问数据库(MySql),使用常规ID,查询可以正常工作,无论是Spring生成的查询还是我自己编写的查询。与我没有设法创建正确的查询。我想做的是选择所有id(发生某些情况的EmbeddedId字段之一),这里有一些代码示例,也许有人会知道如何解决它。 实体类: EmbeddedId类: 和存储

  • 问题内容: 我正在研究控制建筑物的光和热的项目。后端(用Java编写)将在Mac Mini上运行,并且应该可以通过SOAP进行访问。 我希望将此项目的复杂性降至最低,因为我不希望每个使用它的人都必须设置应用程序服务器。所以到目前为止,我一直使用javax.xml.ws.Endpoint: 这样的效果出奇的好(嘿,您什么时候最后一次只用3行代码看到Java中的东西?),但是现在我正在寻找一种使用HT

  • 问题内容: 我想使用系统蜂鸣器(并且只有在没有蜂鸣器/无法访问蜂鸣器时才使用扬声器)生成具有特定频率和长度(针对不同的声音信号)的蜂鸣声。我知道可以通过使用ioctl来做到这一点,但这需要root访问权限,而这是我所不希望的。 我知道我可以只使用“ beep”命令,但这将是一个依赖关系,如果可能的话,不应使用它(根本没有外部依赖关系,只有基本的linux库和C)。 我目前拥有的是以下代码(但这需要

  • 问题内容: 我有一个使用100%Java编写的大型现有代码库,但是我想在它的一些新部分中使用Python。我需要进行一些文本和语言处理,而我宁愿使用Python和类似NLTK的库来执行此操作。 我知道Jython项目,但这似乎代表了一种从Python内部使用Java及其库的方法,而不是相反的方式-我对此是否错? 如果没有,那么在Java和Python之间进行交互的最佳方法是什么,这样(理想情况下)

  • 问题内容: Go 的用途是什么?语言文档说它在周围的函数返回时执行。为什么不将代码放在给定函数的末尾? 问题答案: 我们通常用来关闭或释放资源。 周围的函数会在返回之前执行所有延迟的函数调用,即使它会慌乱。如果仅将函数调用放在周围函数的末尾,则在发生紧急情况时将跳过该调用。 而且,延迟函数调用可以通过调用内置函数来处理紧急情况。这不能通过函数结尾处的普通函数调用来完成。 每个延迟的调用都放在堆栈中