增加流量统计(尚未完善)

This commit is contained in:
kehaoyuan
2017-07-23 18:36:45 +08:00
parent f6c82dd767
commit 9d27bba6fd
7 changed files with 348 additions and 5 deletions

View File

@ -17,6 +17,7 @@ import com.gh.common.util.DataUtils;
import com.gh.common.util.StringUtils;
import com.gh.common.util.TokenUtils;
import com.gh.gamecenter.BuildConfig;
import com.gh.gamecenter.statistics.AppTrafficUtils;
import com.leon.channel.helper.ChannelReaderUtil;
import com.lightgame.utils.Utils;
import com.umeng.message.IUmengRegisterCallback;
@ -209,9 +210,11 @@ public class AppController extends Application {
// }
// }
// 启用EventBus3.0加速功能
EventBus.builder().addIndex(new EventBusIndex()).installDefaultEventBus();
}
// 启用EventBus3.0加速功能
EventBus.builder().addIndex(new EventBusIndex()).installDefaultEventBus();
AppTrafficUtils.appTraffic(this);
}
private boolean shouldInit() {
ActivityManager am = ((ActivityManager) getSystemService(Context.ACTIVITY_SERVICE));

View File

@ -137,6 +137,9 @@ public class LoginUtils {
@Override
public void onFailure(HttpException e) {
super.onFailure(e);
if (e == null) return;
ResponseBody responseBody = e.response().errorBody();
try {
String string = responseBody.string();

View File

@ -0,0 +1,121 @@
package com.gh.gamecenter.db;
import android.content.Context;
import com.gh.gamecenter.db.info.AppTrafficInfo;
import com.j256.ormlite.dao.Dao;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
/**
* Created by khy on 23/07/17.
*/
public class AppTrafficDao {
private DatabaseHelper helper;
private Dao<AppTrafficInfo, String> dao;
public AppTrafficDao(Context context) {
try {
helper = DatabaseHelper.getHelper(context);
dao = helper.getDao(AppTrafficInfo.class);
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 添加一天的流量信息
*/
public void add(AppTrafficInfo entity) {
try {
dao.create(entity);
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 获取前一天总的使用量
*/
public void getTrafficByAll(AppTrafficInfo entity) {
try {
dao.create(entity);
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 获取最迟一天存储流量的时间戳
*/
public long getLastTime() {
try {
List<AppTrafficInfo> list = dao.queryBuilder().orderBy("time", false).query();
if (list.size() > 0) {
return list.get(0).getTime();
}
} catch (SQLException e) {
e.printStackTrace();
}
return 0;
}
/**
* 获取最迟一天的流量使用情况
*/
public AppTrafficInfo getLastTraffic() {
try {
List<AppTrafficInfo> list = dao.queryBuilder().orderBy("time", false).query();
if (list.size() > 0) {
return list.get(0);
}
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
/**
* 获取平均每天使用的流量情况
*/
public HashMap<String, Long> getMeanByDay() {
try {
HashMap<String, Integer> mapCount = new HashMap<>();
HashMap<String, Long> mapAll = new HashMap<>();
List<AppTrafficInfo> list = dao.queryForAll();
int size = list.size();
if (size > 0) {
for (AppTrafficInfo appTrafficInfo : list) {
HashMap<String, Long> trafficByDay = appTrafficInfo.getTrafficByDay();
for (String s : trafficByDay.keySet()) {
Long value = trafficByDay.get(s);
if (value != null && value != 0 && value != -1) {
mapAll.put(s, mapAll.get(s) + value);
Integer count = mapCount.get(s);
if (count == null) count = 0;
mapCount.put(s, count + 1);
}
}
}
HashMap<String, Long> map = new HashMap<>();
for (String s : mapAll.keySet()) {
map.put(s, mapAll.get(s)/ mapCount.get(s));
}
return map;
}
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
}

View File

@ -4,6 +4,7 @@ import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.support.v4.util.ArrayMap;
import com.gh.gamecenter.db.info.AppTrafficInfo;
import com.lightgame.utils.Utils;
import com.gh.gamecenter.db.info.AppRunTimeInfo;
import com.gh.gamecenter.db.info.CommentInfo;
@ -29,7 +30,7 @@ import java.sql.SQLException;
public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
private static final String DATABASE_NAME = "gh_assist.db";
private static final int DATABASE_VERSION = 6;
private static final int DATABASE_VERSION = 7;
private static DatabaseHelper instance;
private ArrayMap<String, Dao> daos = new ArrayMap<>();
@ -73,6 +74,7 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
TableUtils.createTable(connectionSource, KeFuMarkReadInfo.class);
TableUtils.createTable(connectionSource, NoticeMarkReadInfo.class);
TableUtils.createTable(connectionSource, VersionVoteInfo.class);
TableUtils.createTable(connectionSource, AppTrafficInfo.class);
} catch (SQLException e) {
e.printStackTrace();
}
@ -96,6 +98,7 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
TableUtils.dropTable(connectionSource, KeFuMarkReadInfo.class, true);
TableUtils.dropTable(connectionSource, NoticeMarkReadInfo.class, true);
TableUtils.dropTable(connectionSource, VersionVoteInfo.class, true);
TableUtils.dropTable(connectionSource, AppTrafficInfo.class, true);
onCreate(database, connectionSource);
} catch (SQLException e) {
e.printStackTrace();

View File

@ -10,6 +10,7 @@ import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
/**
* Created by khy on 2016/12/18.
@ -158,7 +159,7 @@ public class LibaoDao {
List<LibaoInfo> infos = dao.queryBuilder().orderBy("time", false).where().eq("libaoId", libaoId).query();
if (infos.size() > 0) {
LibaoInfo libaoInfo = infos.get(0);
SimpleDateFormat formatDay = new SimpleDateFormat("dd");
SimpleDateFormat formatDay = new SimpleDateFormat("dd", Locale.CHINA);
long lingTime = libaoInfo.getTime() * 1000;
long curTime = Utils.getTime(context) * 1000;
int lingDay = Integer.parseInt(formatDay.format(lingTime));

View File

@ -0,0 +1,51 @@
package com.gh.gamecenter.db.info;
import com.j256.ormlite.field.DataType;
import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.table.DatabaseTable;
import java.io.Serializable;
import java.util.HashMap;
/**
* Created by khy on 23/07/17.
*/
@DatabaseTable(tableName = "tb_traffic")
public class AppTrafficInfo implements Serializable {
@DatabaseField(id = true, columnName = "time")
private long time;
// packageName + traffic
@DatabaseField(columnName = "trafficByDay", dataType = DataType.SERIALIZABLE)
private HashMap<String, Long> trafficByDay; // 一天使用的流量
// packageName + traffic
@DatabaseField(columnName = "trafficByAll", dataType = DataType.SERIALIZABLE)
private HashMap<String, Long> trafficByAll; // 总使用的流量
public long getTime() {
return time;
}
public void setTime(long time) {
this.time = time;
}
public HashMap<String, Long> getTrafficByDay() {
return trafficByDay;
}
public void setTrafficByDay(HashMap<String, Long> trafficByDay) {
this.trafficByDay = trafficByDay;
}
public HashMap<String, Long> getTrafficByAll() {
return trafficByAll;
}
public void setTrafficByAll(HashMap<String, Long> trafficByAll) {
this.trafficByAll = trafficByAll;
}
}

View File

@ -0,0 +1,161 @@
package com.gh.gamecenter.statistics;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.net.TrafficStats;
import com.gh.gamecenter.db.AppTrafficDao;
import com.gh.gamecenter.db.info.AppTrafficInfo;
import com.lightgame.utils.Utils;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
/**
* Created by khy on 23/07/17.
*
* 流量统计
*/
public class AppTrafficUtils {
public static void appTraffic(Context context) {
try {
// ConcernManager cManager = new ConcernManager(context);
// List<ConcernInfo> runnableGame = cManager.getInstalledGame();
// if (runnableGame.size() == 0) return; // 没有安装光环助手已有的游戏
AppTrafficDao trafficDao = new AppTrafficDao(context);
long lastTime = trafficDao.getLastTime();
long curTime = Utils.getTime(context) * 1000;
int offsetDay = 1; // 默认
if (lastTime != 0) {
Calendar calendar = Calendar.getInstance();
Date lastDate = new Date(lastTime);
calendar.setTime(lastDate);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.MILLISECOND, 0);
long lastTimeZero = calendar.getTimeInMillis(); // 最后一次保存零点
Date curDate = new Date(curTime);
calendar.setTime(curDate);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.MILLISECOND, 0);
long curTimeZero = calendar.getTimeInMillis(); // 当前时间零点
long zeroOffset = curTimeZero - lastTimeZero;
offsetDay = (int) (zeroOffset / (86400 * 1000));
}
Utils.log("=======偏移天数" + offsetDay);
if (offsetDay == 0) return;
HashMap<String, Long> mapByDay = new HashMap<>(); // 记录一天的流量
HashMap<String, Long> mapByAll = new HashMap<>(); // 记录总的流量
AppTrafficInfo lastTraffic = trafficDao.getLastTraffic();
HashMap<String, Long> lastMapByAll = null;
if (lastTraffic != null) {
lastMapByAll = lastTraffic.getTrafficByAll();
}
PackageManager pm = context.getPackageManager();
// for (ConcernInfo concernInfo : runnableGame) { // 记录光环助手包含的已安装的游戏流量使用情况
// String pkgName = concernInfo.getPackageNames().keySet().iterator().next();
// ApplicationInfo applicationInfo = pm.getApplicationInfo(pkgName, PackageManager.GET_META_DATA);
// int uid = applicationInfo.uid;
//
// long uidRxBytes = TrafficStats.getUidRxBytes(uid);
// long KB = uidRxBytes / 1024;
// Utils.log(pkgName + "==总流量::" + KB + "KB");
//
// if (lastTraffic != null) {
//
// long trafficByDay; // 统计某段时间流量使用情况
// Long lastTrafficByAll = lastMapByAll.get(pkgName); // 最后一次记录的流量使用总数
// if (lastTrafficByAll != null && lastMapByAll.get(pkgName) > KB) { // 特殊情况,本次总的流量比上次记录的小(有可能是手机重启,导致流量表被清空)
// trafficByDay = KB;
// } else if (lastTrafficByAll != null) { // 正常情况,上次有记录,本次总数减去最后一次记录总数得出某段时间使用值
// trafficByDay = KB - lastTrafficByAll;
// } else { // 没有流量记录(并不是所有记录为空而是默认APP没有记录有可能是新安装的),默认为零
// trafficByDay = 0;
// }
//
// Utils.log(pkgName + "==当天流量::" + trafficByDay + "KB");
// mapByDay.put(pkgName, trafficByDay); // 如果上一次没有记录 trafficByDay 为-
//
// }
// mapByAll.put(pkgName, KB);
// }
List<PackageInfo> installedPackages = pm.getInstalledPackages(0);
for (PackageInfo installedPackage : installedPackages) { // 获取第三方应用流量使用情况
if ((installedPackage.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
String pkgName = installedPackage.applicationInfo.packageName;
int uid = installedPackage.applicationInfo.uid;
long uidRxBytes = TrafficStats.getUidRxBytes(uid);
long KB = uidRxBytes / 1024;
Utils.log(installedPackage.applicationInfo.loadLabel(pm).toString() + "==总流量::" + KB + "KB");
if (lastTraffic != null) {
long trafficByDay; // 统计某段时间流量使用情况
Long lastTrafficByAll = lastMapByAll.get(pkgName); // 最后一次记录的流量使用总数
if (lastTrafficByAll != null && lastMapByAll.get(pkgName) > KB) { // 特殊情况,本次总的流量比上次记录的小(有可能是手机重启,导致流量表被清空)
trafficByDay = KB;
} else if (lastTrafficByAll != null) { // 正常情况,上次有记录,本次总数减去最后一次记录总数得出某段时间使用值
trafficByDay = KB - lastTrafficByAll;
} else { // 没有流量记录(并不是所有记录为空而是默认APP没有记录有可能是新安装的),默认为零
trafficByDay = 0;
}
Utils.log(installedPackage.applicationInfo.loadLabel(pm).toString() + "==当天流量::" + trafficByDay + "KB");
mapByDay.put(pkgName, trafficByDay); // 如果上一次没有记录 trafficByDay 为-
}
mapByAll.put(pkgName, KB);
}
}
if (offsetDay == 1) { // 一天统计一次
AppTrafficInfo entity = new AppTrafficInfo();
entity.setTime(curTime);
entity.setTrafficByAll(mapByAll);
entity.setTrafficByDay(mapByDay);
trafficDao.add(entity);
return;
}
if (offsetDay > 1) { // 过程由于种种原因无法一天统计一次, 存储的流量按每天平均存储
for (String s : mapByDay.keySet()) {
mapByDay.put(s, mapByDay.get(s) / offsetDay);
}
for (int i = 0; i < offsetDay; i++) {
AppTrafficInfo entity = new AppTrafficInfo();
long targetTime = curTime - (86400 * 1000) * i;
entity.setTime(targetTime);
entity.setTrafficByAll(mapByAll);
entity.setTrafficByDay(mapByDay);
trafficDao.add(entity);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}