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
*