在 Eclipse 中右键工程根目录,选择Properties —> Java Build Path —> Libraries
,然后点击 Add External JARs… 选择指向 jar 的路径,点击 OK,即导入成功。(ADT17 及以上不需要手动导入)。
下载 SDK 并解压.zip
文件得到 Jar 包,在 Android Studio 的项目工程 libs 目录中拷入相关 jar 包并同步即可。
AndroidManifest.xml
的配置主要包括添加权限,填写 Appkey 两个部分,代码示例如下:
<manifest……>
<application ……>
<activity ……/>
<meta-data android:name="HMT_APPKEY" android:value="YOUR_APP_KEY"/>
<meta-data android:name="HMT_CHANNEL" android:value="YOUR_CHANNEL_VALUE" />
</application>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
</manifest>
其中 YOUR_APP_KEY 即为获得的应用 Appkey;YOUR_CHANNEL_VALUE 为应用发布的渠道 ID,通过该 ID 区分不同渠道来源的数据,可传入自定义的值。(chennel 的命名规范详见渠道命名规范)
权限说明
INTERNET
:允许应用程序联网和发送统计数据的权限,以提供统计分析服务。READ_PHONE_STATE
:获取用户设备的IMEI,通过IMEI对用户进行唯一标识,以便提供统计分析服务。ACCESS_WIFI_STATE
:访问 Wi-Fi 网络状态信息,以便提供更精准的分析服务ACCESS_NETWORK_STATE
:检测联网方式,在网络异常状态下避免数据发送,节省流量和电量。ACCESS_COARSE_LOCATION
(可选):访问 CellID 或 WiFi 热点来获取粗略的位置ACCESS_FINE_LOCATION
(可选):获取当前用户的位置信息如果您的应用使用了代码混淆,请添加如下配置,以避免SDK被错误混淆导致SDK不可用。
-keep class com.hmt.analytics.**{
*;
}
如果需要使用SDK的统计功能,则必须调用HMTAgent.Initialize(Context context)
方法。
由于SDK会在初始化后获取设备信息,目前我们不建议在Application
的onCreate()
方法中调用。
请配套使用Consent Manager,或自行开发隐私协议弹窗,务必在用户同意后再初始化SDK。
// 初始化SDK
HMTAgent.Initialize(Context context)
// 初始化SDk,并设置reportPolicy,0表示启动时发送1表示实时发送(系统默认为0)
HMTAgent.Initialize(Context context, int reportPolicy)
// 初始化SDK,并设置参数黑名单, unTracked为参数黑名单,其中的参数sdk将不再收集与发送
HMTAgent.Initialize(Context context, int reportPolicy, String[] unTracked)
// 如需要配置收集字段缓存数据加密(默认不开启),则在初始化SDK前调用
HMTAgent.setEnableCacheEncrypt(true)
// 设置是否禁止采集IMEI(默认不采集),在初始化SDK前调用
HMTAgent.setDisabledIMEI(true)
// 设置是否禁止采集IMSI(默认不采集),在初始化SDK前调用
HMTAgent.setDisabledIMSI(true)
// 设置是否禁止采集设备指纹(默认不采集),在初始化SDK前调用
HMTAgent.setDisabledMonarch(true)
// 设置是否使用随机的AndroidId(默认不使用随机),在初始化SDK前调用
HMTAgent.useRandomAndroidId(true)
// 设置是否使用随机的DeviceId(默认不使用随机),在初始化SDK前调用
HMTAgent.useRandomDeviceId(true)
// 如需关闭自动布码,若开发者希望自已对每个页面进行手动的命名和采集,则在初始化SDK前调用
HMTAgent.setActivityLifeCb(false)
// 如需要修改服务器地址,在调用初始化前调用setBaseURL方法
HMTAgent.setBaseURL("http://yourtrackerdomain.com")
// 如需要修改配置文件获取地址,在调用初始化前调用setOnlineConfigUrl方法
HMTAgent.setOnlineConfigUrl("http://yourtrackerdomain.com")
// 如果在配置AndroidManifest.xml中未设置渠道,可在初始化前通过下面方法进行设置
HMTAgent.setChannelId(String channel_id)
// 如需通过SDK采集deeplink打开的连接用于分析,则在初始化前通过下面方法进行设置
HMTAgent.routeHLink(true)
// 初始化
HMTAgent.Initialize(Context context)
setBaseURL()
、setOnlineConfigUrl()
进行配置AndroidManifest.xml
中进行,也可以在初始化前通过 setChannelId()
进行,若开发者两种方式都添加了,则以代码中设置为准。reportPolicy
参数目前支持两个值:1,0。分别对应实时模式和启动时批量发送(系统默认为批量)
unTracked
参数为黑名单参数数组,将需要过滤的参数填入其中,SDK 将不会发送该参数到服务器。至此,最基本的集成已完成,SDK 已支持自动采集上报应用的开启、页面切换。
SDK支持自定义的事件的统计分析,例如可以上报某个按钮的点击事件。
// 接口1.设置事件名称
HMTAgent.onAction(Context context,String act_name)
// 接口2.额外设置次数
HMTAgent.onAction(Context context,String act_name,int act_count)
// 接口3.额外设置自定义属性
HMTAgent.onAction(Context context,String act_name,HParams property)
// 接口4.额外设置自定义属性,次数
HMTAgent.onAction(Context context,String act_name,int act_count,HParams property)
**应用场景 1:**一个人想要买车,在App中预约试驾,填写一个预约表单并提交。
首先定义 1 个事件名称叫: register
然后定义一个 4 个属性, name, phone, gender
HParams params = new HParams();
params.setParams("name", "张三");
params.setParams("phone", "186****1234");
params.setParams("gender", "男");
HMTAgent.onAction(context, "register", 1, params);
应用场景 2: 电子商务中提交订单跟踪。
例如:一个男性用户,提交了一个订单,总价格为 28000,包含两件商品:苹果电脑和蓝牙耳机。
HParams params = new HParams();
HashMap<String, Object> map = new HashMap<>();
// 第一个商品相关信息
JSONObject goods_one = new JSONObject();
goods_one.put("name", "苹果电脑");
goods_one.put("type", "数码");
goods_one.put("price", 1000);
goods_one.put("count", 1);
// 第二个商品相关信息
JSONObject goods_two = new JSONObject();
goods_one.put("name", "蓝牙耳机");
goods_one.put("type", "数码");
goods_one.put("price", 100);
goods_one.put("count", 10);
// 放到Array中
JSONArray goods_array = new JSONArray();
goods_array.put(goods_one);
goods_array.put(goods_two);
map.put("goods", goods_array);
map.put("gender", "男");
map.put("total_amount", 28000);
params.setParams(map);
HMTAgent.onAction(context, "buy", params);
应用场景 3: 一个用户在新注册一个账号后,同时关注了多个标签。
例如:一个男性用户关注了 5 个领域的标签,这里的标签也是存在多个,所以采用了数组的类型。
HParams params = new HParams();
params.setParams("labels", new String[]{"数码", "音乐", "体育", "篮球", "动漫"});
params.setParams("gender", "男");
HMTAgent.onAction(context, "follow", params);
SDK 可以帮开发者捕捉用户在使用应用过程中出现的异常退出(FC),并将错误报告发送给服务器,错误报告包含应用程序版本、操作系统版本和设备型号以及程序出现异常时的 Stacktrace 等数据,这些数据可以帮助调试应用程序的错误。
SDK 提供两种方式报告错误信息,一种是 SDK 自动捕获的错误信息,一种是开发者自己传递的错误(详见自定义的错误上报)。
对于自动捕获错误,开发者需要在 AndroidManifest.xml
里面添加权限 android.permission.READ_LOGS
, 并且在程序的 Main Activity(应用程序入口)的 onCreate
方法里调用 HMTAgent.onError(Context context)
方法。
在初始化前调用(记得在发版前去掉)
HMTAgent.enableVisualizedDebug()
当有 SDK 的日志生成时,会有如下弹窗提示,信息包括日志类型和上报域名,可点击复制,将日志内容拷贝至外部查看,其中将包含更多明细的字段。
SDK端开启热图功能需要在初始化方法之前调用HMTAgent.enableHAT()
:
//开启热图功能
HMTAgent. enableHAT()
//开启热图功能日志
HMTAgent.enableHATLog()
// 初始化
HMTAgent.Initialize(Context context)
SDK端开启可视化布码需要在初始化方法之前调用HMTAgent.enableHEAT()
:
//开启热图功能
HMTAgent. enableHEAT()
// 初始化
HMTAgent.Initialize(Context context)
通过 SDK 自动布码抓取页面并不一定能满足全部业务需求,如果想要更改上报的页面名称,可以使用自定义页面布码。(如果仅想更改报表中展示的页面名称,可以在管理端中,通过设置-页面修改页面展示名称)
对需要自定义页面名称的Activity进行修改:
onResume()
中调用 HMTAgent.onResume(Context context,String activityName)
onPause()
中调用 HMTAgent.onPause(Context context,String activityName)
String activityName = "自定义activity名称"
public void onResume() {
super.onResume();
HMTAgent.onResume(this,activityName);
}
public void onPause() {
super.onPause();
HMTAgent.onPause(this, activityName);
}
若不加自定义的页面名称参数,则名称由 SDK 自动获取
注:与 iOS 不同,Android 中页面开始和结束需传入相同的自定义页面名称(或都不传),才会认为是一次页面的进入和离开
自定义属性一般是与自定义事件进行结合使用,但也可以加在页面的上报中,比如需要在上报某个页面的同时记录用户是否为会员,此时可以如下布码:
String activityName = "自定义activity名称"
//页面的OnResume
public void onResume() {
super.onResume();
HMTAgent.onResume(this);
//若加属性同时需要自定义页面名称,参考2.2.2.3.1如下设置
HMTAgent.onResume(this, activityName);
}
//页面OnPause
public void onPause() {
super.onPause();
HParams property = new HParams();
property.setParams("usertype", "menmber");
property.setParams("level", "golden");
HMTAgent.onPause(this,property,null, activityName); //第三个参数为回调函数,不需要可传null
}
以上 property 中使用到的 key 也需要在设置-自定义属性中提前创建,同时也可以修改#activity 自定义该页面的名称
同样,若需要自定义命名页面的名称,需要在页面开始和结束中传入一致的自定义名称。
SDK 提供了临时和永久俩种类型的额外属性,开发者可以针对这俩种属性进行新增和移除操作
SDK 提供枚举类型 HMTCacheState 对属性类型进行设置:
HMTCacheState.HMT_CACHE_TEMPORARY
:表示临时属性HMTCacheState.HMT_CACHE_PERMANENT
:表示永久属性注意:
临时属性
临时属性仅当次设置有效,其生命周期与当次 App 运行内存相同,App 重新打开需重新设置
永久属性
永久属性会多次生效,直到 App 缓存被清除或永久属性被移除
SDK 提供接口 bindExtraProperty(Context,HMTCacheState,String,Object)
来进行单个临时属性的新增操作
public static void bindExtraProperty(Context context, HMTCacheState dataType, String property,Object value)
示例:
String key = "member_level";
String value = "normal";
HMTAgent.bindExtraProperties(mContext,HMTCacheState.HMT_CACHE_TEMPORARY, key,value)
SDK 提供接口 bindExtraProperty(Context,HMTCacheState, JSONObject)
来进行多个临时属性的新增操作
public static void bindExtraProperties(Context context, HMTCacheState dataType, JSONObject properties)
示例:
JSONObject jsonObj = new JSONObject();
String key = "Your Desired Key";
String value = "Corresponding Value";
for (int i = 0; i < 5; i++) {
jsonObj.put(key + i, value + i);
}
HMTAgent.bindExtraProperties(mContext, HMTCacheState.HMT_CACHE_TEMPORARY, jsonObj)
SDK 提供接口 removeExtraProperty(Context,HMTCacheState,String)
来对临时属性进行移除属性的操作
public static void removeExtraProperty(Context context, HMTCacheState dataType, String property)
示例:
String key = "member_level";
HMTAgent.removeExtraProperty(mContext, HMTCacheState.HMT_CACHE_TEMPORARY, key)
SDK 提供接口 bindExtraProperty(Context,HMTCacheState,String,Object)
来进行单个永久属性的新增操作
public static void bindExtraProperty(Context context, HMTCacheState dataType, String property, Object value)
示例:
String key = "Your Desired Key";
String value = "Corresponding Value";
HMTAgent.bindExtraProperties(mContext,HMTCacheState.HMT_CACHE_PERMANENT, key,value)
SDK 提供接口 bindExtraProperty(Context,HMTCacheState, JSONObject)
来进行多个永久属性的新增操作
public static void bindExtraProperties(Context context, HMTCacheState dataType, JSONObject properties)
示例:
JSONObject jsonObj = new JSONObject();
String key = "Your Desired Key";
String value = "Corresponding Value";
for (int i = 0; i < 5; i++) {
jsonObj.put(key + i, value + i);
}
HMTAgent.bindExtraProperties(mContext, HMTCacheState.HMT_CACHE_PERMANENT, jsonObj)
SDK 提供接口 removeExtraProperty(Context,HMTCacheState,String)
来对永久属性进行移除属性的操作
public static void removeExtraProperty(Context context, HMTCacheState dataType, String property)
示例:
String key = "Your Desired Key";
HMTAgent.removeExtraProperty(mContext, HMTCacheState.HMT_CACHE_PERMANENT, key)
当 removeExtraProperty()
接口中传入 key 值为 DELETE-ALL 时(注意大小写),会移除所有永久属性
示例:
String deleteKey = "DELETE-ALL";
HMTAgent.removeExtraProperty(mContext, HMTCacheState.HMT_CACHE_PERMANENT, deleteKey)
在应用开发中经常会出现一个页面嵌套多个子页面(fragement)的情况,如下图,实际页面访问路径为:activity.a -> activity.b.x -> activity.b.y -> activity.c
,但在某些页面结构下(比如 x,y 是两个 fragment),此时自动抓取的访问路径可能会变为:activity.a -> activity.b -> activity.c
此时,需要使用定义页面的方法手动的发送 activity.b.x
和 activity.b.y
,如:
//在activity.b.x进入时
public void onResume() {
super.onResume();
HMTAgent.onResume(this,"activity.b.x");
}
//在activity.b.x离开时
public void onPause() {
super.onPause();
HMTAgent.onPause(this,"activity.b.x");
}
//在activity.b.y进入时
public void onResume() {
super.onResume();
HMTAgent.onResume(this,"activity.b.y");
}
//在activity.b.y离开时
public void onPause() {
super.onPause();
HMTAgent.onPause(this,"activity.b.y");
}
启动时发送的机制下,上报都会存在一定延迟,开发者若觉得有必要增加上报频次可以采用手动发送缓存的方法,如下:
HMTAgent.pushAllData(Context context);
使用上述方法后,会触发手动清除缓存并上报,开发者可根据实际场景触发,如无网切换到有网或用户触发了关键操作等。
SDK 可以开启对错误的自动捕获,但如果有特殊需求,开发者可以调用手动错误上报接口:
调用 HMTAgent.onError(Context context,String string)
方法或 HMTAgent.onError(Context context,String string,HParams property)
方法,其中 string
为捕获的错误信息,property
为自定义参数,property
类型与页面或事件中添加的自定义属性类型相同。
系统中默认使用设备 ID 对用户进行标识,若需要统计登录用户或会员这类的指标,需要使用 SDK 的账号 ID 设置方法。
HMTAgent.bindAccountID(Context ctx,String accountID)
使用该方法生成的账号 ID 仅在当次 APP 生命周期内有效,若要注销账号 ID,传空即可(null 或"");若用户切换账号则传入新值即可。
HMTCallback 参数(回调参数) 对于有数据发送的 api,sdk 提供 HMTCallback
参数,在 sdk 运行完成之后回回调 HMTCallback
的 callbck
方法。支持的 api 如下:
HMTAgent.onPause(Context context)
HMTAgent.onError(Context context,String string)
HMTAgent.onAction(Context context,String act_name)
HMTAgent.postClientData(Context context)
HMTAgent.onReq(String url, String method)
HMTAgent.pushAllData(Context context)
实例
HMTAgent.onPause(context, new HMTCallback(){
@Override
public void callback() {
Log.e("demo==>callback", "activity");
}
});
首先,开发者需要按照第三方推送系统的布码文档进行集成,确保正确集成后,在 App 的初始化过程中通过第三方推送系统提供的方法来获取一个推送 ID,并将这个推送 ID 通过 Hypers-SDK 提供的接口进行绑定操作。
Hypers-SDK 提供俩个重载的 bindPushKey 接口, PUSH_KEY 枚举中预定义了一些代表推送系统的字符串
public static void bindPushKey(Context context, String pushKey, String pushId)
public static void bindPushKey(Context context, PUSH_KEY pushKey, String pushId)
PUSH_KEY
枚举中的 key,可以直接传入字符串以下简单介绍几个第三方推送系统的推送 ID 收集方式
请先参考极光推送 Android 版客户端 SDK 使用指南,将极光推送正确集成到 App 中
集成了 JPush SDK 的应用程序在第一次成功注册到 JPush 服务器时,JPush 服务器会给客户端返回一个唯一的该设备的标识 - RegistrationID。JPush SDK 会以广播的形式发送 RegistrationID 到应用程序。
极光推送版本小于 3.3.0 时,可以使用 自定义广播接收器的形式获取 RegistrationID
<!-- User defined. 用户自定义的广播接收器-->
<!-- 这是3.3.0之前版本的接收方式,3.3.0开始是通过继承 JPushMessageReceiver并配置来接收所有事件回调。-->
<!-- 如果仍然需要在这个Receiver里接收,需要在JPushMessageReceiver 的子类里不重写对应的回调方法,或者重写方法且调用super-->
<receiver
android:name="您自己定义的 Receiver"
android:enabled="true"
android:exported="false">
<intent-filter>
<!--Required 用户注册 SDK 的 intent-->
<action android:name="cn.jpush.android.intent.REGISTRATION" />
<!--Required 用户接收 SDK 消息的 intent-->
<action android:name="cn.jpush.android.intent.MESSAGE_RECEIVED" />
<!--Required 用户接收 SDK 通知栏信息的 intent-->
<action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED" />
<!--Required 用户打开自定义通知栏的 intent-->
<action android:name="cn.jpush.android.intent.NOTIFICATION_OPENED" />
<!-- 接收网络变化 连接/断开 since 1.6.3 -->
<action android:name="cn.jpush.android.intent.CONNECTION" />
<category android:name="您应用的包名" />
</intent-filter>
</receiver>
class MyJPushReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// 收到极光推送初始化成功的广播
if (intent != null &&JPushInterface.ACTION_REGISTRATION_ID == intent.action) {
// 获取极光推送的 RegistrationId
String registrationId = intent.extras.getString(JPushInterface.EXTRA_REGISTRATION_ID)
// 绑定推送ID
HMTAgent.bindPushKey(context, HMTAgent.PUSH_KEY.JPUSH_KEY, registrationId);
}
}
}
极光推送版本大于 3.3.0 时,可以使用 JPushMessageReceiver 的 onRegister() 回调获取 RegistrationID
<!-- Required since 3.0.7 -->
<!-- 新的 tag/alias 接口结果返回需要开发者配置一个自定的广播 -->
<!-- 3.3.0开始所有事件将通过该类回调 -->
<!-- 该广播需要继承 JPush 提供的 JPushMessageReceiver 类, 并如下新增一个 Intent-Filter -->
<receiver
android:name="自定义 Receiver"
android:enabled="true"
android:exported="false" >
<intent-filter>
<action android:name="cn.jpush.android.intent.RECEIVE_MESSAGE" />
<category android:name="您应用的包名" />
</intent-filter>
</receiver>
class MyJPushMsgReceiver extends JPushMessageReceiver {
@Override
void onRegister(Context context,String registrationId) {
super.onRegister(context, registrationId)
// 绑定推送ID
HMTAgent.bindPushKey(context, HMTAgent.PUSH_KEY.JPUSH_KEY, registrationId)
}
}
注意事项: 集成了极光推送的 App 仅在第一次初始化成功时,会发出
JPushInterface.ACTION_REGISTRATION_ID
广播,因此为了确保全部用户能够正确发送推送 ID 至 Hypers-SDK,请在极光推送注册逻辑之后通过JPushInterface.getRegistrationID()
获取推送 ID 并上传。
String registrationId = JPushInterface.getRegistrationID(this);
// 绑定推送ID
HMTAgent.bindPushKey(context, HMTAgent.PUSH_KEY.JPUSH_KEY, registrationId);
请先参考小米推送 Android 版客户端 SDK 使用指南,将小米推送正确集成到 App 中
PushMessageReceiver 是一个抽象的 BroadcastReceiver 类,其中的方法
public void onReceiveRegisterResult(Context context, MiPushCommandMessage message)
可以获取给服务器发送注册命令的结果。
服务器返回的命令封装在 MiPushCommandMessage 的对象中,可以从该对象中获取 command、commandArguments、 resultCode、 reason 等信息。
commandArguments 表示命令的参数。例如: 注册 app 就会返回 app 本次初始化所对应 MiPush 推送服务的唯一标识 regId,alias 就会返回 alias 的内容,订阅和取消订阅主题就会返回 topic,setAcceptTime 就会返回时间段。
通过 PushMessageReceiver 类的 onReceiveRegisterResult() 回调可以获取推送 ID
class MyXiaomiPushMsgReceiver extends PushMessageReceiver {
@Override
public void onReceiveRegisterResult(Context context, MiPushCommandMessage message) {
super.onReceiveRegisterResult(context, message)
String command = message.getCommand();
List<String> arguments = message.getCommandArguments();
String regID = arguments[0]
if (MiPushClient.COMMAND_REGISTER.equals(command)) {
if (message.getResultCode() == ErrorCode.SUCCESS) {
// 绑定推送ID
HMTAgent.bindPushKey(context, HMTAgent.PUSH_KEY.XIAOMI_KEY, regID);
}
}
}
}
请先参考个推 Android 版客户端 SDK 使用指南,将个推正确集成到 App 中
在项目源码中添加一个继承自
com.igexin.sdk.GTIntentService
的类,用于接收 CID、透传消息以及其他推送服务事件
通过 GTintentService.onReceiveClientId()
回调可以获取推送 ID
class MyGTIntentService extends GTIntentService {
override fun onReceiveClientId(Context context, String cid) {
HMTAgent.bindPushKey(context, HMTAgent.PUSH_KEY.GETUI_KEY, cid);
}
}
SDK支持自动采集用户行为(当前支持控件单击事件),开启后可以自动抓取部分按钮事件.
为使用该功能,需要引入插件并且SDK版本需大于等于1.3.4
为引入事件自动抓取功能,需要进行以下设置:
插件设置
在项目根目录下的build.gradle
文件中添加对插件的引用:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.6.2'
//添加 hmt-plugin 依赖
classpath 'com.hypers.analytics:hmt-plugin:1.0.0'
}
}
在主 module 的 build.gradle
文件中添加 com.hypers.analytics
插件:
apply plugin: 'com.hypers.analytics'
添加成功之后执行gradle任务能够看到如下日志:
> Configure project :app
HMT插件已经添加
SDK设置
SDK端开启事件自动抓取功能需要在初始化方法之前调用HMTAgent.enableActionHook(true)
(默认不开启):
HMTAgent.enableActionHook(true);
HMTAgent.Initialize(Context context)
插件提供了DSL进行配置,:
HMTConfig {
// 开启插件日志输出
enableLog = true
}