desc:适配nvme硬盘

main
xiaowusky 1 year ago
parent 69c922d065
commit 9a5616ee69

@ -31,6 +31,7 @@
<uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
<uses-feature <uses-feature
android:glEsVersion="0x00020000" android:glEsVersion="0x00020000"
@ -44,6 +45,8 @@
android:networkSecurityConfig="@xml/network_security_config" android:networkSecurityConfig="@xml/network_security_config"
android:roundIcon="@mipmap/ic_launcher_round" android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true" android:supportsRtl="true"
android:requestLegacyExternalStorage="true"
android:largeHeap="true"
android:theme="@style/AppTheme"> android:theme="@style/AppTheme">
<service <service
android:name=".watcher.services.HeartbeatService" android:name=".watcher.services.HeartbeatService"

@ -30,4 +30,7 @@ const val GAS_CLOUD_UPLOAD_SIZE_ONCE = 20
const val HEARTBEAT_TIME = 10000L const val HEARTBEAT_TIME = 10000L
//存储告警阈值 //存储告警阈值
const val STORAGE_WARN_THRESHOLD = 30 const val STORAGE_WARN_THRESHOLD_NVME = 30
//没有nvme的时候存储告警阈值
const val STORAGE_WARN_THRESHOLD = 3

@ -16,8 +16,7 @@ import com.yinuo.safetywatcher.watcher.constant.DEFAULT_QUERY_TIME_INTERVAL
import com.yinuo.safetywatcher.watcher.ui.adapter.HistoryVideoAdapter import com.yinuo.safetywatcher.watcher.ui.adapter.HistoryVideoAdapter
import com.yinuo.safetywatcher.watcher.ui.view.CommonTopBar import com.yinuo.safetywatcher.watcher.ui.view.CommonTopBar
import com.yinuo.safetywatcher.watcher.utils.DateUtils import com.yinuo.safetywatcher.watcher.utils.DateUtils
import com.yinuo.safetywatcher.watcher.utils.LztekUtil import com.common.commonlib.utils.StorageUtils
import com.yinuo.safetywatcher.watcher.utils.StorageUtils
import com.yinuo.safetywatcher.watcher.utils.showToast import com.yinuo.safetywatcher.watcher.utils.showToast
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.GlobalScope

