Using Google Analytics To Track Fragments

后端 未结 6 1910
我寻月下人不归
我寻月下人不归 2020-12-04 15:39

Just need to know the proper way to implement Google analytics to track when a user is on a fragment in real time this is what is do now

@Override
public voi         


        
相关标签:
6条回答
  • 2020-12-04 16:11

    Mochini's answer uses Google Analytics V2. Bellow you can see how to do it on V4 and V3:

    • V4:

    Application:

    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 (you can name it anything, it does not need to be called "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'
    

    Fragment superclass:

    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() );
           }
      }
      

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

    0 讨论(0)
  • 2020-12-04 16:16

    with android google analytics v4

    i tried this and it worked

    refering this 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;
          }
    }
    
    0 讨论(0)
  • 2020-12-04 16:20

    Tiago's version can't be used in the new goole analytics v4. Instead, use this code from 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());
          }
        });
      }
    }
    
    0 讨论(0)
  • 2020-12-04 16:25

    Tracking methods section suggests that you just need to call EasyTracker.getInstance().setContext(getActivity()); first, then you can use the tracker in "other classes".

    manual screen tracking section suggests that you can track a Fragment view with myTracker.sendView("Home Screen");

    0 讨论(0)
  • 2020-12-04 16:33

    Another approach for V3 (since onResume() is tied to the Activity and not the Fragment. This works well when the parent/child relationships are well-known.

    Parent Fragment sends initial event 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());
        }
    }
    

    Child Fragment overrides both onStart() and 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());
        }
    }
    
    0 讨论(0)
  • 2020-12-04 16:37

    This an example using FragmentActivity and fragments:

    1. Create XML file in value folder (values/analytics.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. In your FragmentActivity class, add this:

      @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. Create new class in your package: 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. Finally, your fragment should extend from TrackedFragment like:

      public class NewFragment extends TrackedFragment {
      
          public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
              return inflater.inflate(R.layout.newfragment, null);
          }
      
      }
      
    0 讨论(0)
提交回复
热议问题