日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

1 如何查看埋點方案

在進行埋點前,需要確定在哪里埋點、埋哪些點等,即需要梳理清楚明確的埋點需求。在QuickTracking平臺中將明確的埋點需求稱為埋點方案,并為埋點方案設計了規范模板。如下:

image

在埋點方案中,明確的所需埋點內容有:

1、事件主體:指“誰”觸發了這個事件,分為設備ID賬號ID,上報的事件務必具備其中之一。

  • 設備ID:Android設備和iOS設備的默認設備ID為應用級別唯一的設備ID,由Quicktracking自動生成

    • Android9及以下設備:SDK自動采集imei、wifimac、androidid、SN生成設備ID,生成后存入本地,只有卸載應用或者刪除應用數據才會重新生成設備ID。

    • Android10級以上設備:SDK自動采集oaid、gaid、androidid、SN生成設備ID,生成后存入本地,只有卸載應用或者刪除應用數據才會重新生成設備ID。

    • iOS設備:SDK自動采集openudid生成設備ID,生成后放入keychain中,只有恢復出廠設置或者刪除應用數據才會重新生成設備ID。

    • 使用應用的C端用戶同意采集idfa和oaid,QuickTracking SDK才會采集,只有QuickTracking app SDK可以采集到oaid、gaid、imei、wifimac、androidid、SN、idfa、idfv。

  • 賬號ID:客戶端用戶登錄后賬號標識,當一個用戶在不同的設備進行登錄時,設備ID會發生變化,但是賬號ID不會發生變化。例如一個用戶使用手機和pad分別登錄。

2、用戶屬性:針對賬號ID的屬性,例如賬號ID為“testdemo@111”的用戶,“生日”為“1999-02-13”,“會員等級”為“鉑金”等。“生日”和“會員”等級就為用戶屬性。

3、渠道屬性:廣告投放的屬性,例如投放渠道、投放方式、投放內容等。

4、全局屬性:在全局設置一次后,每一個事件都會攜帶的屬性

5、頁面瀏覽事件:頁面加載時上報的事件(埋點方案中頁面編碼和事件編碼相等的事件,也是標記為藍色的事件)

6、點擊、曝光、自定義事件:客戶端用戶與客戶端發生任意交互時上報的事件。

2 設置設備ID&賬號ID

2.1 設備ID設置

SDK 在com.quick.qt.commonsdk 包路徑下實現了默認的設備標識符采集工具類DefaultDeviceInfo,此默認實現類默認會采集如下標識。

設備標識或設備信息

采集方法

備注

AndroidID

String getAndroidID(Context context)

Android ID

Serial

String getSerial()

Android手機設備序列號

IMEI

String getImei(Context context)

IMEI

IMSI

String getImsi(Context context)

IMSI

WiFi-Mac

String getWifiMac(Context context)

WiFi-Mac

OAID

String getOaid(Context context)

廣告ID(國內)

GAID

String getGaid(Context context)

Google廣告ID

MCCMNC

String getMCCMNC(Context context)

MCC:移動國家編碼

MNC:移動網號

接口返回值:MCC值和MNC值拼接結果,MCC是3位整數,MNC為兩位整數。例如:46011

如果開發者希望針對上表中的某幾個設備標識符采集行為做控制,如:不采集IMEI字段和Serial字段,自行實現OAID的采集方法。就可以實現一個DefaultDeviceInfo類的子類,重載getImei,getSerial,getOaid三個采集方法,如下示例:

public class CustomDeviceInfo extends DefaultDeviceInfo {

	@Override
	public String getImei(Context context) {
		return null;
	}

	@Override
	public String getSerial() {
		return null;
	}

	@Override
	public String getOaid(Context context) {
		String oaid = "";
        // oaid = getOaidMethod(); // 您自己的 oaid 獲取方法
        return oaid;
	}

}

請注意:如果不進行重載,則默認由QuickTracking SDK采集,請謹慎決定是否實現對應方法,一旦您選擇自己實現采集方法,此設備標識的采集工作就由您全權接管了,SDK不會再試圖采集此設備標識。SDK能采集到的設備標識越少,對統計數據的準確性和穩定性的負面影響越大。

自定義工具類注冊:

// 請在設置收數域名之前,調用SDK預初始化函數之前,先調用采集工具類注冊函數
// 如果不需要對設備標識采集行為做控制,就不需要實現自定義工具類并注冊它。
QtConfigure.setDeviceInfo(new CustomDeviceInfo());
QtConfigure.setCustomDomain("您的收數服務域名", null);

SDK支持自定義設備ID,如果要使用自定義設備ID需要在初始化前(即init前) 設置setCustomDeviceId 接口為有效值(非空)。

public static void setCustomDeviceId(Context var0, String var1)

使用示例:

QtConfigure.setCustomDeviceId(this, "xxxxxx");

注意:因此功能在未獲取設備ID時生效,本地如果已存在設備ID,設置后無效。如果本地已獲取到設備ID可以通過卸載重裝方式驗證此功能。

設備ID的獲取

可使用下述方法獲取:

