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 友盟统计的配置及实现(事件报错统计)的主要内容,如果未能解决你的问题,请参考以下文章

android-------- 多渠道打包(借助友盟移动统计分析)

友盟统计 实例

iOS友盟统计及错误处理

unity添加友盟统计(支持Android和IOS)

ios 友盟统计

android分渠道打包,监测日活量统计(基于友盟SDK)