Android 友盟集成

时间:2016年5月10日21:28:50

作者:JustDo23

版本:友盟SDK v5.6.7 (2016-3-25)

官网:友盟官方网站http://www.umeng.com

01. 添加新应用

注册并登陆官方网站,查看相关的集成文档。按照提示在应用管理界面进行新应用的添加。此处主要目的是为了获取AppKey在应用使用。Android和IOS两个平台不能进行共用,需要进行分开。友盟后台的应用名与实际应用名和包名无关,建议命名为“应用名+平台(IOS/Android)”。


02. 导入SDK

对应Eclipse需要进行官方SDK的下载和导入。对于Android Studio可以使用gradle进行集成。

在Gradle依赖中添加:

dependencies {
    compile 'com.umeng.analytics:analytics:latest.integration'
}

如果无法正常集成请添加如下代码 :

allprojects {
    repositories {
        mavenCentral()     
    }
}

03. 配置AndroidManifest.xml

AndroidManifest.xml的配置主要包括添加权限,填写Appkey和填写渠道id三部分,代码示例如下:

<manifest……>
<uses-sdk android:minSdkVersion="4"></uses-sdk>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<application ……>
……
<activity ……/>
<meta-data android:value="YOUR_APP_KEY" android:name="UMENG_APPKEY"></meta-data>
<meta-data android:value="Channel ID" android:name="UMENG_CHANNEL"/>
</application>    
</manifest>

04. session的统计

在每个Activity的onResume方法中调用 MobclickAgent.onResume(Context) ,
onPause方法中调用 MobclickAgent.onPause(Context)

public void onResume() {
    super.onResume();
    MobclickAgent.onResume(this);
}

public void onPause() {
    super.onPause();
    MobclickAgent.onPause(this);
}
  • 以下内容来自官方文档
  • 确保在所有的Activity中都调用MobclickAgent.onResume()MobclickAgent.onPause()方法,这两个调用将不会阻塞应用程序的主线程,也不会影响应用程序的性能。
  • 注意 如果您的Activity之间有继承或者控制关系请不要同时在父和子Activity中重复添加onPause和onResume方法,否则会造成重复统计,导致启动次数异常增高。(eg.使用TabHost、TabActivity、ActivityGroup时)。
  • 当应用在后台运行超过30秒(默认)再回到前端,将被认为是两个独立的session(启动),例如用户回到home,或进入其他程序,经过一段时间后再返回之前的应用。可通过接口:MobclickAgent.setSessionContinueMillis(long interval) 来自定义这个间隔(参数单位为毫秒)。
  • 如果开发者调用Process.kill或者System.exit之类的方法杀死进程,请务必在此之前调用MobclickAgent.onKillProcess(Context context)方法,用来保存统计数据。
  • 非常重要:必须调用MobclickAgent.onResume()MobclickAgent.onPause()方法,才能够保证获取正确的新增用户、活跃用户、启动次数、使用时长等基本数据。

05. 进行代码添加

  • 根据官方文档的提示,初步在BaseActivity中的onResume()onPause()两个方法中添加友盟的代码。
  • MainActivity中的回退按钮监听方法onBackPressed()中添加友盟的MobclickAgent.onKillProcess(Context context)方法。
  • 至此初步完成了集成。如果整个项目仅仅由Activity构成,以上操作基本完成,友盟SDK已默认统计了每个Activity的跳转路径。页面统计不需要再添加其他代码。如果还有其他的那么需要进行往下操作。

06. 明确方法的意义

  1. MobclickAgent.onResume()MobclickAgent.onPause()方法是用来统计应用时长的(也就是Session时长,当然还包括一些其他功能)
  2. MobclickAgent.onPageStart()MobclickAgent.onPageEnd()方法是用来统计页面跳转的
  3. 以上介绍来自友盟官方文档,写的模棱两可,让人摸不着头绪