QtConfigure.getUMIDString()

2.2 賬號ID設置

1、在統計用戶時以設備為標準,如果需要統計應用自身的賬號,請使用以下接口:

public static void onProfileSignIn(String ID);

參數

含義

ID

用戶賬號ID,長度小于64字節

注意:賬號ID設置后將被存入本地存儲,只有卸載App、清空應用數據或者調用下述的登錄接口時,賬號ID才會失效,否則每一個事件都將攜帶賬號ID。

2、賬號登出時需調用此接口,調用之后不再發送賬號相關內容。

public static void onProfileSignOff();

示例:

//當用戶使用自有賬號登錄時,可以這樣統計:
QtTrackAgent.onProfileSignIn("userID");

//登出
QtTrackAgent.onProfileSignOff();

3 設置用戶屬性

通過預置事件編碼 $$_user_profile 上報用戶屬性。

在上報用戶屬性之前,需要先設置_user_id上報用戶賬號,否則QuickTracking流量分析對用戶屬性不會進行關聯計算。確認上報用戶的賬號ID后,上報用戶屬性示例如下:

Map<String, Object> user = new HashMap<String, Object>();
user.put("sex", "girl");//性別
user.put("age", "8"); //年齡
QtTrackAgent.onEventObject(mContext, "$$_user_profile", user);

4 渠道屬性

4.1 H5鏈接喚起App

渠道屬性無需進行任何埋點,但是需要喚起小程序或App的URL中攜帶這些渠道屬性,且屬性key務必以“utm_”開頭,因為SDK識別的關鍵字為“utm_”。例如:

<URL scheme>?utm_channel=gzh

PS:如果渠道屬性已經與市面上渠道投放公司進行了合作,無法使用utm_開頭,可以使用全局屬性API將渠道屬性進行埋點上報(屬性key依然需要以“utm_”開頭)。

4.2 H5鏈接喚起應用市場下載并啟動App

該場景下,如果僅是H5鏈接中攜帶“utm_”參數,已經無法做到下載App后的啟動事件攜帶“utm_”參數。所以需要進行“H5喚起事件”與“應用激活事件”做關于“IP地址和瀏覽器UserAgent”的模糊匹配。

  1. 當用戶在H5中點擊「喚起/下載App」的按鈕時,上報“應用喚起事件($$_app_link)”,在事件中需要攜帶喚起App的appkey和渠道屬性。

//示例
aplus_queue.push({
  action:'aplus.recordAppLink',
  arguments:[{
    targetAppKey: '要喚起的應用appKey',  // 必填,要喚起的應用appKey
    custom1: 'custom1', // 選填,自定義參數
    ...
  }]
})
  1. App下載后的第一次啟動事件“應用激活事件($$_app_install)”由QT App SDK自動采集上報。

  2. QuickTracking系統進行應用喚起事件($$_app_link)和應用激活事件($$_app_install)關于“IP地址和瀏覽器UserAgent”的模糊匹配。您使用時,可以直接在app應用中分析“應用激活(預置)”的渠道屬性即可。

4.3 App各應用市場活躍數據統計

在初始化函數中的第三個入參Channel即為設置該應用的應用市場:QtConfigure.preInit(this,"您的appkey","Channel-華為");QtConfigure.init(this,"您的appkey","Channel-華為",QtConfigure.DEVICE_TYPE_PHONE, "");

5 全局屬性

注冊全局屬性后,后續觸發的所有事件都將自動包含這些屬性;且這些屬性及屬性值存入緩存,APP退出后清除。在分析數據時,可根據此屬性進行查看和篩選。

5.1 注冊一個全局屬性

public static void registerGlobalProperties(Context var0, Map<String, Object> var1);

參數

含義

var0

當前宿主進程的ApplicationContext上下文。

propertyName

屬性名。

propertyValue

屬性值。

注意:

  1. 屬性名、String類型的屬性值,只支持大小寫字母、數字及下劃線!

  2. 屬性值可以是如下幾種Java類型之一:String、Long、Integer、Float、Double、Short。

  3. 如果和已經存在的全局屬性key重復,則更新已有值;如果和已經存在的全局屬性key不一致,則插入新的全局屬性。

    示例:

    Map firstMap = new HashMap<String, Object>();
    firstMap.put("a", "1");
    firstMap.put("b", "2");
    QtTrackAgent.registerGlobalProperties(mContext, firstMap);//當前globalproperty為a:1和b:2
    
    Map secondMap = new HashMap<String, Object>();
    secondMap.put("b", "3");
    secondMap.put("c", "4");
    QtTrackAgent.registerGlobalProperties(mContext, secondMap);//當前globalproperty為a:1、b:3和c:4

5.2 刪除一個全局屬性

public static void unregisterGlobalProperty(Context context, String propertyName);

參數

含義

context

當前宿主進程的ApplicationContext上下文。

propertyName

屬性名,只支持大小寫字母、數字及下劃線!

示例:

刪除一個特定的全局屬性,刪除后,后續觸發的所有事件都不再攜帶該屬性。

QtTrackAgent.unregisterGlobalProperty(mContext, "lnch_Source");

