Files
assistant-android/app/src/main/java/com/gh/common/util/TrafficUtils.java

189 lines
7.3 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.gh.common.util;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.net.TrafficStats;
import java.util.Calendar;
import java.util.List;
public class TrafficUtils {
static TrafficUtils instance;
DB db;
Context context;
private TrafficUtils(Context context) {
this.context = context.getApplicationContext();
db = new DB(this.context);
}
public static TrafficUtils getInstance(Context context) {
return getInstance(context, false);
}
public static TrafficUtils getInstance(Context context, boolean update) {
if (instance == null) {
synchronized (TrafficUtils.class) {
if (instance == null) {
instance = new TrafficUtils(context);
}
}
}
if (update) {
instance.update();
}
return instance;
}
public void update() {
// 获取所有的安装在手机上的应用软件的信息,并且获取这些软件里面的权限信息
PackageManager pm = context.getPackageManager();// 获取系统应用包管理
// 获取每个包内的androidmanifest.xml信息它的权限等等
List<PackageInfo> pinfos = pm.getInstalledPackages(PackageManager.GET_PERMISSIONS);
// 遍历每个应用包信息
for (PackageInfo info : pinfos) {
// 请求每个程序包对应的androidManifest.xml里面的权限
String[] premissions = info.requestedPermissions;
if (premissions != null && premissions.length > 0) {
// 找出需要网络服务的应用程序
for (String premission : premissions) {
if ("android.permission.INTERNET".equals(premission)) {
// 获取每个应用程序在操作系统内的进程id
int uId = info.applicationInfo.uid;
// 如果返回-1代表不支持使用该方法注意必须是2.2以上的
long rx = TrafficStats.getUidRxBytes(uId);
// 如果返回-1代表不支持使用该方法注意必须是2.2以上的
long tx = TrafficStats.getUidTxBytes(uId);
if (rx >= 0 && tx >= 0) {
db.update(info.packageName, rx + tx);
}
}
}
}
}
db.clean(Calendar.getInstance().getTimeInMillis() - 3600 * 24 * 30);
}
public long getTraffic(List<String> packageNameList) {
return this.getTraffic(packageNameList, Calendar.getInstance()
.getTimeInMillis() - 3600 * 24 * 7);
}
public long getTraffic(List<String> packageNameList, long from) {
return this.getTraffic(packageNameList, from, Calendar.getInstance()
.getTimeInMillis());
}
public long getTraffic(List<String> packageNameList, long from, long to) {
long traffic = 0;
for (String packageName : packageNameList) {
traffic += db.getTraffic(packageName, from, to);
}
return traffic;
}
public long getTraffice(String packageName) {
return db.getTraffic(packageName, Calendar.getInstance()
.getTimeInMillis() - 3600 * 24 * 7);
}
public long getTraffice(String packageName, long from) {
return db.getTraffic(packageName, from);
}
class DB extends SQLiteOpenHelper {
static final String name = "gh_traffic.db";
static final int version = 1;
String traffic = "CREATE TABLE traffic(" + "package text,"
+ "traffic integer not null," + "time integer not null" + ");";
public DB(Context context) {
super(context, name, null, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(traffic);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
public void update(String packageName, long traffic) {
String sql = "INSERT INTO traffic (package, traffic, time) VALUES (?, ?, ?)";
Object[] bindArgs = new Object[]{packageName, traffic,
Calendar.getInstance().getTimeInMillis()};
this.getWritableDatabase().execSQL(sql, bindArgs);
}
public void clean(long time) {
String sql = "DELETE FROM traffic WHERE time < ? ";
Object[] bindArgs = new Object[]{time};
this.getWritableDatabase().execSQL(sql, bindArgs);
}
public long getTraffic(String packageName, long from) {
return getTraffic(packageName, from, Calendar.getInstance()
.getTimeInMillis());
}
public long getTraffic(String packageName, long from, long to) {
long traffic = 0;
String sql = "SELECT * FROM traffic WHERE package = ? AND time >= ? AND time <= ? ORDER BY time DESC";
String selectionArgs[] = new String[]{packageName,
String.valueOf(from), String.valueOf(to)};
Cursor cursor = this.getReadableDatabase().rawQuery(sql,
selectionArgs);
if (cursor.getCount() > 1) {
cursor.moveToFirst();
long traffic1 = cursor
.getLong(cursor.getColumnIndex("traffic"));
// long time1 = cursor.getLong(cursor.getColumnIndex("time"));
cursor.moveToLast();
long traffic2 = cursor
.getLong(cursor.getColumnIndex("traffic"));
// long time2 = cursor.getLong(cursor.getColumnIndex("time"));
traffic = traffic1 - traffic2;
// long cha = traffic1 - traffic2;
// if(cha > 0){
// traffic = cha / (time2 - time1);
// }
} else if (cursor.getCount() == 1) {
sql = "SELECT * FROM traffic WHERE package = ? AND time < ? ORDER BY time DESC";
selectionArgs = new String[]{packageName,
String.valueOf(from)};
Cursor cursor2 = this.getReadableDatabase().rawQuery(sql,
selectionArgs);
if (cursor2.moveToNext()) {
cursor.moveToFirst();
long traffic1 = cursor.getLong(cursor
.getColumnIndex("traffic"));
// long time1 =
// cursor.getLong(cursor.getColumnIndex("time"));
long traffic2 = cursor2.getLong(cursor
.getColumnIndex("traffic"));
// long time2 =
// cursor2.getLong(cursor.getColumnIndex("time"));
traffic = traffic1 - traffic2;
// long cha = traffic1 - traffic2;
// if(cha > 0){
// traffic = cha / (time2 - time1);
// }
}
cursor2.close();
}
cursor.close();
return traffic;
}
}
}