From 9ad980f666f2e89dd92138b303d2922f23aa33fe Mon Sep 17 00:00:00 2001 From: Matthew Date: Thu, 13 Mar 2025 23:24:25 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=B5=81=E9=87=8F=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/cpp/PhoneDevice.cpp | 23 ++++-- app/src/main/cpp/PhoneDevice.h | 4 +- .../com/xypower/mpapp/MicroPhotoService.java | 71 +++++-------------- .../java/com/xypower/common/NetworkUtils.java | 39 ++++++++++ 4 files changed, 76 insertions(+), 61 deletions(-) diff --git a/app/src/main/cpp/PhoneDevice.cpp b/app/src/main/cpp/PhoneDevice.cpp index d0f40327..65690d87 100644 --- a/app/src/main/cpp/PhoneDevice.cpp +++ b/app/src/main/cpp/PhoneDevice.cpp @@ -534,7 +534,7 @@ CPhoneDevice::CPhoneDevice(JavaVM* vm, jobject service, const std::string& appPa mRequestWakelockMid = env->GetMethodID(classService, "requestWakelock", "(Ljava/lang/String;J)V"); mReleaseWakelockMid = env->GetMethodID(classService, "releaseWakelock", "(Ljava/lang/String;)V"); - mGetSystemInfoMid = env->GetMethodID(classService, "getSystemInfo", "()Ljava/lang/String;"); + mGetFlowInfoMid = env->GetMethodID(classService, "getFlowInfo", "()Ljava/lang/String;"); mInstallAppMid = env->GetMethodID(classService, "installApp", "(Ljava/lang/String;J)Z"); mRebootMid = env->GetMethodID(classService, "reboot", "(IJLjava/lang/String;)V"); mEnableGpsMid = env->GetMethodID(classService, "enableGps", "(Z)V"); @@ -886,6 +886,7 @@ bool CPhoneDevice::QuerySystemProperties(std::map& pro std::map powerInfo; int res = 0; int bv = -1; + std::map flowInfo; for (std::map::iterator it = properties.begin(); it != properties.end(); ++it) { @@ -1045,12 +1046,24 @@ bool CPhoneDevice::QuerySystemProperties(std::map& pro { it->second = std::to_string(m_signalLevel); } + else if ((it->first == (PROP_MOBILE_FLOW_TX)) || (it->first == (PROP_MOBILE_FLOW_RX))) + { + if (!flowInfo.empty()) + { + QueryFlowInfo(powerInfo); + } + auto it2 = flowInfo.find(it->first); + if (it2 != flowInfo.cend()) + { + it->second = it2->second; + } + } /* else if (startsWith(it->first, PROP_JAVA_PREFIX)) { if (powerInfo.empty()) { - QueryPowerInfo(powerInfo); + QueryFlowInfo(powerInfo); } auto it2 = powerInfo.find(it->first); if (it2 != powerInfo.cend()) @@ -1097,7 +1110,7 @@ std::string CPhoneDevice::QueryCpuTemperature() return ""; } -void CPhoneDevice::QueryPowerInfo(std::map& powerInfo) +void CPhoneDevice::QueryFlowInfo(std::map&flowInfo) { JNIEnv* env = NULL; jboolean ret = JNI_FALSE; @@ -1107,7 +1120,7 @@ void CPhoneDevice::QueryPowerInfo(std::map& powerInfo) { ALOGE("Failed to get JNI Env"); } - jobject jobj = env->CallObjectMethod(m_javaService, mGetSystemInfoMid); + jobject jobj = env->CallObjectMethod(m_javaService, mGetFlowInfoMid); std::string str = jstring2string(env, (jstring)jobj); if (didAttachThread) { @@ -1117,7 +1130,7 @@ void CPhoneDevice::QueryPowerInfo(std::map& powerInfo) if (!str.empty()) { std::map queries = parseQuery(str); - powerInfo.swap(queries); + flowInfo.swap(queries); } } diff --git a/app/src/main/cpp/PhoneDevice.h b/app/src/main/cpp/PhoneDevice.h index daced027..d51b5c82 100644 --- a/app/src/main/cpp/PhoneDevice.h +++ b/app/src/main/cpp/PhoneDevice.h @@ -323,7 +323,7 @@ protected: return false; } - void QueryPowerInfo(std::map& powerInfo); + void QueryFlowInfo(std::map& powerInfo); std::string QueryCpuTemperature(); bool OnImageReady(cv::Mat mat); @@ -373,7 +373,7 @@ protected: jmethodID mRequestWakelockMid; jmethodID mReleaseWakelockMid; - jmethodID mGetSystemInfoMid; + jmethodID mGetFlowInfoMid; jmethodID mRebootMid; jmethodID mInstallAppMid; diff --git a/app/src/main/java/com/xypower/mpapp/MicroPhotoService.java b/app/src/main/java/com/xypower/mpapp/MicroPhotoService.java index efa9d299..f7c6a159 100644 --- a/app/src/main/java/com/xypower/mpapp/MicroPhotoService.java +++ b/app/src/main/java/com/xypower/mpapp/MicroPhotoService.java @@ -1412,62 +1412,25 @@ public class MicroPhotoService extends Service { return -1; } - public String getSystemInfo() { - - boolean isXyPlatform = mModelName.startsWith("tb8788"); - - StringBuilder sb = new StringBuilder(); - - IntentFilter intentFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); - Intent intent = getApplicationContext().registerReceiver(null, intentFilter); - - int batteryStatus = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1); - int isCahrging = ((batteryStatus == BatteryManager.BATTERY_STATUS_CHARGING) || - (batteryStatus == BatteryManager.BATTERY_STATUS_FULL)) ? 1 : 0; - - int level = intent.getIntExtra("level", 0); ///电池剩余电量 - int scale = intent.getIntExtra("scale", 0); ///获取电池满电量数值 - // intent.getStringExtra("technology"); ///获取电池技术支持 - // intent.getIntExtra("status",BatteryManager.BATTERY_STATUS_UNKNOWN); ///获取电池状态 - // intent.getIntExtra("plugged", 0); ///获取电源信息 - // intent.getIntExtra("health",BatteryManager.BATTERY_HEALTH_UNKNOWN); ///获取电池健康度 - int bv = intent.getIntExtra("voltage", 0); /// mv - int temp = intent.getIntExtra("temperature", 0); ///获取电池温度 - - BatteryManager manager = (BatteryManager) getSystemService(BATTERY_SERVICE); - // manager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CHARGE_COUNTER); - int bca = manager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CURRENT_AVERAGE); - int bc = manager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CURRENT_NOW); - level = manager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY); - - float bcaVal = (bca < 0) ? ((-bca)/1000000000) : (bca / 1000000000); - - sb.append("&BC=" + Float.toString(bcaVal)); - sb.append("&BV=" + Float.toString(((float)bv) / 1000)); - sb.append("&BP=" + level); - sb.append("&BS=" + scale); - sb.append("&CS=" + isCahrging); - - ConnectivityManager cm = (ConnectivityManager)getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE); - boolean isMetered = cm.isActiveNetworkMetered(); - - sb.append("&NS=" + (isMetered ? "1" : "0")); - - final TelephonyManager telephonyManager = (TelephonyManager) getApplicationContext().getSystemService(Context.TELEPHONY_SERVICE); - - SignalStrength ss = telephonyManager.getSignalStrength(); - // List css = ss.getCellSignalStrengths(); - - if (ss != null) { - int signalLevel = ss.getLevel(); - sb.append("&Signal4G=" + signalLevel); - sb.append("&Signal2G=" + signalLevel); - sb.append("&SL=" + signalLevel); + public String getFlowInfo() { + + Date dt = new Date(); + dt.setDate(1); + dt.setHours(0); + dt.setMinutes(0); + dt.setSeconds(0); + + long startTime = dt.getTime(); + if (dt.getMonth() == 12) { + dt.setYear(dt.getYear() + 1); + dt.setMonth(1); + } else { + dt.setMonth(dt.getMonth() + 1); } + long endTime = dt.getTime() - 1; + NetworkUtils.Usage usage = NetworkUtils.getApplicationQuerySummary(this.getApplicationContext(), startTime, endTime, getApplicationInfo().uid); - // SysApi.getCpuRate(); - - return sb.toString(); + return "RX=" + Long.toString(usage.mobleRxBytes) + "&TX=" + Long.toString(usage.mobleTxBytes); } public boolean installApp(final String path, long delayedTime) { diff --git a/common/src/main/java/com/xypower/common/NetworkUtils.java b/common/src/main/java/com/xypower/common/NetworkUtils.java index 97ba3971..07db48d3 100644 --- a/common/src/main/java/com/xypower/common/NetworkUtils.java +++ b/common/src/main/java/com/xypower/common/NetworkUtils.java @@ -1,6 +1,8 @@ package com.xypower.common; import android.annotation.SuppressLint; +import android.app.usage.NetworkStats; +import android.app.usage.NetworkStatsManager; import android.content.ContentResolver; import android.content.ContentValues; import android.content.Context; @@ -12,6 +14,7 @@ import android.net.NetworkCapabilities; import android.net.NetworkInfo; import android.net.Uri; import android.net.wifi.WifiManager; +import android.os.RemoteException; import android.telephony.TelephonyManager; import android.text.TextUtils; import android.text.format.Formatter; @@ -193,4 +196,40 @@ public class NetworkUtils { */ + public static class Usage { + public long mobleRxBytes;//移动 下载字节 + public long mobleTxBytes;//移动 上传字节 + public String uid;//包名 + } + + + /** + * 获取单个应用流量 + * @param context 上下文 + * @param startTime 开始时间 + * @param endTime 结束时间 + * @param uid 统计应用uid + */ + public static Usage getApplicationQuerySummary(Context context, long startTime, long endTime, int uid) { + Usage usage = new Usage(); + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) { + NetworkStatsManager nsm = (NetworkStatsManager) context.getSystemService(Context.NETWORK_STATS_SERVICE); + assert nsm != null; + try { + NetworkStats mobile = nsm.querySummary(ConnectivityManager.TYPE_MOBILE, null, startTime, endTime); + do { + NetworkStats.Bucket bucket = new NetworkStats.Bucket(); + mobile.getNextBucket(bucket); + if(bucket.getUid() == uid) { + usage.mobleRxBytes += bucket.getRxBytes(); + usage.mobleTxBytes += bucket.getTxBytes(); + } + } while (mobile.hasNextBucket()); + } catch (RemoteException e) { + e.printStackTrace(); + } + } + return usage; + } + }