5.3 根據Key獲取單個全局屬性

public static Object getGlobalProperty(Context context, String propertyName);

參數

含義

context

當前宿主進程的ApplicationContext上下文。

propertyName

屬性名,只支持大小寫字母、數字及下劃線!

Object(返回值)

返回的全局屬性值類型可以是如下幾種Java類型之一:String、Long、 Integer、Float、Double、Short。必須和注冊此全局屬性時傳入參數類型一致。

示例:

String userId = QtTrackAgent.getGlobalProperty(mContext, "lnch_Source");

5.4 獲取所有全局屬性

public static String getGlobalProperties(Context context);

參數

含義

context

當前宿主進程的ApplicationContext上下文。

String(返回值)

返回字符串中包含所有全局屬性及對應的屬性值,以 K-V鍵值對 形式表示全局屬性-屬性值。多個鍵值對間用逗號分割。數據外層是大括號。如:{"id":"SA1375","userName":"Mike","account_type":"vip", "MemberLevel":"Level1"}

示例:

String allSuperProp = QtTrackAgent.getGlobalProperties(mContext);

5.5 清除所有的全局屬性

public static void clearGlobalProperties(Context context);

參數

含義

context

當前宿主進程的ApplicationContext上下文。

示例:

QtTrackAgent.clearGlobalProperties(mContext);

6 頁面瀏覽事件API

6.1 頁面手動采集

開發者如果希望對Activity、Fragment、CustomView及其它自定義頁面的頁面路徑和頁面停留時長進行采集和統計。可以通過調用QtTrackAgent.onPageStart/QtTrackAgent.onPageEnd這組接口進行手動埋點。

public static void onPageStart(String viewName);
public static void onPageEnd(String viewName);

參數

含義

viewName

自定義頁面名。

手動統計Fragemnt頁面路徑的例子代碼:

// 一次成對的 onPageStart -> onPageEnd 調用,對應一次非Activity頁面(如:Fragment)生命周期統計。

// Fragment頁面onResume函數重載
public void onResume() {
    super.onResume();
    QtTrackAgent.onPageStart("MainScreen"); //統計頁面("MainScreen"為頁面編碼,可自定義)   
}

// Fragment頁面onResume函數重載
public void onPause() {
    super.onPause();
    QtTrackAgent.onPageEnd("MainScreen");
}

注意:

onPageStart 是SDK記錄頁面進入的信息,onPageStart不會上報事件,只有調用onPageEnd的時候才會上報頁面瀏覽事件。

onPageStart和onPageEnd必須成對調用,且傳值的page_name需要保持一致,如果沒有onPageEnd或者onPageEnd與onPageStart傳值的page_name不一致,則onPageStart記錄的信息不會生效。

6.1.1 頁面屬性上傳

QtTrackAgent.setPageProperty(),支持給當前頁面附加自定義屬性。

接口:QtTrackAgent.setPageProperty

參數:

參數

含義

context

當前Application的上下文。

pageName

目標頁面名,必須和當前頁面名一致。如不一致,函數執行無效。

pageProperty

需要關聯到頁面的k-v鍵值對參數。value值支持String,Integer,Long,Float,Short,Double類型。

示例:

Activity頁面開始展現時進行當前頁面屬性設置示例:

private static final String PAGE_NAME = "page_home"; // 頁面名
 
 @Override
 public void onResume() {
    super.onResume();
   
    QtTrackAgent.onPageStart(PAGE_NAME); // 頁面開始展現打點
    Map<String, Object> params = new HashMap<>();
    params.put("home_param_1", "value11"); // 當前頁面相關屬性設置
    QtTrackAgent.setPageProperty(mContext, PAGE_NAME, params);
 }

請注意:頁面屬性設置只支持頁面手動埋點

6.1.2 透傳頁面屬性

此外,QuickTracking SDK提供了SpmAgent.updateNextPageProperties接口,該接口支持給下一個頁面附加自定義屬性。

接口:SpmAgent.updateNextPageProperties

參數:

參數

含義

params

需要透傳的k-v鍵值對Map。value值支持String,Integer,Long,Float,Short,Double類型。

/**
* 
當需要將當前坑位屬性透傳給?標??時調用
* 
此函數在通過坑位跳轉到下?個?標??時調?。
*/
public static void updateNextPageProperties(Map<String, Object> params)

示例:

public class PageHome extends Activity {
    private Context mContext;
    private static final String PAGE_NAME = "page_home"; // 頁面名
    private static final String PAGE_SPM_CNT = "1.1.0.0"; // 頁面spm編碼

    // 跳轉到news的坑位 spm 編碼
    private static final String PAGE_SPM_TO_NEWS = "1.1.0.1"; // 按鈕控件mGoNewsWithHole spm編碼
    private Button mGoNewsWithHole;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setTitle("QuickTracking統計Home頁");
        setContentView(R.layout.activity_u4a_home);

        mContext = this;

