【问题标题】:Using Google Analytics To Track Fragments使用 Google Analytics 跟踪片段
【发布时间】:2013-02-14 20:38:59
【问题描述】:

只需要知道实施 Google 分析以实时跟踪用户何时在片段上的正确方法,这就是现在所做的

@Override
public void onResume() {
    super.onResume();
    Tracker myTracker = parentActivity.getTracker();
    myTracker.setCustomMetric(1, (long) 1);               
    myTracker.sendView("Music View"); 
}

getTracker 类在我的主要活动中,只返回主要活动中的跟踪器实例

任何帮助将不胜感激!

【问题讨论】:

    标签: java android google-analytics


    【解决方案1】:

    Mochini 的回答使用 Google Analytics V2。您可以在下面看到如何在 V4 和 V3 上执行此操作:

    • V4

    应用:

    public class YourApplication extends Application
    {
        public synchronized Tracker getTracker() {
    
            try {
                final GoogleAnalytics googleAnalytics = GoogleAnalytics.getInstance(this);
                return googleAnalytics.newTracker(R.xml.analytics);
    
            }catch(final Exception e){
                Log.e(TAG, "Failed to initialize Google Analytics V4");
            }
    
            return null;
        }
    }
    

    res/xml/analytics.xml(可以随便命名,不需要叫“analytics”)

    <?xml version="1.0" encoding="utf-8" ?>
    <resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="TypographyDashes">
    
      <!--Replace placeholder ID with your tracking ID-->
      <string name="ga_trackingId">UA-XXXXXXXX-X</string>
    
      <!--Enable automatic activity tracking-->
      <bool name="ga_autoActivityTracking">true</bool>
    
      <!--Disable automatic exception tracking-->
      <bool name="ga_reportUncaughtExceptions">false</bool>
    
    </resources>
    

    build.gradle:

    compile 'com.google.android.gms:play-services:7.3.0'
    

    片段超类:

    public abstract class TrackedFragment extends Fragment{
    
        @Override
        public void onResume() {
    
            super.onResume();
    
            final Tracker tracker = yourApplicationInstance.getTracker();
            if(tracker != null){
    
                tracker.setScreenName(getClass().getSimpleName());
                tracker.send(new HitBuilders.ScreenViewBuilder().build());
            }
        }
    }
    
    • V3

      import android.os.Bundle;
      import android.support.v4.app.Fragment;
      
      import com.google.analytics.tracking.android.EasyTracker;
      import com.google.analytics.tracking.android.Fields;
      import com.google.analytics.tracking.android.MapBuilder;
      import com.google.analytics.tracking.android.Tracker;
      
      public abstract class TrackedFragment extends Fragment{
      
           private Tracker tracker;
      
           @Override
           public void onActivityCreated(final Bundle savedInstanceState) {
      
               super.onActivityCreated(savedInstanceState);
      
               this.tracker = EasyTracker.getInstance(getActivity());
           }
      
           @Override
           public void onResume() {
      
               super.onResume();
      
               this.tracker.set(Fields.SCREEN_NAME, getClass().getSimpleName());
               this.tracker.send( MapBuilder.createAppView().build() );
           }
      }
      

    来源:https://developers.google.com/analytics/devguides/collection/android/v3/migration

    【讨论】:

    • getActivity() 将在片段的onCreate() 中返回 null。跟踪器设置可能应该在onActivityCreated() 中完成
    • onStop() 或 onPause() 怎么样?我们是否需要通知 GA 该屏幕不再处于活动状态,或者当另一个屏幕变为活动状态时它会知道吗?
    • 我想它会知道的。如果您查看下面的其他答案,则表明他们正在跟踪 onStop 以返回父屏幕,这可能不是必需的,因为该屏幕有自己的跟踪。
    • 此代码将高估用户在Fragment 上的次数。我会在onActivityCreate(信用:@KyleIvey)中初始化Tracker。如果您的 Fragment 使用 setRetainInstanceState(true),那么我会更进一步,并使用全局变量来阻止您在方向更改、切换应用程序等后发送 MapBuilder
    • 如果使用fragments within a viewpager,这种方法(使用onResume)会产生错误数据;无论单个片段的可见性如何,您的跟踪事件都会在活动加载时立即触发,并且在用户在片段中来回移动时永远不会再次触发。不幸的是,建议的使用 setUserVisibileHint 的解决方法不适用于浏览器之外,因此您通常必须逐个片段地应用解决方案。
    【解决方案2】:

    这是一个使用FragmentActivity 和片段的示例:

    1. 在值文件夹(values/analytics.xml)中创建 XML 文件:

      <?xml version="1.0" encoding="utf-8"?>
      <resources>
      
          <!-- Replace placeholder ID with your tracking ID -->
          <string name="ga_trackingId">XX-xxxxxxxx-x</string>
      
          <!-- Enable Activity tracking -->
          <bool name="ga_autoActivityTracking">true</bool>
      
          <!-- Enable debug -->
          <bool name="ga_debug">true</bool>
      
          <!-- The screen names that will appear in your reporting -->
          <string name="com.example.myapp.FragmentActivity">Fragment activity</string>
      
          <!--
              The inverval of time after all the collected data
              should be sent to the server, in seconds.
          -->
          <integer name="ga_dispatchPeriod">20</integer>
      
      </resources>
      
    2. 在您的 FragmentActivity 类中,添加以下内容:

      @Override
      protected void onStart() {
          super.onStart();
          EasyTracker.getInstance().setContext(this.getBaseContext());
          EasyTracker.getInstance().activityStart(this); // Add this method
      }
      
      @Override
      protected void onStop() {
          super.onStop();
          EasyTracker.getInstance().activityStop(this); // Add this method
      }
      
    3. 在你的包中创建新类:TrackedFragment.java

      public class TrackedFragment extends Fragment {
          private Tracker tracker;
          private String activityId;
          private String fragmentId;
      
          @Override
          public void onCreate(final Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              EasyTracker.getInstance().setContext(getActivity().getApplicationContext());
              this.tracker = EasyTracker.getTracker();
              this.fragmentId = getClass().getSimpleName();
              this.activityId = getActivity().getClass().getSimpleName();
          }
      
          @Override
          public void onResume() {
              super.onResume();
              this.tracker.sendView("/" + this.activityId + "/" + this.fragmentId);
          }
      }
      
    4. 最后,您的片段应该从TrackedFragment 扩展,例如:

      public class NewFragment extends TrackedFragment {
      
          public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
              return inflater.inflate(R.layout.newfragment, null);
          }
      
      }
      

    【讨论】:

    • 旧 API,Tiago 的回答使用较新的 api
    【解决方案3】:

    Tracking methods section建议您只需先调用EasyTracker.getInstance().setContext(getActivity());,然后您可以在“其他类”中使用跟踪器。

    manual screen tracking section 建议您可以使用myTracker.sendView("Home Screen"); 跟踪Fragment 视图

    【讨论】:

      【解决方案4】:

      V3 的另一种方法(因为onResume() 与 Activity 而非 Fragment 相关联。当父/子关系众所周知时,这很有效。

      父片段发送初始事件onStart()

      public class ParentFragment extends Fragment {
          private Tracker mTracker;
      
          @Override
          public void onActivityCreated(Bundle savedInstanceState) {
              super.onActivityCreated(savedInstanceState);
      
              mTracker = EasyTracker.getInstance(getActivity());
          }
      
          @Override
          public void onStart() {
              super.onStart();
      
              mTracker.set(Fields.SCREEN_NAME, "Parent Fragment");
              mTracker.send(MapBuilder.createAppView().build());
          }
      }
      

      子片段覆盖onStart()onStop()

      public class ChildFragment extends Fragment {
          private Tracker mTracker;
      
          @Override
          public void onActivityCreated(Bundle savedInstanceState) {
              super.onActivityCreated(savedInstanceState);
      
              mTracker = EasyTracker.getInstance(getActivity());
          }
      
          @Override
          public void onStart() {
              super.onStart();
      
              mTracker.set(Fields.SCREEN_NAME, "Child Fragment");
              mTracker.send(MapBuilder.createAppView().build());
          }
      
          @Override
          public void onStop() {
              super.onStop();
      
              mTracker.set(Fields.SCREEN_NAME, "Parent Fragment");
              mTracker.send(MapBuilder.createAppView().build());
          }
      }
      

      【讨论】:

        【解决方案5】:

        Tiago 的版本不能在新的 goole analytics v4 中使用。相反,请使用来自Google's docs的代码

        package com.google.android.apps.mobileplayground;
        
        import com.google.android.apps.mobileplayground.AnalyticsSampleApp.TrackerName;
        import com.google.android.gms.analytics.GoogleAnalytics;
        import com.google.android.gms.analytics.HitBuilders;
        import com.google.android.gms.analytics.Tracker;
        
        import android.os.Bundle;
        import android.support.v4.app.Fragment;
        import android.view.LayoutInflater;
        import android.view.View;
        import android.view.View.OnClickListener;
        import android.view.ViewGroup;
        import android.widget.Button;
        
        /**
         * Class to exercise Event hits.
         */
        public class EventFragment extends Fragment {
        
          @Override
          public View onCreateView(LayoutInflater inflater, ViewGroup container,
              Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
        
            View view = inflater.inflate(R.layout.event, container, false);
        
            setupEvent(view, R.id.video1Play, R.string.videoCategory, R.string.videoPlay, R.string.video1);
            setupEvent(view, R.id.video1Pause, R.string.videoCategory, R.string.videoPause,
                R.string.video1);
            setupEvent(view, R.id.video2Play, R.string.videoCategory, R.string.videoPlay, R.string.video2);
            setupEvent(view, R.id.video2Pause, R.string.videoCategory, R.string.videoPause,
                R.string.video2);
        
            setupEvent(view, R.id.book1View, R.string.bookCategory, R.string.bookView, R.string.book1);
            setupEvent(view, R.id.book1Share, R.string.bookCategory, R.string.bookShare, R.string.book1);
        
            final Button dispatchButton = (Button) view.findViewById(R.id.eventDispatch);
            dispatchButton.setOnClickListener(new OnClickListener() {
              @Override
              public void onClick(View v) {
                // Manually start a dispatch (Unnecessary if the tracker has a dispatch interval)
                GoogleAnalytics.getInstance(getActivity().getApplicationContext()).dispatchLocalHits();
              }
            });
            return view;
          }
        
          private void setupEvent(View v, int buttonId, final int categoryId, final int actionId,
              final int labelId) {
            final Button pageviewButton = (Button) v.findViewById(buttonId);
            pageviewButton.setOnClickListener(new OnClickListener() {
              @Override
              public void onClick(View v) {
                // Get tracker.
                Tracker t = ((AnalyticsSampleApp) getActivity().getApplication()).getTracker(
                    TrackerName.APP_TRACKER);
                // Build and send an Event.
                t.send(new HitBuilders.EventBuilder()
                    .setCategory(getString(categoryId))
                    .setAction(getString(actionId))
                    .setLabel(getString(labelId))
                    .build());
              }
            });
          }
        }
        

        【讨论】:

          【解决方案6】:

          使用安卓谷歌分析 v4

          我试过了,效果很好

          引用此https://developers.google.com/analytics/devguides/collection/android/v4/events

          import java.net.URLEncoder;
          import android.os.Bundle;
          import android.support.v4.app.Fragment;
          import android.util.Xml.Encoding;
          import android.view.LayoutInflater;
          import android.view.View;
          import android.view.ViewGroup;
          import android.webkit.WebView;
          import android.widget.ScrollView;
          import android.widget.TextView;
          import com.Blog.gkgyan.AnalyticsSampleApp.TrackerName;
          import com.Blog.gkgyan.parser.RSSFeed;
          import com.google.android.gms.ads.AdRequest;
          import com.google.android.gms.ads.AdView;
          import com.google.android.gms.analytics.GoogleAnalytics;
          import com.google.android.gms.analytics.HitBuilders;
          import com.google.android.gms.analytics.Tracker;
          public class DetailFragment extends Fragment {
              private int fPos;
              RSSFeed fFeed;
              String country;
          
              @Override
              public void onCreate(Bundle savedInstanceState) {
                  super.onCreate(savedInstanceState);
                  fFeed = (RSSFeed)getArguments().getSerializable("feed");
                  fPos = getArguments().getInt("pos");
                  Tracker t = ((AnalyticsSampleApp) getActivity().getApplication()).getTracker(
                          TrackerName.APP_TRACKER);
                      // Build and send an Event.
                      t.send(new HitBuilders.EventBuilder()
                          .setCategory(fFeed.getItem(fPos).getTitle())
                          .setAction("viewpager click")
                          .setLabel("viewpager label")
                          .build());
              }
          
              @Override
              public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
              View view = inflater.inflate(R.layout.detail_fragment, container, false);
                // Initializr views
                  TextView title = (TextView)view.findViewById(R.id.title);
                  WebView desc = (WebView)view.findViewById(R.id.desc);
                  // Enable the vertical fading edge (by default it is disabled)
                  ScrollView sv = (ScrollView)view.findViewById(R.id.sv);
                  sv.setVerticalFadingEdgeEnabled(true);
          
                  // Set the views
                  desc.getSettings().setJavaScriptEnabled(true);
                  title.setText(fFeed.getItem(fPos).getTitle());
          
                  country = "<html xmlns=\"http://www.w3.org/1999/xhtml\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=iso-8859-1\"><style type=\"text/css\">p{text-align:justify;font-size:125%;}</style></head><body>" + "<p>" + fFeed.getItem(fPos).getDescription()+"</p>"+"</body></html>";
                  //desc.loadData( country, "text/html", "UTF-8");
                  //desc.loadData( country,  "text/html; charset=utf-8", "utf-8");
                  desc.loadData( URLEncoder.encode(country).replaceAll("\\+", " "), "text/html", Encoding.UTF_8.toString());
                  return view;
                }
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-09-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多