desc:流量统计

main
xiaowusky 2 years ago
parent 6ac3eea697
commit b11b316100

@ -11,10 +11,15 @@
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> <!-- 修改系统屏幕亮度 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!-- 修改系统屏幕亮度 -->
<uses-permission
android:name="android.permission.WRITE_SETTINGS"
tools:ignore="ProtectedPermissions" />
<!--包使用情况统计-->
<uses-permission
android:name="android.permission.PACKAGE_USAGE_STATS"
tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />

@ -1,11 +1,17 @@
package com.yinuo.safetywatcher
import android.content.Context
import android.content.Intent
import android.net.Uri
import android.os.Build
import android.provider.Settings
import com.yinuo.safetywatcher.watcher.db.DBUtils
import com.yinuo.safetywatcher.watcher.db.entity.Gas
import com.yinuo.safetywatcher.watcher.db.entity.GasType
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
object TestUtils {
@ -46,4 +52,14 @@ object TestUtils {
gasDao.insertAll(gases)
}
}
private fun requestReadNetworkStats(context: Context) {
val intent = Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
// 经过测试,只有在 Android 10 及以上加包名才有效果
// 如果在 Android 10 以下加包名会导致无法跳转
intent.data = Uri.parse("package:" + context.getPackageName())
}
context.startActivity(intent)
}
}

@ -0,0 +1,58 @@
package com.yinuo.safetywatcher.watcher.bean;
import com.yinuo.safetywatcher.watcher.utils.TrafficFormat;
/**
* @author: tjf
* @date: 2022-12-10
* @desc
*/
public class TrafficBean {
private long TotalData;// 总流量数据
private long RxBytes;//移动 下载字节
private long TxBytes;//移动 上传字节
String uid;//包名uid
public String getUid() {
return uid;
}
public void setUid(String uid) {
this.uid = uid;
}
public long getTotalData() {
return TotalData;
}
public void setTotalData(long totalData) {
TotalData = totalData;
}
public long getRxBytes() {
return RxBytes;
}
public void setRxBytes(long rxBytes) {
RxBytes = rxBytes;
}
public long getTxBytes() {
return TxBytes;
}
public void setTxBytes(long txBytes) {
TxBytes = txBytes;
}
@Override
public String toString() {
return "TrafficBean{" +
"TotalData=" + TrafficFormat.formatByte(TotalData) +
", RxBytes=" + TrafficFormat.formatByte(RxBytes) +
", TxBytes=" +TrafficFormat.formatByte( TxBytes )+
'}';
}
}