        mGoNewsWithHole = (Button)findViewById(R.id.u4a_goto_page_news2);
        mGoNewsWithHole.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 帶坑位spm的跳轉
                SpmAgent.updateCurSpm(mContext, PAGE_SPM_TO_NEWS); // 跳轉按鈕控件spm編碼
                Map<String, Object> params = new HashMap<String, Object>();
                
                params.put("my_transfer_arg1", "transfer_value1");
                SpmAgent.updateNextPageProperties(params); // 
                startActivity(new Intent(mContext, PageNews.class));
            }
        });
    }

請注意:透傳頁面屬性只支持頁面手動埋點

6.2 Activity頁面自動采集(全埋點)

Activity頁面默認開啟頁面自動采集,無須集成全埋點的gradle 插件。SDK在采集會話數據時,默認會主動采集每個Activity頁面的路徑和頁面訪問時長數據并上報。如果開發者同時調用頁面路徑手動采集API QtTrackAgent.onPageStart/onPageEnd,則會導致頁面數據重復上報,產生冗余頁面路徑數據,可以在調用QtConfigure.preInit預初始化函數后緊接著調用QtTrackAgent.disableActivityPageCollection()函數禁止SDK自動采集Activity頁面路徑數據。

public static void disableActivityPageCollection();

若只需禁止某activity頁面的自動采集上報的接口,需要在activity的onCreate函數中調用此函數:

QtTrackAgent.skipMe(this, null); 

參數

類型

備注

this

Activity對象

WebView宿主Activity對象,該參數控制當前頁面的自動頁面數據是否上報,傳this則表示不上報。

viewName

字符串

手動埋點時的自定義頁面編碼,該參數控制當前頁面的手動埋點頁面數據是否上報,傳空則表示上報,傳自定義頁面編碼則表示不上報。

6.3 Fragment頁面自動采集(全埋點)

Fragment頁面默認沒有自動采集,需要集成全埋點的插件并開啟自動采集開關才可以。具體操作可以查看

8.1 全埋點gradle插件引入開啟Fragment PV數據全埋點

7 事件埋點

自定義事件可以用于追蹤用戶行為,記錄行為發生的具體細節。

7.1 事件埋點

使用onEventObject接口進行事件的統計,參數值可以是如下幾種類型之一:StringLongIntegerFloatDoubleShort

接口:

public static void onEventObject(Context context, String eventID, Map<String, Object> map)

public static void onEventObject(Context context, String eventID, Map<String, Object> map, String pageName)

參數

含義

context

當前宿主進程的ApplicationContext上下文。

eventId

為當前統計的事件ID。

map

對當前事件的參數描述,定義為“參數名:參數值”的HashMap“<鍵-值>對”。

pageName

事件發生時的頁面編碼

事件上傳數量限制:

  • 自定義屬性key字符串長度上限:1024

  • 自定義屬性value字符串長度上限:1024*4

  • 自定義屬性map長度(參數個數):100 個鍵值對

  • 當自定義屬性值value為數組元素時,屬性值的數組長度上限:100

示例:

Map<String, Object> music = new HashMap<String, Object>();
music.put("music_type", "popular");//自定義參數:音樂類型,值:流行
music.put("singer", "JJ"); //歌手:(林俊杰)JJ
music.put("song_name","A_Thousand_Years_Later"); //歌名:一千年以后
music.put("song_price",100); //價格:100元
QtTrackAgent.onEventObject(this, "play_music", music, "home_page");

備注:

  • 當前拉取事件采樣率配置依賴于自動采集開關,使用SDK時需要調用setAutoEventEnabled()方法;

    示例:

    public class MyApplication extends Application {
    
        @Override
        public void onCreate() {
            super.onCreate();
    	QtConfigure.setCustomDomain("您的收數服務域名", null);
            // 打開調試log
            QtConfigure.setLogEnabled(true);
            // 采樣率拉取依賴全埋點開關設置,如需要事件采樣率控制功能,請按需調用此API
            QtTrackAgent.setAutoEventEnabled(false);        
            //...
        }
        //... 
    }
  • 多參數類型事件能滿足原來計算事件/計數事件的分析場景;

  • 對于計算型事件不同的參數類型對應不同的計算方式,總共可以分為兩大類,數值型和字符型

    • 數字型:支持累加值、最大值、最小值、平均值和去重數計算

    • 字符型:支持去重數計算

7.2 子進程埋點

SDK僅支持子進程自定義事件埋點,頁面等其他類型采集暫不支持。子進程埋點需要在SDK初始化完成后調用函數QtConfigure.setProcessEvent。

示例:

