可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
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 void onResume() { super.onResume(); Tracker myTracker = parentActivity.getTracker(); myTracker.setCustomMetric(1, (long) 1); myTracker.sendView("Music View"); }
the getTracker class is in my main activity and just returns the instance of tracker in the main activity
Any help would be much appreciated!
回答1:
Mochini's answer uses Google Analytics V2. Bellow you can see how to do it on V4 and V3:
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")
UA-XXXXXXXX-Xtruefalse
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
回答2:
This an example using FragmentActivity
and fragments:
Create XML file in value folder (values/analytics.xml
):
XX-xxxxxxxx-xtruetrueFragment activity20
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 }
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); } }
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); } }
回答3:
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");
回答4:
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()); } }
回答5:
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()); } }); } }
回答6:
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 = "" + "" + fFeed.getItem(fPos).getDescription()+"
"+""; //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; } }