From 7a60b905be52cc9706fee71496ec5122203642d0 Mon Sep 17 00:00:00 2001 From: Matthew Date: Tue, 4 Jun 2024 13:03:16 +0800 Subject: [PATCH] =?UTF-8?q?=E8=87=AA=E6=A3=80=E6=A3=80=E6=9F=A5TF=E5=8D=A1?= =?UTF-8?q?=E5=8F=AF=E7=94=A8=E7=A9=BA=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/cpp/MicroPhoto.cpp | 5 +- app/src/main/cpp/PhoneDevice.cpp | 9 ++++ app/src/main/cpp/PhoneDevice.h | 5 ++ .../com/xypower/mpapp/MicroPhotoService.java | 12 +++-- .../com/xypower/common/MicroPhotoContext.java | 47 +++++++++++++++++++ 5 files changed, 74 insertions(+), 4 deletions(-) diff --git a/app/src/main/cpp/MicroPhoto.cpp b/app/src/main/cpp/MicroPhoto.cpp index 8d55d7c7..652222ff 100644 --- a/app/src/main/cpp/MicroPhoto.cpp +++ b/app/src/main/cpp/MicroPhoto.cpp @@ -274,7 +274,7 @@ Java_com_xypower_mpapp_MicroPhotoService_init( jobject pThis, jstring appPath, jstring ip, jint port, jstring cmdid, jint protocol, jint networkProtocol, jint encryptData, jlong netHandle, jint signalLevel, - jint versionCode, jlong buildTime, jstring simcard) { + jint versionCode, jlong buildTime, jstring simcard, jstring tfCardPath) { /* google_breakpad::MinidumpDescriptor descriptor("."); @@ -303,6 +303,7 @@ Java_com_xypower_mpapp_MicroPhotoService_init( const char *ipStr = env->GetStringUTFChars(ip, 0); const char *cmdidStr = env->GetStringUTFChars(cmdid, 0); const char *simcardStr = env->GetStringUTFChars(simcard, 0); + const char *tfCardPathStr = env->GetStringUTFChars(tfCardPath, 0); JavaVM* vm = NULL; jint ret = env->GetJavaVM(&vm); @@ -318,6 +319,7 @@ Java_com_xypower_mpapp_MicroPhotoService_init( device->UpdateSignalLevel(signalLevel); device->SetBuildTime(buildTime / 1000); device->UpdateSimcard(simcardStr); + device->UpdateTfCardPath(tfCardPathStr == NULL ? "" : std::string(tfCardPathStr)); pTerminal->InitServerInfo(appPathStr, cmdidStr, ipStr, port, udpOrTcp, encryptData); // pTerminal->SetPacketSize(1 * 1024); // 1K @@ -330,6 +332,7 @@ Java_com_xypower_mpapp_MicroPhotoService_init( env->ReleaseStringUTFChars(ip, ipStr); env->ReleaseStringUTFChars(cmdid, cmdidStr); env->ReleaseStringUTFChars(simcard, simcardStr); + env->ReleaseStringUTFChars(tfCardPath, tfCardPathStr); if (!res) { diff --git a/app/src/main/cpp/PhoneDevice.cpp b/app/src/main/cpp/PhoneDevice.cpp index de1416c9..0d3bbe98 100644 --- a/app/src/main/cpp/PhoneDevice.cpp +++ b/app/src/main/cpp/PhoneDevice.cpp @@ -410,6 +410,15 @@ bool CPhoneDevice::SelfTest(std::string& result) double fmp = ((double)fm * 100.0f) / ((double)tm); result += std::string("可用内存:") + std::to_string((int)fmp) + std::string("%%\r\n"); + if (!m_tfCardPath.empty()) + { + fs::space_info si2 = fs::space(m_tfCardPath.c_str()); + double fr2 = ((double)si2.available * 100.0f) / ((double)si2.capacity); + result += "TF卡可用空间:"; + result += std::to_string((int)fr2); + result += "%%\r\n"; + } + return true; } diff --git a/app/src/main/cpp/PhoneDevice.h b/app/src/main/cpp/PhoneDevice.h index 95200681..7408fa09 100644 --- a/app/src/main/cpp/PhoneDevice.h +++ b/app/src/main/cpp/PhoneDevice.h @@ -203,6 +203,10 @@ public: void UpdatePosition(double lon, double lat, double radius, time_t ts); bool OnVideoReady(bool result, const char* path, unsigned int photoId); void UpdateSignalLevel(int signalLevel); + void UpdateTfCardPath(const std::string& tfCardPath) + { + m_tfCardPath = tfCardPath; + } void SetBuildTime(time_t buildTime) { mBuildTime = buildTime; @@ -267,6 +271,7 @@ protected: JavaVM* m_vm; jobject m_javaService; std::string m_appPath; + std::string m_tfCardPath; jmethodID mRegisterHeartbeatMid; jmethodID mUpdateCaptureScheduleMid; diff --git a/app/src/main/java/com/xypower/mpapp/MicroPhotoService.java b/app/src/main/java/com/xypower/mpapp/MicroPhotoService.java index 2ed146c4..ee67300a 100644 --- a/app/src/main/java/com/xypower/mpapp/MicroPhotoService.java +++ b/app/src/main/java/com/xypower/mpapp/MicroPhotoService.java @@ -662,13 +662,17 @@ public class MicroPhotoService extends Service { MicroPhotoService service = MicroPhotoService.this; - int versionCode = MicroPhotoContext.getVersionCode(MicroPhotoService.this.getApplicationContext()); + Context context = service.getApplicationContext(); + int versionCode = MicroPhotoContext.getVersionCode(context); String simcard = SysApi.getImei(getApplicationContext()); if (simcard == null) { simcard = ""; } - service.mNativeHandle = init(appPath, server, port, cmdid, protocol, networkProtocol, encryptData, 0, service.getSignalLevel(), versionCode, BuildConfig.BUILD_TIMESTAMP, simcard); + String tfCardPath = MicroPhotoContext.getSecondaryStoragePath(context); + service.mNativeHandle = init(appPath, server, port, cmdid, protocol, networkProtocol, + encryptData, 0, service.getSignalLevel(), versionCode, + BuildConfig.BUILD_TIMESTAMP, simcard, tfCardPath); if (service.mNativeHandle != 0) { isRunning = true; @@ -1120,7 +1124,9 @@ CellSignalStrengthGsm cellSignalStrengthGsm = cellInfoGsm.getCellSignalStrength( cellSignalStrengthGsm.getDbm(); */ - protected native long init(String appPath, String ip, int port, String cmdid, int protocol, int networkProtocl, int encryptData, long netHandle, int signalLevel, int versionCode, long buildTime, String simcard); + protected native long init(String appPath, String ip, int port, String cmdid, int protocol, + int networkProtocl, int encryptData, long netHandle, int signalLevel, + int versionCode, long buildTime, String simcard, String tfCardPath); protected native long getHeartbeatDuration(long handler); protected native long[] getPhotoTimeData(long handler, long startTime); protected native long[] getPhotoTimeData2(long handler); diff --git a/common/src/main/java/com/xypower/common/MicroPhotoContext.java b/common/src/main/java/com/xypower/common/MicroPhotoContext.java index 8a067a8a..1801ddf6 100644 --- a/common/src/main/java/com/xypower/common/MicroPhotoContext.java +++ b/common/src/main/java/com/xypower/common/MicroPhotoContext.java @@ -1,10 +1,12 @@ package com.xypower.common; import android.app.ActivityManager; +import android.app.Service; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.os.Environment; +import android.os.storage.StorageManager; import android.text.TextUtils; import org.json.JSONArray; @@ -19,6 +21,7 @@ import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; +import java.lang.reflect.Method; import java.text.NumberFormat; import java.util.HashMap; import java.util.List; @@ -116,6 +119,50 @@ public class MicroPhotoContext { return stringBuilder == null ? null : stringBuilder.toString(); } + // 获取主存储卡路径 + public static String getPrimaryStoragePath(Context context) { + try { + StorageManager sm = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE); + Method getVolumePathsMethod = StorageManager.class.getMethod("getVolumePaths", (Class[])null); + Object[] args = null; + String[] paths = (String[]) getVolumePathsMethod.invoke(sm, args); + // first element in paths[] is primary storage path + return paths[0]; + } catch (Exception e) { + // Log.e(TAG, "getPrimaryStoragePath() failed", e); + } + return null; + } + + // 获取次存储卡路径,一般就是外置 TF 卡了. 不过也有可能是 USB OTG 设备... + // 其实只要判断第二章卡在挂载状态,就可以用了. + public static String getSecondaryStoragePath(Context context) { + try { + StorageManager sm = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE); + Method getVolumePathsMethod = StorageManager.class.getMethod("getVolumePaths", (Class[])null); + Object[] args = null; + String[] paths = (String[]) getVolumePathsMethod.invoke(sm, args); + // second element in paths[] is secondary storage path + return paths.length <= 1 ? null : paths[1]; + } catch (Exception e) { + // Log.e(TAG, "getSecondaryStoragePath() failed", e); + } + return null; + } + + // 获取存储卡的挂载状态. path 参数传入上两个方法得到的路径 + public String getStorageState(Context context, String path) { + try { + StorageManager sm = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE); + Method getVolumeStateMethod = StorageManager.class.getMethod("getVolumeState", new Class[] {String.class}); + String state = (String) getVolumeStateMethod.invoke(sm, path); + return state; + } catch (Exception e) { + // Log.e(TAG, "getStorageState() failed", e); + } + return null; + } + public static boolean isAppAlive(Context context, String packageName) { ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); List services = am.getRunningServices(Integer.MAX_VALUE);