public class UmengApplication extends Application{
    @Override
    public void onCreate(){
        super.onCreate();
        // 初始化SDK
        QtConfigure.preInit(this, "您的appkey", "應用市場");
        
        // 支持在子進程中統計自定義事件
        QtConfigure.setProcessEvent(true);
        // ...

注意:

  • 如果需要在某個子進程中統計自定義事件,則需保證在此子進程中進行SDK初始化。

8 全埋點(自動埋點)

8.1 全埋點gradle插件引入

在 project 級別的 build.gradle 文件中添加 android-gradle-plugin插件依賴:

說明

注意:

  • Android Plugin 需要 Android Gradle Plugin 3.2.0+,否則會導致元素點擊事件和 Fragment 的頁面瀏覽事件無法觸發。

buildscript {
    repositories {
        maven { url 'https://repo1.maven.org/maven2/' } // QuickTracking倉庫
        jcenter()
            google()
        }
    
    dependencies {
        classpath 'com.android.tools.build:gradle:3.5.4'
            
            // 添加QuickTracking插件 android-gradle-plugin 依賴
            //classpath 'com.umeng.umsdk:android-gradle-plugin:1.0.1' 
            classpath 'com.lydaas.qtsdk:quick-gradle-plugin2:1.0.2'
            // 適配 gradle 8+版本
            // classpath 'com.lydaas.qtsdk:quick-gradle-plugin2:2.0.0'
        }
}

allprojects {
    repositories {
        maven { url 'https://repo1.maven.org/maven2/' } // QuickTracking倉庫
        jcenter()
            google()
        }
}

說明

注意:

  • 在App根工程目錄下gradle.properties文件中org.gradle.jvmargs參數值追加 “-noverify” 參數。

  • 如果App根工程目錄下沒有gradle.properties文件,請自行創建此文件。如果此文件中之前沒有org.gradle.jvmargs參數,需開發者自行增加此參數,并在參數值中指定/或追加 -noverify參數值。

image.png

8.2 依賴使用gradle編譯插件

在主 module 的 build.gradle 配置中應用全埋點插件:

apply plugin: 'com.android.application'
//apply plugin: 'com.qt.analytics.plugin' // P版本插件(全埋點場景)
apply plugin: 'com.quick.analytics.plugin' // PX版本插件(全埋點場景)

dependencies {
   // 添加 QuickTracking 統計SDK,SDK版本需要與上述的gradle版本匹配
   //implementation 'com.umeng.umsdk:qt-common:1.4.4.P' //P版本(SDK版本為x.x.x.P)
   implementation 'com.lydaas.qtsdk:qt-px-common:1.4.9.PX'  // PX版本(SDK版本為x.x.x.PX)
}

8.3 全埋點API

8.3.1 全埋點開關

開啟Fragment PV數據全埋點

通過 enableFragmentPageCollection() 方法可以開啟全部 Fragment 頁面瀏覽事件的自動采集功能。

/**
* Fragment 頁面數據自動采集開關,SDK默認關閉
* @param enable true-開啟; false-關閉
*/
public static void enableFragmentPageCollection(boolean enable);

示例:

public class MyApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
	QtConfigure.setCustomDomain("您的收數服務域名", null);
        // 打開調試log
        QtConfigure.setLogEnabled(true);
        // 開啟全部 Fragment 頁面瀏覽事件的自動采集功能
        QtTrackAgent.enableFragmentPageCollection(true);
        //...
    }
    //... 
}

開啟Activity PV數據開關

默認開啟Activity頁面自動采集,SDK在采集會話數據時,默認會主動采集每個Activity頁面的路徑和頁面訪問時長數據并上報。如果開發者同時調用頁面路徑手動采集API QtTrackAgent.onPageStart/onPageEnd,則會導數頁面數據重復上報產生冗余頁面路徑數據,可以在調用QtConfigure.preInit預初始化函數后緊接著調用QtTrackAgent.disableActivityPageCollection()函數禁止SDK自動采集Activity頁面路徑數據。

public static void disableActivityPageCollection();

若只需禁止某activity頁面的自動采集上報的接口,需要在activity的onCreate函數中調用此函數:

QtTrackAgent.skipMe(this, null); 

關閉某個頁面的自動采集

若只需禁止某activity頁面的自動采集上報的接口,需要在activity的onCreate函數中調用此函數:

QtTrackAgent.skipMe(this, null); 

參數

類型

備注

this

Activity對象

WebView宿主Activity對象,該參數控制當前頁面的自動頁面數據是否上報,傳this則表示不上報。

viewName

字符串

手動埋點時的自定義頁面編碼,該參數控制當前頁面的手動埋點頁面數據是否上報,傳空則表示上報,傳自定義頁面編碼則表示不上報。

開啟控件點擊數據全埋點
/**
 * 拉取事件采樣率配置。
 * 設置是否自動采集控件點擊事件, SDK默認不自動采集。
 * @param enable true-自動采集; false-不自動采集
 */
public static void setAutoEventEnabled(boolean enable);

示例:

public class MyApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
	QtConfigure.setCustomDomain("您的收數服務域名", null);
        // 打開調試log
        QtConfigure.setLogEnabled(true);
        QtTrackAgent.enableFragmentPageCollection(true);
        // 開啟控件點擊事件的自動采集功能。
        QtTrackAgent.setAutoEventEnabled(true);
        //...
    }
    //...
    
}

支持自動監控的控件類型列表:

控件名稱

備注

CheckBox

針對onCheckedChanged 方法自動插樁打點

RadioButton

針對onCheckedChanged 方法自動插樁打點

ToggleButton

Switch

Button

ImageButton

CheckedTextView

TextView

