Android 友盟统计的配置及实现(事件报错统计)
Posted BandaYung
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 友盟统计的配置及实现(事件报错统计)相关的知识,希望对你有一定的参考价值。
记得很久以前有做过友盟这个东西,不过这个功能是同事弄的。现在在另一家公司做了,整个项目都是要通过自己开发(菜鸟级)。
最近又做了友盟这个统计的东西,有了似曾相识的感觉,还是觉得蛮好用的,文章也对友盟统计做了整理。主要写成两个工具类。这里希望对大家有所帮助,斗胆说一句,不懂可以问我,必以所知告之于你,没错就是这么热诚。
一、统计到的信息:
1、错误信息
2、新增用户、启动
3、渠道
4、事件统计
二、配置:
详细可以看官网:http://dev.umeng.com/analytics/android-doc/integration#1_2
1、在Gradle依赖中添加:
dependencies
compile 'com.umeng.analytics:analytics:latest.integration'
如果无法正常集成请添加如下代码 :
allprojects
repositories
mavenCentral()
2、manifest的配置主要包括添加权限,以下权限缺一不可,填写Appkey和填写渠道id三部分,代码示例如下:
<manifest……>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<application ……>
……
<activity ……/>
<meta-data android:value="YOUR_APP_KEY" android:name="UMENG_APPKEY"/>
<meta-data android:value="Channel ID" android:name="UMENG_CHANNEL"/>
</application>
</manifest>
andriod 6.0之后,设备信息部分获取有所变动,请参考官网:https://developer.android.com/training/permissions/requesting.html
小技巧:当xml中的targetSdkVersion=x(x<23)时候, 可以正常获取信息(相当于跳过了6.0权限检查)
上面中的Channel ID:这个渠道的一个id,默认要本身的渠道要填写
<meta-data android:value="default" android:name="UMENG_CHANNEL"/>
<meta-data android:value="...." android:name="UMENG_CHANNEL"/>
2.1 填写appkey将<meta-data android:value="YOUR_APP_KEY " android:name="UMENG_APPKEY"></meta-data> 中的YOUR_APP_KEY 替换为您在友盟后台申请的应用Appkey(Appkey可在统计后台的 统计分析->设置->应用信息 页面查看),其他部分均不需改动。2.3 channel填写将<meta-data android:value="Channel ID" android:name="UMENG_CHANNEL"/> 中的Channel ID 替换为您应用的推广渠道名称,channel id自定义。
例如在豌豆荚渠道推广此包,代码示例: <meta-data android:value="Wandoujia" android:name="UMENG_CHANNEL"/>
渠道命名规范
1.可以由英文字母、阿拉伯数字、下划线、中划线、空格、括号组成,可以含汉字以及其他明文字符,但是不建议使用中文命名,会出现乱码。
2.首尾字符不可以为空格
3.不要使用纯数字作为渠道ID
4.最多256个字符
5."unknown" 及其各种大小写形式,作为友盟保留的字段,不可以作为渠道名在您查看数据时,渠道会作为一个数据细分的维度。
三、代码实现,以下做了整理成了两个工具类:
- UmengUtils:统计配置初始化
- UmengEventUtils:事件统计(计数事件)
1、UmengUtils.class
import android.content.Context;
import com.umeng.analytics.MobclickAgent;
/**
* Created by SoBan on 2017/3/23.
* Describe: 统计配置初始化
*/
public class UmengUtils
/**
* 在Application中做的初始化
*/
public static void initUmeng()
MobclickAgent.setDebugMode(true);//开启调试模式(如果不开启debug运行不会上传umeng统计)
MobclickAgent.openActivityDurationTrack(false);
// AnalyticsConfig.setChannel(Common.getChannel());
/**
* 在BaseActivity跟BaseFragmentActivity中的onResume加入
*
* @param context
*/
public static void onResumeToActivity(Context context)
MobclickAgent.onPageStart(context.getClass().getName());
MobclickAgent.onResume(context);
/**
* 在BaseActivity跟BaseFragmentActivity中的onPause加入
*
* @param context
*/
public static void onPauseToActivity(Context context)
MobclickAgent.onPageEnd(context.getClass().getName());
MobclickAgent.onPause(context);
/**
* 在BaseFragment中的onResume加入
*
* @param context
*/
public static void onResumeToFragment(Context context)
MobclickAgent.onPageStart(context.getClass().getName());
/**
* 在BaseFragment中的onPause加入
*
* @param context
*/
public static void onPauseToFragment(Context context)
MobclickAgent.onPageEnd(context.getClass().getName());
/**
* 在登录成功的地方调用
*
* @param userId 用户id
*/
public static void onLogin(String userId)
MobclickAgent.onProfileSignIn(userId);
/**
* 在退出登录的地方调用
*/
public static void onLogout()
MobclickAgent.onProfileSignOff();
2、UmengEventUtils.class:事件统计的工具类(以我的项目为例要统计以下5点)
- 首次安装:手机型号,mac,imsi,imei
- 登录:用户userid,手机号,手机型号,mac,imsi,imei
- 退出:用户userid
- 充值:商品id, 商品名,用户userid,手机号,支付方式,支付价格
- 扫码app支付:商家id,商家名,用户userid, 手机号,支付方式,支付价格
import android.content.Context;
import com.umeng.analytics.MobclickAgent;
import org.chiki.base.utils.CommonUtils;
import java.util.HashMap;
/**
* Created by SoBan on 2017/3/23.
* Describe: 事件统计(计数事件)
*/
public class UmengEventUtils
private static final String DEVICEID = "deviceid";
private static final String IMSI = "imsi";
private static final String MAC = "mac";
private static final String PHONEMODEL = "phone_model";
private static final String USERID = "userid";
private static final String PHONE = "phone";
private static final String GOODSID = "goodsid";
private static final String GOODSNAME = "goodsname";
private static final String SHOPID = "shopid";
private static final String SHOPNAME = "shopname";
private static final String PRICE = "price";
private static final String PAYWAY = "payway";
/**
* 首次安装
*
* @param ctx
*/
public static void toInstallClick(Context ctx)
HashMap<String, String> map = getInstallMap(ctx);
MobclickAgent.onEvent(ctx, "install", map);
/**
* 登录
*
* @param ctx
* @param userId
* @param phone
*/
public static void toLoginClick(Context ctx, String userId, String phone)
HashMap<String, String> map = getInstallMap(ctx);
map.put(USERID, userId);
map.put(PHONE, phone);
MobclickAgent.onEvent(ctx, "login", map);
/**
* 退出
*
* @param ctx
* @param userId
*/
public static void toLogoutClick(Context ctx, String userId)
HashMap<String, String> map = getInstallMap(ctx);
map.put(USERID, userId);
MobclickAgent.onEvent(ctx, "logout", map);
/**
* 充值
*
* @param ctx
* @param userId
* @param goodsId
* @param goodsName
* @param price
* @param payway
*/
public static void toRechargeClick(Context ctx, String userId, String phone,
String goodsId, String goodsName, int price, String payway)
HashMap<String, String> map = new HashMap<String, String>();
map.put(USERID, userId);
map.put(PHONE, phone);
map.put(GOODSID, goodsId);
map.put(GOODSNAME, goodsName);
map.put(PRICE, String.valueOf(price));
map.put(PAYWAY, payway);
MobclickAgent.onEvent(ctx, "recharge", map);
/**
* 扫码app支付
*
* @param ctx
* @param userId
* @param phone
* @param shopId
* @param shopName
* @param price
* @param payway
*/
public static void toSweepPaymentClick(Context ctx, String userId, String phone,
String shopId, String shopName, int price, String payway)
HashMap<String, String> map = new HashMap<String, String>();
map.put(USERID, userId);
map.put(PHONE, phone);
map.put(SHOPID, shopId);
map.put(SHOPNAME, shopName);
map.put(PRICE, String.valueOf(price));
map.put(PAYWAY, payway);
MobclickAgent.onEvent(ctx, "sweeppayment", map);
private static HashMap<String, String> getInstallMap(Context ctx)
HashMap<String, String> map = new HashMap<String, String>();
map.put(PHONEMODEL, CommonUtils.getPhoneModel());
map.put(DEVICEID, CommonUtils.getDeviceId(ctx));
map.put(IMSI, CommonUtils.getIMSI(ctx));
map.put(MAC, CommonUtils.getLocalMacAddressFromWifiInfo(ctx));
return map;
3、CommonUtils.class:获取系统信息类
public class CommonUtils
/**
* 获取版本号(内部识别号) = 101
*
* @param context
* @return
*/
public static int getVersionCode(Context context)
try
PackageInfo pi = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
return pi.versionCode;
catch (PackageManager.NameNotFoundException e)
// TODO Auto-generated catch block
e.printStackTrace();
return 0;
/**
* 获取版本号 = "1.0.1";
*
* @param context
* @return
*/
public static String getVersionName(Context context)
try
PackageInfo pi = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
return pi.versionName;
catch (PackageManager.NameNotFoundException e)
// TODO Auto-generated catch block
e.printStackTrace();
return "未知版本";
/**
* 获取IMEI标识(手机唯一的标识)
*
* @param context
* @return
*/
public static String getDeviceId(Context context)
TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
String device_id = tm.getDeviceId();
//如果Android Pad没有IMEI,用此方法获取设备ANDROID_ID
if (TextUtils.isEmpty(device_id))
device_id = android.provider.Settings.Secure.getString(context.getContentResolver(),
android.provider.Settings.Secure.ANDROID_ID);
return device_id;
/**
* 获取运营商sim卡imsi号
*
* @return
*/
public static String getIMSI(Context context)
TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
String android_imsi = tm.getSubscriberId();
return android_imsi;
/**
* 根据Wifi信息获取本地Mac
*
* @param context
* @return
*/
public static String getLocalMacAddressFromWifiInfo(Context context)
WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
WifiInfo info = wifi.getConnectionInfo();
return info.getMacAddress();
/**
* 获取ip地址
*
* @return
*/
public static String getHostIP()
String hostIp = "";
try
Enumeration nis = NetworkInterface.getNetworkInterfaces();
InetAddress ia = null;
while (nis.hasMoreElements())
NetworkInterface ni = (NetworkInterface) nis.nextElement();
Enumeration<InetAddress> ias = ni.getInetAddresses();
while (ias.hasMoreElements())
ia = ias.nextElement();
if (ia instanceof Inet6Address)
continue;// skip ipv6
String ip = ia.getHostAddress();
if (!"127.0.0.1".equals(ip))
hostIp = ia.getHostAddress();
break;
catch (SocketException e)
Log.i("yao", "SocketException");
e.printStackTrace();
return hostIp;
/**
* 获取手机型号
*
* @return
*/
public static String getPhoneModel()
String model = Build.MODEL;
if (TextUtils.isEmpty(model))
return "";
return model;
/**
* 获取手机系统版本号
*
* @return
*/
public static String getVersionRelease()
String version = Build.VERSION.RELEASE;
if (TextUtils.isEmpty(version))
return "";
return version;
四、这些配置跟代码都实现了,之后现在就是要来看看平台上的数据是否有咯,对吧!各位应该都是这么想的,那就对了,跟我一开始是一样的。不过在平台上,如果你还是没有看到统计的信息的话,个人觉得有以下几点:
1、MobclickAgent.setDebugMode(true);//开启调试模式(如果不开启debug运行不会上传umeng统计)2、查看是不是配置是否正确
3、平台上的设置-->使用账号统计报表-->启动使用
4、若有事件管理处重置某个事件,那么这个事件要在次日在起作用
五、效果展示:
这里有必要说说图一:这个是事件统计的事件管理,点击事件id就可以看到里面的很多之前设置的事件要统计的userid,设备等等,具体可以看图二效果
以上是关于Android 友盟统计的配置及实现(事件报错统计)的主要内容,如果未能解决你的问题,请参考以下文章