07. 针对包含Activity、Fragment或View的应用[自己的项目]

  1. 入口Activity中也就是SplashActivityonCreate()方法中添加方法。

     MobclickAgent.openActivityDurationTrack(false);// 禁止默认的页面统计方式,这样将不会再自动统计Activity。
    
  2. 在之前代码的基础上添加代码。在BaseActivity中的onResume()onPause()两个方法中添加新的代码。代码如下:

     @Override
     protected void onResume() {
         super.onResume();
         MobclickAgent.onPageStart("BaseActivity"); // [统计页面(仅有Activity的应用中SDK自动调用,不需要单独写。参数为页面名称,可自定义)]
         MobclickAgent.onResume(this);// 友盟统计,所有Activity中添加,父类添加后子类不用重复添加
     }
    
     @Override
     protected void onPause() {
         super.onPause();
         MobclickAgent.onPageEnd("BaseActivity"); // [(仅有Activity的应用中SDK自动调用,不需要单独写)保证onPageEnd在onPause之前调用,因为onPause中会保存信息。参数页面名称,可自定义]
         MobclickAgent.onPause(this);// 友盟统计,所有Activity中添加,父类添加后子类不用重复添加
     }
    
  3. BaseFragmentActivity中添加如下代码:

     @Override
     protected void onResume() {
         super.onResume();
         MobclickAgent.onResume(this);// 友盟统计[统计时长],父类添加后子类不用重复添加
     }
    
     @Override
     protected void onPause() {
         super.onPause();
         MobclickAgent.onPause(this);// 友盟统计[统计时长],父类添加后子类不用重复添加
     }
    
  4. BaseFragment中添加如下代码:

     @Override
     public void onResume() {
         super.onResume();
         MobclickAgent.onPageStart("BaseFragment"); // 统计页面
     }
    
     @Override
     public void onPause() {
         super.onPause();
         MobclickAgent.onPageEnd("BaseFragment"); // 统计页面
     }
    
  5. 注意:这些方法的调用,需要保证线性不交叉,每个 onResume 都对应一个 onPause ,每个 Start 都有一个 End 配对。这样才能保证每个页面统计的正确

08. 调试模式

入口Activity 中也就是 SplashActivityonCreate() 方法中添加方法。设置友盟调试模式的开关

MobclickAgent.setDebugMode(DEBUG);// 友盟调试模式开关[打印日志][上线时关闭]

09. 错误统计

  • 友盟默认是打开的,不用程序员再次配置。

  • 如果自己的项目中有全局的异常捕获,则需要自己查看文档进行相应操作。

  • 友盟SDK通过 Thread.UncaughtExceptionHandler 捕获程序崩溃日志,并在程序下次启动时发送到服务器。

  • 配置代码如下:

      MobclickAgent.setCatchUncaughtExceptions(false);// 关闭错误统计
    

10. 发送策略

  • 当走到这里的时候,整个友盟的集成与配置基本上已经完成。
  • 对于发送策略默认是使用的 启动时发送 的策略[在没有获取到在线配置时]。
  • 在打开debug调试模式或者使用集成测试时,不受发送策略控制。

11. 集成测试

  • 集成测试,需要登录友盟之后添加测试设备,通过测试设备发送的日志来方便开发者来检验自己集成友盟是否有效,是否完整。使用集成测试可以查看包括应用版本、渠道名称、自定义事件、页面访问情况等数据。

  • 集成测试时候的测试和真实的数据是相互分离,不用担心两种数据的相互污染。集成测试只能在“管理--集成测试--实时日志”里查看。

  • 如果使用普通测试,测试数据会污染真实的用户数据。

  • 这里需要注意的是,使用集成测试和普通测试两种的第一步操作是一样的,在入口Activity中添加如下的代码:

      MobclickAgent.setDebugMode( true );// 打开调试模式
    
  • 注意:打开调试模式之后,可以在logcat中查看数据是否成功的发送给了友盟服务器,以及在集成过程中的出错原因。友盟相关log的 tagMobclickAgent

12. 添加设备

  • 打开友盟后台之后点击管理-点击集成测试-点击注册设备。进入之后可以看到两种获取设备信息的方法。
  • 根据提示获取设置的信息。将界面中的代码进行复制。

完整代码如下:

import android.Manifest;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Build;
import android.text.TextUtils;

/**
 * [友盟工具]
 *
 * @author JustDo23
 */
public class UMengUtil {

