Android 基于开源Countly的App统计平台开发 [2]源码分析

Countly下载的原工程中,如博客http://blog.csdn.net/changemyself/article/details/12653151,所说的,一共只有两个包,一个管理UDID的,一个是Countly的核心。
首先说一个巨大的变化,不同于上面博客的是,我与2014年7月下载Countly Android SDK,其记录缓存机制已经不使用数据库,而全部改用SharedPreference,使得容错能力获得极大提高。

下面先贴出我修改后的工程结构:
图片描述

OpenUDID包我没有做修改,还是沿用原来的源码,

countly包:

CountlyStore.java,DeviceInfo.java,UploadUtils.java三个文件都是辅助类,Countly是核心类,首先简要了解三个辅助类的源码
UploadUtils.java 是我自己添加了post上传的封装方法,就是post上传,就占用篇幅了。
DeviceInfo : 主要是获取手机中的各类信息,其中的channel表示市场渠道号,是自己在manifest的metadata里定义的
而getMetrics是对外的主要方法,可以把信息收集起来,并做成json字符串的格式

class DeviceInfo {

//---------------自定义meta-------------------

private static String DEFAULT_CHANNEL ="1000";

/**
 * 获取发布渠道信息
 * @param context
 * @return
 */
public static String getChannel(Context context){
    String msg = DEFAULT_CHANNEL;
    ApplicationInfo appInfo;
    try {
        appInfo = context.getPackageManager()
                .getApplicationInfo(context.getPackageName(),
                        PackageManager.GET_META_DATA);
        msg=appInfo.metaData.getInt("channel")+"";
    } catch (Exception e) {
        // TODO Auto-generated catch block
        //e.printStackTrace();
        msg="0000";
    }
    return msg;
}


//---------------唯一标识UDID-------------------

/**
 * 设备通用统一标识符(注意是从OpenUDID_manager里取,不是直接获得)
 * @return
 */
public static String getUDID() {
    return OpenUDID_manager.isInitialized() == false ? "REPLACE_UDID" : OpenUDID_manager.getOpenUDID();
}


   //---------------系统固有信息-------------------

/**
 * get current connected network type
 * 
 * @return
 */
public static String getNetType(Context context) { 
    String type = null;
    ConnectivityManager conMan = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo info = conMan.getActiveNetworkInfo();
    if (info != null) // TYPE_MOBILE
    {
        switch (info.getType()) {
        case ConnectivityManager.TYPE_MOBILE:
            switch (info.getSubtype()) {
            case TelephonyManager.NETWORK_TYPE_EDGE:
                type = "EDGE";
                break;
            case TelephonyManager.NETWORK_TYPE_CDMA:
                type = "CDMA";
                break;
            case TelephonyManager.NETWORK_TYPE_GPRS:
                type = "GPRS";
                break;
            case TelephonyManager.NETWORK_TYPE_EVDO_0:
                type = "EVDO_0";    
                break;
            case TelephonyManager.NETWORK_TYPE_UNKNOWN:
                type = "UNKOWN";
                break;
            }
            break;
        case ConnectivityManager.TYPE_WIFI:
            type = "wifi";
            break;
        }
    } else
        type = "outofnetwork";
    return type;
}

/**
 * 系统类型
 * @return
 */
public static String getOS() {
    return "Android";
}

/**
 * 系统版本号
 * @return
 */
public static String getOSVersion() {
    return android.os.Build.VERSION.RELEASE;
}


/**
 * 手机型号
 * @return
 */
public static String getDevice() {
    return android.os.Build.MODEL;
}

/**
 * 分辨率
 * @param context
 * @return like “480x800”
 */
public static String getResolution(Context context) {
    WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);

    Display display = wm.getDefaultDisplay();

    DisplayMetrics metrics = new DisplayMetrics();
    display.getMetrics(metrics);

    return metrics.widthPixels + "x" + metrics.heightPixels;
}

/**
 * 获取屏幕密度分级
 * @param context
 * @return
 */
public static String getDensity(Context context) {
    int density = context.getResources().getDisplayMetrics().densityDpi;

    switch (density) {
        case DisplayMetrics.DENSITY_LOW:
            return "LDPI";
        case DisplayMetrics.DENSITY_MEDIUM:
            return "MDPI";
        case DisplayMetrics.DENSITY_TV:
            return "TVDPI";
        case DisplayMetrics.DENSITY_HIGH:
            return "HDPI";
        case DisplayMetrics.DENSITY_XHIGH:
            return "XHDPI";
        case DisplayMetrics.DENSITY_XXHIGH:
            return "XXHDPI";
//                not support on android 4.1.2
//            case DisplayMetrics.DENSITY_XXXHIGH:
//                return "XXXHDPI";
            default:
            return "";
    }
}


/**
 * 运营商名
 * @param context
 * @return
 */
public static String getCarrier(Context context) {
    try {
        TelephonyManager manager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        return manager.getNetworkOperatorName();
    } catch (NullPointerException npe) {
        npe.printStackTrace();
        Log.e("Countly", "No carrier found");
    }
    return "";
}

/**
 * 获得本地化信息
 * @return “语言_国家”
 */
public static String getLocale() {
    Locale locale = Locale.getDefault();
    return locale.getLanguage() + "_" + locale.getCountry();
}

/**
 * app 版本
 * @param context
 * @return
 */
public static String appVersion(Context context) {
    String result = "1.0";
    try {
        result = context.getPackageManager().getPackageInfo(context.getPackageName(), 0).versionName;
    } catch (NameNotFoundException e) {
    }

    return result;
}

/**
 * 把设备和app信息组装成json
 * @param context
 * 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值