@ -8,7 +8,6 @@ import androidx.annotation.RequiresApi
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.common.commonlib.db.DBUtils import com.common.commonlib.db.DBUtils
import com.common.commonlib.utils.LogUtils import com.common.commonlib.utils.LogUtils
import com.common.commonlib.utils.MMKVUtils
import com.common.commonlib.utils.NetworkHelper import com.common.commonlib.utils.NetworkHelper
import com.yinuo.safetywatcher.R import com.yinuo.safetywatcher.R
import com.yinuo.safetywatcher.databinding.ActivityHomeBinding import com.yinuo.safetywatcher.databinding.ActivityHomeBinding
@ -26,7 +25,6 @@ import com.yinuo.safetywatcher.watcher.utils.BatteryHelper
import com.yinuo.safetywatcher.watcher.utils.LztekUtil import com.yinuo.safetywatcher.watcher.utils.LztekUtil
import com.yinuo.safetywatcher.watcher.utils.RecordHelper import com.yinuo.safetywatcher.watcher.utils.RecordHelper
import com.yinuo.safetywatcher.watcher.utils.SimHelper import com.yinuo.safetywatcher.watcher.utils.SimHelper
import com.yinuo.safetywatcher.watcher.utils.SoundUtils
import com.yinuo.safetywatcher.watcher.utils.WifiHelper import com.yinuo.safetywatcher.watcher.utils.WifiHelper
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.GlobalScope
@ -89,8 +87,8 @@ class HomeActivity : NoOptionsActivity() {
} }
} }
val cardAvailableSize = LztekUtil.getCardAvailableSize() val cardAvailableSize = LztekUtil.getCardAvailableSizeWeak()
if (cardAvailableSize < STORAGE_WARN_THRESHOLD) { if (cardAvailableSize) {
warnDialog = warnDialog =
ConfirmDialog("检测倒系统剩余存储空间较小,将影响视频录制,是否删除部分早期录像腾出空间?") { ConfirmDialog("检测倒系统剩余存储空间较小,将影响视频录制,是否删除部分早期录像腾出空间?") {
warnDialog?.dismiss() warnDialog?.dismiss()

@ -21,7 +21,7 @@ import com.yinuo.safetywatcher.watcher.ui.adapter.HistoryDataAdapter
import com.yinuo.safetywatcher.watcher.ui.view.CommonTopBar import com.yinuo.safetywatcher.watcher.ui.view.CommonTopBar
import com.yinuo.safetywatcher.watcher.utils.ChartBridge import com.yinuo.safetywatcher.watcher.utils.ChartBridge
import com.yinuo.safetywatcher.watcher.utils.DateUtils import com.yinuo.safetywatcher.watcher.utils.DateUtils
import com.yinuo.safetywatcher.watcher.utils.StorageUtils import com.common.commonlib.utils.StorageUtils
import com.yinuo.safetywatcher.watcher.utils.showToast import com.yinuo.safetywatcher.watcher.utils.showToast
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch

@ -14,7 +14,7 @@ import com.yinuo.safetywatcher.watcher.constant.DEFAULT_QUERY_TIME_INTERVAL
import com.yinuo.safetywatcher.watcher.ui.adapter.WarnDataAdapter import com.yinuo.safetywatcher.watcher.ui.adapter.WarnDataAdapter
import com.yinuo.safetywatcher.watcher.ui.view.CommonTopBar import com.yinuo.safetywatcher.watcher.ui.view.CommonTopBar
import com.yinuo.safetywatcher.watcher.utils.DateUtils import com.yinuo.safetywatcher.watcher.utils.DateUtils
import com.yinuo.safetywatcher.watcher.utils.StorageUtils import com.common.commonlib.utils.StorageUtils
import com.yinuo.safetywatcher.watcher.utils.showToast import com.yinuo.safetywatcher.watcher.utils.showToast
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch

@ -1,10 +1,14 @@
package com.yinuo.safetywatcher.watcher.utils package com.yinuo.safetywatcher.watcher.utils
import android.os.Environment
import android.os.StatFs import android.os.StatFs
import com.common.commonlib.CommonApplication
import com.common.commonlib.utils.NVME_KEYWORDS
import com.common.commonlib.utils.StorageUtils
import com.lztek.toolkit.Lztek import com.lztek.toolkit.Lztek
import com.yinuo.safetywatcher.watcher.constant.STORAGE_WARN_THRESHOLD
import com.yinuo.safetywatcher.watcher.constant.STORAGE_WARN_THRESHOLD_NVME
import org.easydarwin.PushHelper import org.easydarwin.PushHelper
import java.math.BigInteger
import java.security.MessageDigest
object LztekUtil { object LztekUtil {
@ -65,15 +69,25 @@ object LztekUtil {
private const val BYTE_GB = 1024 * 1024 * 1024 private const val BYTE_GB = 1024 * 1024 * 1024
fun getCardAvailableSize(): Int { fun getCardAvailableSizeWeak(): Boolean {
val storageCardPath = getStorageCardPath() val context = CommonApplication.getContext()
storageCardPath?.let { var hasNvme = false
var cardPath = Environment.getExternalStorageDirectory().absolutePath
context?.let {
val nvmePath = StorageUtils.getStoragePath(it, NVME_KEYWORDS)
if (!nvmePath.isNullOrEmpty()) {
hasNvme = true
cardPath = nvmePath
}
}
cardPath?.let {
val statfs = StatFs(it) val statfs = StatFs(it)
val blocSize = statfs.blockSizeLong val blocSize = statfs.blockSizeLong
val availableSize = statfs.availableBlocksLong * blocSize val availableSize = statfs.availableBlocksLong * blocSize
val totalSize = statfs.blockCountLong * blocSize val totalSize = statfs.blockCountLong * blocSize
return (availableSize / BYTE_GB).toInt() val gb = (availableSize / BYTE_GB).toInt()
return if (hasNvme) gb < STORAGE_WARN_THRESHOLD_NVME else gb < STORAGE_WARN_THRESHOLD
} }
return 0 return false
} }
} }

@ -1,4 +1,4 @@
package com.yinuo.safetywatcher.watcher.utils package com.common.commonlib.utils
import android.content.Context import android.content.Context
import android.os.storage.StorageManager import android.os.storage.StorageManager
@ -6,6 +6,10 @@ import android.os.storage.StorageVolume
import java.lang.reflect.InvocationTargetException import java.lang.reflect.InvocationTargetException
val USB_KEYWORDS = arrayOf("USB", "U 盘")
@JvmField
val NVME_KEYWORDS = arrayOf("新加卷")
object StorageUtils { object StorageUtils {
/** /**
* 6.0获取外置sdcard和U盘路径并区分 * 6.0获取外置sdcard和U盘路径并区分
@ -13,7 +17,7 @@ object StorageUtils {
* @param keyword SD = "内部存储"; EXT = "SD卡"; USB = "U盘" * @param keyword SD = "内部存储"; EXT = "SD卡"; USB = "U盘"
* @return * @return
*/ */
fun getStoragePath(mContext: Context, keyword: String = "USB"): String? { fun getStoragePath(mContext: Context, keywords: Array<String> = USB_KEYWORDS): String? {
var targetpath: String? = "" var targetpath: String? = ""
val mStorageManager = mContext val mStorageManager = mContext
.getSystemService(Context.STORAGE_SERVICE) as StorageManager .getSystemService(Context.STORAGE_SERVICE) as StorageManager
@ -30,9 +34,8 @@ object StorageUtils {
val storageVolumeElement: StorageVolume = result[i] val storageVolumeElement: StorageVolume = result[i]
val userLabel = getUserLabel.invoke(storageVolumeElement) as String val userLabel = getUserLabel.invoke(storageVolumeElement) as String
val path = getPath.invoke(storageVolumeElement) as String val path = getPath.invoke(storageVolumeElement) as String
if (userLabel.contains(keyword) || userLabel.contains("U 盘")) { if (keywords.contains(userLabel))
targetpath = path targetpath = path
}
} }
} catch (e: ClassNotFoundException) { } catch (e: ClassNotFoundException) {
e.printStackTrace() e.printStackTrace()

@ -1,12 +1,21 @@
package com.yinuo.library.vlc.encoder; package com.yinuo.library.vlc.encoder;
import static com.common.commonlib.utils.StorageUtilsKt.NVME_KEYWORDS;
import android.annotation.TargetApi; import android.annotation.TargetApi;
import android.app.Activity; import android.app.Activity;
import android.content.Context;
import android.hardware.Camera; import android.hardware.Camera;
import android.os.Build; import android.os.Build;
import android.os.Environment; import android.os.Environment;
import android.text.TextUtils;
import android.view.Surface; import android.view.Surface;
import androidx.annotation.Nullable;
import com.common.commonlib.CommonApplication;
import com.common.commonlib.utils.StorageUtils;
import java.io.File; import java.io.File;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.List; import java.util.List;
@ -187,14 +196,8 @@ public class CameraHelper {
public static File getOutputMediaFile(int type, long time, long duration) { public static File getOutputMediaFile(int type, long time, long duration) {
// To be safe, you should check that the SDCard is mounted // To be safe, you should check that the SDCard is mounted
// using Environment.getExternalStorageState() before doing this. // using Environment.getExternalStorageState() before doing this.
if (!Environment.getExternalStorageState().equalsIgnoreCase(Environment.MEDIA_MOUNTED)) { File mediaStorageDir = getMediaStorageDir();
return null; if (mediaStorageDir == null) return null;
}
File mediaStorageDir = Environment.getExternalStoragePublicDirectory("video");
if (!mediaStorageDir.exists() && !mediaStorageDir.mkdirs()) {
return null;
}
// Create a media file name // Create a media file name
SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss", Locale.CHINA); SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss", Locale.CHINA);
@ -213,4 +216,29 @@ public class CameraHelper {
return mediaFile; return mediaFile;
} }
@Nullable
private static File getMediaStorageDir() {
Context context = CommonApplication.Companion.getContext();
if (context != null) {
String nvmePath = StorageUtils.INSTANCE.getStoragePath(context, NVME_KEYWORDS);
if (!TextUtils.isEmpty(nvmePath)) {
File mediaStorageDir = new File(nvmePath + File.separator + "video");
if (!mediaStorageDir.exists() && !mediaStorageDir.mkdirs()) {
return null;
}
return mediaStorageDir;
} else {
if (!Environment.getExternalStorageState().equalsIgnoreCase(Environment.MEDIA_MOUNTED)) {
return null;
}
File mediaStorageDir = Environment.getExternalStoragePublicDirectory("video");
if (!mediaStorageDir.exists() && !mediaStorageDir.mkdirs()) {
return null;
}
return mediaStorageDir;
}
}
return null;
}
} }

Loading…
Cancel
Save