    /**
     * 检查是否具有相关权限[需要6.0及以上版本]
     *
     * @param context    上下文
     * @param permission 被检查的权限
     * @return true, 有权限 false,没有权限
     */
    @SuppressLint("NewApi")
    public static boolean checkPermission(Context context, String permission) {
        boolean result = false;
        if (Build.VERSION.SDK_INT >= 23) {// 6.0及以上版本
            if (context.checkSelfPermission(permission) == PackageManager.PERMISSION_GRANTED) {
                result = true;
            }
        } else {// 6.0以下版本
            PackageManager pm = context.getPackageManager();
            if (pm.checkPermission(permission, context.getPackageName()) == PackageManager.PERMISSION_GRANTED) {
                result = true;
            }
        }
        return result;
    }

    /**
     * 获取手机的设备信息
     *
     * @param context 上下文
     * @return {"device_id": "your_device_id", "mac": "your_device_mac"}
     */
    public static String getDeviceInfo(Context context) {
        try {
            org.json.JSONObject json = new org.json.JSONObject();
            android.telephony.TelephonyManager tm = (android.telephony.TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
            String device_id = null;
            if (checkPermission(context, Manifest.permission.READ_PHONE_STATE)) {
                device_id = tm.getDeviceId();// 获取设备号
            }
            android.net.wifi.WifiManager wifi = (android.net.wifi.WifiManager) context.getSystemService(Context.WIFI_SERVICE);
            String mac = wifi.getConnectionInfo().getMacAddress();// 获取MAC地址
            json.put("mac", mac);
            if (TextUtils.isEmpty(device_id)) {
                device_id = mac;
            }
            if (TextUtils.isEmpty(device_id)) {
                device_id = android.provider.Settings.Secure.getString(context.getContentResolver(), android.provider.Settings.Secure.ANDROID_ID);
            }
            json.put("device_id", device_id);
            return json.toString();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

}
  • 在入口Activity中调用 getDeviceInfo() 方法并进行logcat的打印,同时在LogCat中查看到设备的信息,复制到友盟的后台即可。
  • 在友盟后台填写设备名称以及复制的设置信息,点击确定,即可。在此设置上打开程序,即可看到实时的新。
  • 至此,集成测试中添加设置设备的操作已经完成。

13. 遇到问题以及处理

  • 在完成集成测试之后,启动应用并进入到友盟后台进行观察,发下统计到的PageID只有两个 BaseFragmentBaseActivity这个和想象中的不一样。
    • 此时想到在入口Activity中设置了基于Activity的默认的页面统计模式的关闭。尝试将MobclickAgent.openActivityDurationTrack(false);中的false设置为true后再次进行集成测试。结果发现统计出了所有的BaseActivity的子类,但是没有统计出任何和Fragment有关系的界面。

14. 页面统计路径

  • 在友盟后台,选择应该应用之后,可以选择功能使用,选择页面访问路径,进入之后发现即使是正确集成友盟仍旧没有数据展示。
  • 首先,页面访问路径部分数据可以查看所有版本数据,也可以查看单个版本的数据。另外,目前的时间控件支持昨日和自然周维度查看。
  • 如果使用了集成测试,那么集成测试的数据和用户的真是数据是相互分离的,不会在这里进行查看。
  • 页面访问路径的数据默认情况下是展示昨天的数据。所有当天是无法查看当天的数据的。
  • 未加入已选择版本是无法进行查看数据的。因为友盟为了方便开发者对版本进行管理,所以添加版本管理的功能。没有选择版本的情况下是没有数据的。所以只有将某个或某些版本添加到了已选版本队列中,才会有数据被计算。
  • 版本隐藏了不会显示。如果该版本数据在设置-版本部分被设置为隐藏,那么该版本数据也会不予以展示。
  • 因此,点击左下角的版本管理添加版本之后,第二天进行数据的查看。

补丁

时间:2016年6月19日19:49:39[修改]

作者:JustDo23

简述:功能需要进行添加了。需要进行计数统计。

01. 场景类型设置

之前没有进行设置,这次添加上场景类型的设置。场景类型设置官方接口如下:

MobclickAgent.setScenarioType(Context context, EScenarioType etype)

etype是官方场景,有如下场景:

EScenarioType. E_UM_NORMAL  普通统计场景类型

EScenarioType. E_UM_GAME       游戏场景类型

EScenarioType. E_UM_ANALYTICS_OEM  统计盒子场景类型

EScenarioType. E_UM_GAME_OEM        游戏盒子场景类型

所以,在 入口Activity 中也就是 SplashActivityonCreate() 方法中添加如下代码:

MobclickAgent.setScenarioType(this, MobclickAgent.EScenarioType.E_UM_NORMAL);// 设置统计场景类型为普通统计

02. 自定义事件的统计

在友盟中利用自定义事件统计来实现埋点功能。友盟提供了计数统计计算统计两种。对于两种的概念以及区别,这里不做过多介绍。目前需要实现的功能是计数统计

  • 计数事件:用于统计字符串型变量的消息数及触发设备数。
  • 计算事件:用于统计数值型变量的累计值、均值及分布。

03. 添加事件

在使用计数统计之前,需要先定义相关的事件,也就是需要在Umeng官方网站进行注册事件操作,主要有事件的ID事件的名称事件的类型。注册事件之后服务器才能进行相关的事件处理。需要注意的是事件id可用英文或数字,不要使用中文和特殊字符且不能使用英文句号“.”您可以使用下划线“_”。

注册事件的流程:

  1. 登录Umeng官网
  2. 选择需要统计的项目
  3. 点击统计分析
  4. 点击设置
  5. 点击事件

添加事件

需要注意事件ID的填写规则,以及使用正确的事件类型。另外官方问题提示,自定义事件的代码需要放在Activity里的onResume--onPause之间,请在友盟初始化之后调用事件,不支持在service中统计。

04. 添加计数统计代码

简单计数统计的API代码如下:

MobclickAgent.onEvent(Context context, String eventId);

项目中需要统计Banner图片的点击次数,点击之后都会进行页面的跳转,使用以上代码完全可以实现。在图片的点击事件中添加如下的代码:

MobclickAgent.onEvent(mContext, "banner");// 计算统计,注意事件ID

尤其需要注意的是,代码中的事件ID需要和平台注册的事件ID保持一致。

通过集成测试,可以看到统计数据中包含了自定义事件,以及事件的ID。

05. 含有行为属性的计数统计

除了上边介绍的简单计数统计,官方文档中还介绍了另一种,含有行为属性的计数统计。简单说,就是一次计数统计中可以多个属性,这些属性封装在一个Map集合中,键和值需要进行自定义。项目中虽然没有用到这种,可以学习了解一下。将官方文档中的内容复制如下:

考虑事件在不同属性上的取值,可以调用如下方法:

MobclickAgent.onEvent(Context context, String eventId, HashMap map);

map 为当前事件的属性和取值(Key-Value键值对)。

示例:统计电商应用中“购买”事件发生的次数,以及购买的商品类型及数量,那么在购买的函数里调用:

HashMap<String,String> map = new HashMap<String,String>();
map.put("type","book");
map.put("quantity","3"); 
MobclickAgent.onEvent(mContext, "purchase", map);

06. 小结

从上来看,对于计数统计的实现其实非常简单。

  1. Umeng官方平台注册事件
  2. 代码中点击事件调用 MobclickAgent.onEvent 进行统计

07. 疑问

  • 在一次打开程序到关闭程序之间,对Banner点击了许多次,Umeng统计会自动累加次数?
  • Android和IOS对于同一个埋点,必须设置相同的事件ID么?
  • Android和IOS对于同一个埋点,如果设置了相同的事件ID,Umeng统计会将两个平台的数据相加么?
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,566评论 25 707
  • 在Android工程中集成友盟统计首先需要在友盟官网注册账号并添加新应用,获取Appkey。具体步骤这里不进行叙述...
    不知名bzm阅读 9,118评论 9 23
  •   我们在进行安卓开发的时候,并不能完成所有的功能。目前市场上有许多的服务商给我们提供了各种各样的服务。这里介绍友...
    忆念成风阅读 1,718评论 4 16
  • 【0426今日话题】 今年有计划养成什么好习惯吗?具体打算怎么做? 1、喜欢上步行,每天上下班步行时间总共四十多分...
    小螃谢阅读 81评论 0 0
  • 在不懂事的年纪,偏偏喜欢在自己以为能生活一辈子的女生面前说着海誓山盟。 在不服输的年纪,偏偏喜欢在自己...
    LCYBBDH阅读 338评论 0 1