ImageView

RatingBar

針對onRatingChanged方法自動插樁打點

SeekBar

針對onStopTrackingTouch方法自動插樁打點

Spinner

ListView

ExpandableListView

RecyclerView

僅支持RecyclerView Item內部子控件事件自動采集

TabHost

TabLayout

MenuItem

Dialog

GridView

Layout

實現了點擊事件響應函數的Layout對象及子類生成對象。

8.3.2 自動Activity/Fragment PV設置自定義屬性

通過給特定Activity/Fragment 實現接口 com.umeng.analytics.autotrack.PageAutoTracker,可以給自動采集的Activity/Fragment頁面定制化屬性、頁面名、或者來源頁面名。

public interface PageAutoTracker {
    /**
     * 返回當前頁面名
     * @return 如果不需要自定義頁面名則返回null或者空字符串
     */
    String getPageName();

    /**
     * 返回來源頁面名
     * @return 如果不需要自定義來源頁面名則返回null或者空字符串
     */
    String getRefPageName();

    /**
     * 返回自定義屬性鍵值對,Key和Value都需要是字符串類型,如果沒有自定義屬性請返回null
     *
     * @return 如果沒有自定義屬性請返回null
     */
    Map<String, String> getTrackProperties();
}

示例:

// 給FragmentContacts指定 自定義頁面名 及 自定義頁面屬性
public static class FragmentContacts extends Fragment implements PageAutoTracker {
        private final String mPageName = "FragmentContacts";

        static FragmentSimple newInstance(int num) {
            FragmentSimple f = new FragmentSimple();

            // Supply num input as an argument.
            Bundle args = new Bundle();
            args.putInt("num", num);
            f.setArguments(args);

            return f;
        }

        /**
         * The Fragment's UI is just background simple text view showing its instance
         * number.
         */
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

            FrameLayout fl = new FrameLayout(getActivity());
            fl.setLayoutParams(new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT,
                    FrameLayout.LayoutParams.MATCH_PARENT));
            fl.setBackgroundColor(Color.LTGRAY);
            TextView tv = new TextView(getActivity());
            tv.setText("Fragment Contacts");
            tv.setTextColor(Color.BLACK);
            tv.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    QtTrackAgent.ignoreView(v); // 禁止TextView控件的自動采集數據上報
                    Toast.makeText(getActivity(), "文本框被點擊了", Toast.LENGTH_LONG).show();
                }
            });
            fl.addView(tv);
            return fl;
        }

        // 自定義FragmentContacts頁面名
        @Override
        public String getPageName() {
            return "FragmentContacts";
        }

    	// 不需要自定義FragmentContacts的來源頁面名,所以直接返回null
        @Override
        public String getRefPageName() {
            return null;
        }

    	// 自定義FragmentContacts頁面自定義屬性
        @Override
        public Map<String, String> getTrackProperties() {
            Map<String, String> properties = new HashMap<>();
            properties.put("fragment_arg1", "fragment_value111");
            properties.put("fragment_arg2", "fragment_value222");
            return properties;
        }
    }

8.3.3 設置控件點擊事件自定義屬性

通過 setViewProperties() 方法,可以對特定控件設置自定義屬性,自定義屬性可以設置多個K-V鍵值對,Key和Value都需要是字符串類型。自定義屬性和值會包含在此控件全埋點點擊事件數據中。

/**
* 設置控件自定義屬性,自定義屬性可以設置多個K-V鍵值對,Key和Value都需要是字符串類型
* @param view 控件對象
* @param properties 自定義屬性
*/
public static void setViewProperties(View view, JSONObject properties);

