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.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <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 <uses-permission
android:name="android.permission.WRITE_SETTINGS" android:name="android.permission.WRITE_SETTINGS"
tools:ignore="ProtectedPermissions" /> 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.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.CAMERA" />

@ -1,11 +1,17 @@
package com.yinuo.safetywatcher 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.DBUtils
import com.yinuo.safetywatcher.watcher.db.entity.Gas import com.yinuo.safetywatcher.watcher.db.entity.Gas
import com.yinuo.safetywatcher.watcher.db.entity.GasType import com.yinuo.safetywatcher.watcher.db.entity.GasType
import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
object TestUtils { object TestUtils {
@ -46,4 +52,14 @@ object TestUtils {
gasDao.insertAll(gases) 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 package com.yinuo.safetywatcher.watcher.ui
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.app.usage.NetworkStatsManager
import android.content.Intent import android.content.Intent
import android.provider.Settings import android.provider.Settings
import android.view.View import android.view.View
import com.yinuo.safetywatcher.R import com.yinuo.safetywatcher.R
import com.yinuo.safetywatcher.databinding.ActivityNetSettingBinding import com.yinuo.safetywatcher.databinding.ActivityNetSettingBinding
import com.yinuo.safetywatcher.watcher.base.NoOptionsActivity import com.yinuo.safetywatcher.watcher.base.NoOptionsActivity
import com.yinuo.safetywatcher.watcher.utils.NetworkStatsHelper
import com.yinuo.safetywatcher.watcher.utils.TrafficFormat
class NetSettingActivity : NoOptionsActivity() { class NetSettingActivity : NoOptionsActivity() {
private val mBinding by lazy { private val mBinding by lazy {
@ -24,12 +28,17 @@ class NetSettingActivity : NoOptionsActivity() {
@SuppressLint("SetTextI18n") @SuppressLint("SetTextI18n")
override fun initView() { override fun initView() {
mBinding.apply { mBinding.apply {
val usedValue = 100
tvUsed.text = "流量使用情况:$usedValue G"
itemWifi.setOnClickListener { itemWifi.setOnClickListener {
Intent.ACTION_FACTORY_TEST Intent.ACTION_FACTORY_TEST
startActivity(Intent(Settings.ACTION_WIFI_SETTINGS)) 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> <resources>
<string name="app_name">My Application</string> <string name="app_name">Watcher</string>
<string name="setting">设置</string> <string name="setting">设置</string>
<string name="query">数据查询</string> <string name="query">数据查询</string>
<string name="wraning">报警记录</string> <string name="wraning">报警记录</string>

Loading…
Cancel
Save