@ -1,12 +1,16 @@
package com.yinuo.safetywatcher.watcher.ui
import android.annotation.SuppressLint
import android.app.usage.NetworkStatsManager
import android.content.Intent
import android.provider.Settings
import android.view.View
import com.yinuo.safetywatcher.R
import com.yinuo.safetywatcher.databinding.ActivityNetSettingBinding
import com.yinuo.safetywatcher.watcher.base.NoOptionsActivity
import com.yinuo.safetywatcher.watcher.utils.NetworkStatsHelper
import com.yinuo.safetywatcher.watcher.utils.TrafficFormat
class NetSettingActivity : NoOptionsActivity() {
private val mBinding by lazy {
@ -24,12 +28,17 @@ class NetSettingActivity : NoOptionsActivity() {
@SuppressLint("SetTextI18n")
override fun initView() {
mBinding.apply {
val usedValue = 100
tvUsed.text = "流量使用情况:$usedValue G"
itemWifi.setOnClickListener {
Intent.ACTION_FACTORY_TEST
startActivity(Intent(Settings.ACTION_WIFI_SETTINGS))
}
}
//流量使用情况
val systemService = getSystemService(NETWORK_STATS_SERVICE) as NetworkStatsManager
val statsHelper = NetworkStatsHelper(systemService)
val info = statsHelper.getAllDay_MonthMobileInfo(this, false)
val showStr = if (info != null) TrafficFormat.formatByte(info.totalData) else "0B"
mBinding.tvUsed.text = "流量使用情况:$showStr"
}
}

@ -0,0 +1,178 @@
package com.yinuo.safetywatcher.watcher.utils;
import android.annotation.SuppressLint;
import android.app.usage.NetworkStats;
import android.app.usage.NetworkStatsManager;
import android.content.Context;
import android.net.ConnectivityManager;
import android.os.Build;
import android.os.RemoteException;
import android.telephony.TelephonyManager;
import androidx.annotation.RequiresApi;
import com.yinuo.safetywatcher.watcher.bean.TrafficBean;
/**
* @author: tjf
* @date: 2022-12-10
* @desc NetworkStatsHelper
*
* <p> 使
* * NetworkStatsManager networkStatsManager = (NetworkStatsManager) getSystemService(NETWORK_STATS_SERVICE);
* * NetworkStatsHelper helper = new NetworkStatsHelper(networkStatsManager);
* </p>
*/
@RequiresApi(api = Build.VERSION_CODES.M)
public class NetworkStatsHelper {
NetworkStatsManager networkStatsManager;
int packageUid;
public void setPackageUid(int packageUid) {
this.packageUid = packageUid;
}
public NetworkStatsHelper(NetworkStatsManager networkStatsManager) {
this.networkStatsManager = networkStatsManager;
}
public NetworkStatsHelper(NetworkStatsManager networkStatsManager, int packageUid) {
this.networkStatsManager = networkStatsManager;
this.packageUid = packageUid;
}
/**
* 使
*
* @param context
* @param isDayAndMonth
* @return
*/
public TrafficBean getAllDay_MonthMobileInfo(Context context, boolean isDayAndMonth) {
TrafficBean trafficBean = new TrafficBean();
NetworkStats.Bucket bucket;
try {
bucket = networkStatsManager.querySummaryForDevice(ConnectivityManager.TYPE_MOBILE,
getSubscriberId(context, ConnectivityManager.TYPE_MOBILE),
isDayAndMonth ? TrafficFormat.getTimesmorning() : TrafficFormat.getTimesMonthmorning(),
System.currentTimeMillis());
} catch (RemoteException e) {
return trafficBean;
}
if (bucket != null) {
trafficBean.setRxBytes(bucket.getRxBytes());
trafficBean.setTxBytes(bucket.getTxBytes());
trafficBean.setTotalData(bucket.getTxBytes() + bucket.getRxBytes());
}
return trafficBean;
}
// /**
// * 获取所有应用一天使用的移动流量信息
// *
// * @param context 上下文
// * @param startTime 开始时间
// * @return 流量信息
// */
// public TrafficBean getOneDayMobileInfo(Context context, long startTime) {
// TrafficBean trafficBean = new TrafficBean();
// NetworkStats.Bucket bucket;
// try {
// bucket = networkStatsManager.querySummaryForDevice(ConnectivityManager.TYPE_MOBILE,
// getSubscriberId(context, ConnectivityManager.TYPE_MOBILE),
// startTime,
// startTime + 86400000
// );
//
//
// trafficBean.setRxBytes(bucket.getRxBytes());
// trafficBean.setTxBytes(bucket.getTxBytes());
// trafficBean.setTotalData(bucket.getTxBytes() + bucket.getRxBytes());
//
// } catch (RemoteException e) {
// return trafficBean;
//
// }
// return trafficBean;
// }
//
// /**
// * 获取今日 或者今月的 应用 的实时流量使用情况
// *
// * @param context 上下文
// * @param isDayAndMonth 是否是今天还是今月
// * @return 获取今日 或者今月的流量使用情况
// */
// public TrafficBean getSummaryTrafficMobile(Context context, boolean isDayAndMonth) {
// TrafficBean trafficBean = new TrafficBean();
// trafficBean.setUid(packageUid + "");
// NetworkStats networkStats = null;
//
// try {
// networkStats = networkStatsManager.querySummary(
// ConnectivityManager.TYPE_MOBILE,
// getSubscriberId(context, ConnectivityManager.TYPE_MOBILE),
// isDayAndMonth ? DateUtil.getTimesmorning() :DateUtil. getTimesMonthmorning(),
// System.currentTimeMillis());
//
//
// long mobileTraffic = 0;//
// long mobileRx = 0;
// long mobileTx = 0;
// NetworkStats.Bucket bucket = new NetworkStats.Bucket();
// do {
// networkStats.getNextBucket(bucket);
// int summaryUid = bucket.getUid();
// if (packageUid == summaryUid) {
//
// mobileTx += bucket.getTxBytes();
// mobileRx += bucket.getRxBytes();
// }
// } while (networkStats.hasNextBucket());
// mobileTraffic = mobileRx + mobileTx;
//
// trafficBean.setTxBytes(mobileTx);
// trafficBean.setRxBytes(mobileRx);
// trafficBean.setTotalData(mobileTraffic);
//
//
// } catch (RemoteException e) {
// e.printStackTrace();
// } finally {
// if (networkStats != null) {
// networkStats.close();
// }
// }
//
//
// return trafficBean;
// }
/**
* id android 10 null
*
* <uses-permission android:name="android.permission.READ_PHONE_STATE" />
*
* @param context
* @param networkType
* @return null
*/
@SuppressLint("MissingPermission")
private String getSubscriberId(Context context, int networkType) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
return null;
}
if (ConnectivityManager.TYPE_MOBILE == networkType) {
TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
return tm.getSubscriberId();
}
return null;
}
}

@ -0,0 +1,68 @@
package com.yinuo.safetywatcher.watcher.utils;
import java.text.DecimalFormat;
import java.util.Calendar;
/**
* @author tjf
* @desc
*/
public class TrafficFormat {
//定义TB的计算常量
private static final double TB = 1024f * 1024f * 1024f * 1024f;
//定义GB的计算常量
private static final double GB = 1024f * 1024f * 1024f;
//定义MB的计算常量
private static final double MB = 1024f * 1024f;
//定义KB的计算常量
private static final double KB = 1024f;
/**
*
*
* @param data
* @return
*/
public static String formatByte(long data) {
DecimalFormat format = new DecimalFormat("####.##");
if (data < KB) {
return data + "B";
} else if (data < MB) {
return format.format(data / KB) + "KB";
} else if (data < GB) {
return format.format(data / MB) + "MB";
} else if (data < TB) {
return format.format(data / GB) + "GB";
} else {
return "超出统计范围";
}
}
/**
*
*/
public static long getTimesmorning() {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.MILLISECOND, 0);
return (cal.getTimeInMillis());
}
/**
* 0
*/
public static long getTimesMonthmorning() {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.DAY_OF_MONTH, 1); // M月置1
cal.set(Calendar.HOUR_OF_DAY, 0);// H置零
cal.set(Calendar.MINUTE, 0);// m置零
cal.set(Calendar.SECOND, 0);// s置零
cal.set(Calendar.MILLISECOND, 0);// S置零
return cal.getTimeInMillis();
}
}

@ -1,5 +1,5 @@
<resources>
<string name="app_name">My Application</string>
<string name="app_name">Watcher</string>
<string name="setting">设置</string>
<string name="query">数据查询</string>
<string name="wraning">报警记录</string>

Loading…
Cancel
Save