示例:

	@QtDataTrackViewOnClick
    public void onButtonClick(View v) {
        int id = v.getId();
        Intent in = null;
        if (id == R.id.normal) {
        	// 對Resource ID為 normal 的Button控件設置自定義事件ID ekv_normal。
        	// 設置后,點擊此控件是SDK上報數據中事件ID就為"ekv_normal"。
            QtTrackAgent.setViewEventID(v, "ekv_normal");
            // 針對 normal Button控件點擊事件(即ekv_normal 事件),設置自定義屬性值。
            // customArgs內屬性和屬性值會包含在"ekv_normal"事件數據中一起上報。
            JSONObject customArgs = new JSONObject();
            try {
                customArgs.put("customArg1", "value1111");
                customArgs.put("customArg2", "value2222");
            } catch (JSONException e) {

            }
            QtTrackAgent.setViewProperties(v, customArgs);

8.3.4 給控件點擊事件設置自定義事件編碼

通過 setViewEventID() 方法,給特定控件的點擊事件設置自定義事件編碼。

/**
* 針對自動采集的控件點擊事件,設置自定義事件編碼
* @param view 控件對象
* @param eventID 自定義事件編碼
*/
public void setViewEventID(View view, String eventcode);

示例:

    @QtDataTrackViewOnClick
    public void onButtonClick(View v) {
        int id = v.getId();
        Intent in = null;
        if (id == R.id.normal) {
        	// 對Resource ID為 normal 的Button控件設置自定義事件編碼 ekv_normal。
        	// 設置后,點擊此控件是SDK上報數據中事件編碼就為"ekv_normal"。
            QtTrackAgent.setViewEventID(v, "ekv_normal");
            	//...

8.3.5 處理通過 onClick 屬性設置的點擊事件

通過布局文件中 android:onClick 屬性配置的點擊回調方法執行時無法自動觸發控件點擊事件。此時可以給 android:onClick 屬性對應的方法加上 @QtDataTrackViewOnClick 注解,這樣在方法執行時,SDK就可以自動觸發控件點擊事件。例如:

布局文件:

<Button
        android:id="@+id/normal"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="24dp"
        android:onClick="onButtonClick"
        android:text="@string/ana_name"/>

onClick事件自定義處理函數:

import com.umeng.analytics.autotrack.QtDataTrackViewOnClick;

	@QtDataTrackViewOnClick
    public void onButtonClick(View v) {
         //...
    }

8.3.6 忽略特定類型控件點擊事件的自動采集

通過 ignoreViewType() 方法忽略特定類型控件點擊事件的自動采集。

/**
* 忽略viewType類型控件點擊事件的自動采集行為。
* 該方法支持多次調用,對設置結果合集進行忽略。
* @param viewType
*/
public static void ignoreViewType(Class viewType);

示例:

// 忽略Button類型控件點擊事件
QtTrackAgent.ignoreViewType(Button.class);

8.3.7 忽略特定控件點擊事件的自動采集

通過 ignoreView() 方法忽略特定控件點擊事件的自動采集。

/**
* 忽略某個 View 對象的點擊事件自動采集行為。
*
* @param view 對象
*/
public static void ignoreView(View view);

示例:

Button myButton = (Button)findViewById(R.id.testButton);
// 忽略myButton控件點擊事件
QtTrackAgent.ignoreView(myButton);

9 分享裂變

分享裂變是增長黑客策略的一個關鍵概念,它依靠用戶之間的社交聯系來實現信息的相互傳遞,從而促進新用戶的獲取。

完成分享裂變的SDK功能集成,您將可以使用QuickTracking平臺分享趨勢模型,通過分享回流相關指標衡量營銷活動的拉新效益。

  1. 支持查看TOP分享用戶和不同分享回流層級的分享回流效果指標。

  2. 支持回流指標靈活組合配置,查看最具裂變拉新能力和分享回流轉化能力的TOP用戶,追蹤用戶分享裂變鏈路與分享回流關系,快速定位關鍵意見消費者。

9.1 獲取來源分享參數

import com.quick.qt.analytics.QtTrackAgent;
/**
 * 來源分享參數獲取API
 * @param context 宿主App的ApplicationContext對象。必須傳入
 * */
public static Map<String, String> getRefShareParams(Context context);

版本

Android SDK v1.6.0.PX版本及以上

功能

在請求分享參數之前,用于獲取來源分享id 和來源分享 url 的 API

請求參數

參數

類型

默認值

含義

備注

context

Context

null

宿主App 的 ApplicationContext 上下文

必須傳入,不能為 null

返回參數

參數

類型

默認值

含義

備注

$$_ref_share_url

String

null

不包含分享 id 的來源分享 url

"$$_ref_share_id

String

null

來源分享 id

調用示例

import com.quick.qt.analytics.QtTrackAgent;
import com.quick.qt.analytics.share.ShareResultHandler;

public class DemoActivity {
    ...
    public void onShare() {
        Context context = DemoActivity.this;
        Map<String, String> refShareParams = QtTrackAgent.getRefShareParams(context);
        String $$_ref_share_id = refShareParams.get("$$_ref_share_id");
        
        Map<String, String> shareParams = new HashMap<String, String>();
        shareParams.put("shareId", $$_ref_share_id);
        shareParams.put("title", "分享活動A");
        shareParams.put("campaign", "分享活動A");
        QtTrackAgent.requestShareParams(context, "https://www.taobao.com/productId", shareParams, 0, new ShareResultHandler() {
            @Override
            public void onShareResultSuccess(final JSONObject result) {
                try {
                    Log.i("Test", "shareParams = " + result.toString());
                    String $sid = result.getString("shareId");
                    Map<String, Object> properties = new HashMap<String, Object>();
                    properties.put("$$_share_id", $sid);
                    properties.put("$$_share_url", "https://www.taobao.com/productId"); 
                    properties.put("$$_share_title","分享活動A"); 
                    properties.put("$$_share_campaign_id", "這是一個自定義分享活動");
                      // 
                    properties.put("$$_share_type", "用戶自定義分享目標平臺");
                    QtTrackAgent.onEventObject(this, "$$_share", properties);
                    // 假設這是后臺線程中的某個操作
                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            // 執行一些后臺任務...

                            // 需要更新UI,切回主線程
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    // 在主線程上顯示對話框
                                    AlertDialog.Builder builder = new AlertDialog.Builder(context);
                                    builder.setTitle("分享參數");
                                    builder.setMessage(result.toString());
                                    builder.show();
                                }
                            });
                        }
                    }).start();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void onShareResultFail(Throwable t) {
                Log.i("Test", "fail = " + t.getMessage());
            }
        });
    }
    ...
}

