1 如何查看埋點方案
在進行埋點前,需要確定在哪里埋點、埋哪些點等,即需要梳理清楚明確的埋點需求。在QuickTracking平臺中將明確的埋點需求稱為埋點方案,并為埋點方案設計了規范模板。如下:
在埋點方案中,明確的所需埋點內容有:
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”的模糊匹配。
當用戶在H5中點擊「喚起/下載App」的按鈕時,上報“應用喚起事件($$_app_link)”,在事件中需要攜帶喚起App的appkey和渠道屬性。
//示例
aplus_queue.push({
action:'aplus.recordAppLink',
arguments:[{
targetAppKey: '要喚起的應用appKey', // 必填,要喚起的應用appKey
custom1: 'custom1', // 選填,自定義參數
...
}]
})
App下載后的第一次啟動事件“應用激活事件($$_app_install)”由QT App SDK自動采集上報。
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 | 屬性值。 |
注意:
屬性名、String類型的屬性值,只支持大小寫字母、數字及下劃線!
屬性值可以是如下幾種Java類型之一:String、Long、Integer、Float、Double、Short。
如果和已經存在的全局屬性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頁面默認沒有自動采集,需要集成全埋點的插件并開啟自動采集開關才可以。具體操作可以查看
7 事件埋點
自定義事件可以用于追蹤用戶行為,記錄行為發生的具體細節。
7.1 事件埋點
使用onEventObject接口進行事件的統計,參數值可以是如下幾種類型之一:String、Long、Integer、Float、Double、Short。
接口:
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參數值。
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平臺分享趨勢模型,通過分享回流相關指標衡量營銷活動的拉新效益。
支持查看TOP分享用戶和不同分享回流層級的分享回流效果指標。
支持回流指標靈活組合配置,查看最具裂變拉新能力和分享回流轉化能力的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"