9.2 請求分享參數

import com.quick.qt.analytics.QtTrackAgent;
import com.quick.qt.analytics.share.ShareResultHandler;

/**
 * 分享 url 獲取API
 * @param context 宿主App的ApplicationContext對象。必須傳入
 * @param url 頁面的地址,必須傳入
 * @param params 可能的分享參數,可為 null
 *    {
 *      title: 分享標題, 可為 null, 最大長度 4*1024
 *    campaign: 分享活動, 可為 null, 最大長度 4*1024
 *    shareId: 來源分享Id, 可為 null
 *      ... 待擴展
 *  }
 * @params timeout 請求超時時間,單位秒,有效值范圍:0~10(包含0和10),如果傳入0,則使用sdk內部默認值3秒
 * @param callback 結果回調對象,必須傳入,不能為null
 * */
public static void requestShareParams(Context context, String url, Map<String, String> params, int timeout,final ShareResultHandler callback)

版本

Android SDK v1.6.0.PX版本及以上

功能

請求用于構建分享鏈需要的分享id

請求參數

參數

類型

默認值

含義

備注

context

Context

null

宿主 App 的ApplicationContext 上下文

必須傳入,不能為null

url

String

null

分享頁面的 url

必須傳入,不能為 null

params

Map<String,String>

null

分享參數獲取 API 請求參數

  • 可選參數

campaign:分享活動標識。String 類型,默認值為 "",最大長度為 4*1024 個字符

title:分享標題。String類型,默認值為 "",最大長度為 4*1024個長度

shareId:來源分享Id。String 類型,默認值為""

timeout

int

0

接口超時時間

取值范圍1~10,單位為秒。sdk 默認超時時間為3秒

callback

ShareResultHandler

null

結果回調對象

必須傳入, 不能為 null

注:此結果回調上下文為SDK內部網絡請求后臺工作線程,如果需要在回調方法中操作UI控件,請通過UI線程Handler執行相關操作。

其中 callback 的回調接口 ShareResultHandler 定義如下:

public interface ShareResultHandler {
    //本方法在分享參數成功返回時會回調
    void onShareResultSuccess(JSONObject result);
    //本方法在分享參數失敗返回時會回調, 可通過t.getMessage 獲取失敗原因
    void onShareResultFail(Throwable t);
}

返回參數

參數

類型

默認值

含義

備注

data

JSONObject

null

分享參數 API 請求結果

包含一個屬性shareId, String類型,分享id

調用示例

import com.quick.qt.analytics.QtTrackAgent;
import com.quick.qt.analytics.share.ShareResultHandler;

public class DemoActivity {
    ...
    public void onShare() {
        Context context = DemoActivity.this;
        Map<String, String> shareParams = new HashMap<String, String>();
        shareParams.put("shareId", "");
        shareParams.put("title", "分享活動A");
        shareParams.put("campaign", "分享活動A");
        QtTrackAgent.requestShareParams(context, "https://www.taobao.com/productId", shareParams, 0, new ShareResultHandler() {
            @Override
            public void onShareResultSuccess(final JSONObject result) {
                try {
                    Log.i("Test", "shareParams = " + result.toString());
                    String $sid = result.getString("shareId");

                    Map<String, Object> properties = new HashMap<String, Object>();
                    properties.put("$$_share_id", $sid);
                    properties.put("$$_share_url", "https://www.taobao.com/productId"); 
                    properties.put("$$_share_title","分享活動A"); 
                    properties.put("$$_share_campaign_id", "這是一個自定義分享活動");
                    properties.put("$$_share_type", "用戶自定義分享平臺");
                    QtTrackAgent.onEventObject(this, "$$_share", properties);
                    
                    // 假設這是后臺線程中的某個操作
                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            // 執行一些后臺任務...

                            // 需要更新UI,切回主線程
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    // 在主線程上顯示對話框
                                    AlertDialog.Builder builder = new AlertDialog.Builder(context);
                                    builder.setTitle("分享參數");
                                    builder.setMessage(result.toString());
                                    builder.show();
                                }
                            });
                        }
                    }).start();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void onShareResultFail(Throwable t) {
                Log.i("Test", "fail = " + t.getMessage());
            }
        });
    }
}

9.3 上報分享事件

通過預置事件編碼 $$_share 上報分享事件

示例

Map<String, Object> properties = new HashMap<String, Object>();
properties.put("$$_share_id", "通過請求分享參數API獲取到的分享ID");
properties.put("$$_share_url", "https://www.taobao.com/productId"); 
properties.put("$$_share_title","分享活動A"); 
properties.put("$$_share_campaign_id", "這是一個自定義分享活動");
properties.put("$$_share_type", "用戶自定義分享平臺");
QtTrackAgent.onEventObject(this, "$$_share", properties);

請注意:喚起的鏈接需要攜帶key為"$sid",value為分享Id的參數,如:https://example.aliyun.com/path/to/content?$sid=123456"