diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5eb52f4..85791a0 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,23 +1,15 @@ - + - - + + @@ -35,6 +27,7 @@ android:allowNativeHeapPointerTagging="false" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" + android:requestLegacyExternalStorage="true" android:supportsRtl="true" android:theme="@style/Base.Theme.Endoscope" android:usesCleartextTraffic="true"> diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5eb52f4..85791a0 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,23 +1,15 @@ - + - - + + @@ -35,6 +27,7 @@ android:allowNativeHeapPointerTagging="false" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" + android:requestLegacyExternalStorage="true" android:supportsRtl="true" android:theme="@style/Base.Theme.Endoscope" android:usesCleartextTraffic="true"> diff --git a/app/src/main/java/com/casic/endoscope/extensions/Context.kt b/app/src/main/java/com/casic/endoscope/extensions/Context.kt deleted file mode 100644 index a301aab..0000000 --- a/app/src/main/java/com/casic/endoscope/extensions/Context.kt +++ /dev/null @@ -1,23 +0,0 @@ -package com.casic.endoscope.extensions - -import android.content.Context -import android.os.Environment -import com.pengxh.kt.lite.extensions.timestampToDate -import java.io.File - -//扩展函数 -fun Context.createVideoFileDir(): File { - val videoDir = File(getExternalFilesDir(Environment.DIRECTORY_MOVIES), System.currentTimeMillis().timestampToDate()) - if (!videoDir.exists()) { - videoDir.mkdir() - } - return videoDir -} - -fun Context.createImageFileDir(): File { - val imageDir = File(getExternalFilesDir(Environment.DIRECTORY_PICTURES), System.currentTimeMillis().timestampToDate()) - if (!imageDir.exists()) { - imageDir.mkdir() - } - return imageDir -} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5eb52f4..85791a0 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,23 +1,15 @@ - + - - + + @@ -35,6 +27,7 @@ android:allowNativeHeapPointerTagging="false" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" + android:requestLegacyExternalStorage="true" android:supportsRtl="true" android:theme="@style/Base.Theme.Endoscope" android:usesCleartextTraffic="true"> diff --git a/app/src/main/java/com/casic/endoscope/extensions/Context.kt b/app/src/main/java/com/casic/endoscope/extensions/Context.kt deleted file mode 100644 index a301aab..0000000 --- a/app/src/main/java/com/casic/endoscope/extensions/Context.kt +++ /dev/null @@ -1,23 +0,0 @@ -package com.casic.endoscope.extensions - -import android.content.Context -import android.os.Environment -import com.pengxh.kt.lite.extensions.timestampToDate -import java.io.File - -//扩展函数 -fun Context.createVideoFileDir(): File { - val videoDir = File(getExternalFilesDir(Environment.DIRECTORY_MOVIES), System.currentTimeMillis().timestampToDate()) - if (!videoDir.exists()) { - videoDir.mkdir() - } - return videoDir -} - -fun Context.createImageFileDir(): File { - val imageDir = File(getExternalFilesDir(Environment.DIRECTORY_PICTURES), System.currentTimeMillis().timestampToDate()) - if (!imageDir.exists()) { - imageDir.mkdir() - } - return imageDir -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/endoscope/utils/FileManager.kt b/app/src/main/java/com/casic/endoscope/utils/FileManager.kt new file mode 100644 index 0000000..7d0b476 --- /dev/null +++ b/app/src/main/java/com/casic/endoscope/utils/FileManager.kt @@ -0,0 +1,64 @@ +package com.casic.endoscope.utils + +import android.app.Activity +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.os.Environment +import android.provider.Settings +import android.util.Log +import com.pengxh.kt.lite.extensions.timestampToDate +import java.io.File + +object FileManager { + private const val kTag = "FileManager" + private lateinit var directory: File + + fun initRootDirectory(activity: Activity) { + //先判断MANAGE_EXTERNAL_STORAGE权限 + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + if (!Environment.isExternalStorageManager()) { + val intent = Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION) + intent.data = Uri.parse("package:${activity.packageName}") + activity.startActivity(intent) + } + } + + directory = File("${Environment.getExternalStorageDirectory()}/Endoscope") + if (!directory.exists()) { + Log.d(kTag, "createRootDirectory: 新建文件夹") + directory.mkdirs() + } + Log.d(kTag, "createRootDirectory: $directory") + } + + fun getRootDirectory(): File { + return directory + } + + fun getVideoFileDir(): File { + val videoDir = File(getRootDirectory(), "Video") + if (!videoDir.exists()) { + videoDir.mkdir() + } + + val childDir = File(videoDir, System.currentTimeMillis().timestampToDate()) + if (!childDir.exists()) { + childDir.mkdir() + } + return childDir + } + + fun getImageFileDir(): File { + val imageDir = File(getRootDirectory(), "Picture") + if (!imageDir.exists()) { + imageDir.mkdir() + } + + val childDir = File(imageDir, System.currentTimeMillis().timestampToDate()) + if (!childDir.exists()) { + childDir.mkdir() + } + return childDir + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5eb52f4..85791a0 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,23 +1,15 @@ - + - - + + @@ -35,6 +27,7 @@ android:allowNativeHeapPointerTagging="false" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" + android:requestLegacyExternalStorage="true" android:supportsRtl="true" android:theme="@style/Base.Theme.Endoscope" android:usesCleartextTraffic="true"> diff --git a/app/src/main/java/com/casic/endoscope/extensions/Context.kt b/app/src/main/java/com/casic/endoscope/extensions/Context.kt deleted file mode 100644 index a301aab..0000000 --- a/app/src/main/java/com/casic/endoscope/extensions/Context.kt +++ /dev/null @@ -1,23 +0,0 @@ -package com.casic.endoscope.extensions - -import android.content.Context -import android.os.Environment -import com.pengxh.kt.lite.extensions.timestampToDate -import java.io.File - -//扩展函数 -fun Context.createVideoFileDir(): File { - val videoDir = File(getExternalFilesDir(Environment.DIRECTORY_MOVIES), System.currentTimeMillis().timestampToDate()) - if (!videoDir.exists()) { - videoDir.mkdir() - } - return videoDir -} - -fun Context.createImageFileDir(): File { - val imageDir = File(getExternalFilesDir(Environment.DIRECTORY_PICTURES), System.currentTimeMillis().timestampToDate()) - if (!imageDir.exists()) { - imageDir.mkdir() - } - return imageDir -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/endoscope/utils/FileManager.kt b/app/src/main/java/com/casic/endoscope/utils/FileManager.kt new file mode 100644 index 0000000..7d0b476 --- /dev/null +++ b/app/src/main/java/com/casic/endoscope/utils/FileManager.kt @@ -0,0 +1,64 @@ +package com.casic.endoscope.utils + +import android.app.Activity +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.os.Environment +import android.provider.Settings +import android.util.Log +import com.pengxh.kt.lite.extensions.timestampToDate +import java.io.File + +object FileManager { + private const val kTag = "FileManager" + private lateinit var directory: File + + fun initRootDirectory(activity: Activity) { + //先判断MANAGE_EXTERNAL_STORAGE权限 + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + if (!Environment.isExternalStorageManager()) { + val intent = Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION) + intent.data = Uri.parse("package:${activity.packageName}") + activity.startActivity(intent) + } + } + + directory = File("${Environment.getExternalStorageDirectory()}/Endoscope") + if (!directory.exists()) { + Log.d(kTag, "createRootDirectory: 新建文件夹") + directory.mkdirs() + } + Log.d(kTag, "createRootDirectory: $directory") + } + + fun getRootDirectory(): File { + return directory + } + + fun getVideoFileDir(): File { + val videoDir = File(getRootDirectory(), "Video") + if (!videoDir.exists()) { + videoDir.mkdir() + } + + val childDir = File(videoDir, System.currentTimeMillis().timestampToDate()) + if (!childDir.exists()) { + childDir.mkdir() + } + return childDir + } + + fun getImageFileDir(): File { + val imageDir = File(getRootDirectory(), "Picture") + if (!imageDir.exists()) { + imageDir.mkdir() + } + + val childDir = File(imageDir, System.currentTimeMillis().timestampToDate()) + if (!childDir.exists()) { + childDir.mkdir() + } + return childDir + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/endoscope/utils/ProjectConstant.kt b/app/src/main/java/com/casic/endoscope/utils/ProjectConstant.kt index d278fdd..2c214b1 100644 --- a/app/src/main/java/com/casic/endoscope/utils/ProjectConstant.kt +++ b/app/src/main/java/com/casic/endoscope/utils/ProjectConstant.kt @@ -9,7 +9,6 @@ arrayOf( Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, - Manifest.permission.MANAGE_EXTERNAL_STORAGE, Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.READ_MEDIA_VIDEO, Manifest.permission.BLUETOOTH_CONNECT, @@ -21,7 +20,6 @@ arrayOf( Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, - Manifest.permission.MANAGE_EXTERNAL_STORAGE, Manifest.permission.BLUETOOTH_CONNECT, Manifest.permission.BLUETOOTH_SCAN, Manifest.permission.ACCESS_COARSE_LOCATION, @@ -31,7 +29,6 @@ arrayOf( Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, - Manifest.permission.MANAGE_EXTERNAL_STORAGE, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION ) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5eb52f4..85791a0 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,23 +1,15 @@ - + - - + + @@ -35,6 +27,7 @@ android:allowNativeHeapPointerTagging="false" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" + android:requestLegacyExternalStorage="true" android:supportsRtl="true" android:theme="@style/Base.Theme.Endoscope" android:usesCleartextTraffic="true"> diff --git a/app/src/main/java/com/casic/endoscope/extensions/Context.kt b/app/src/main/java/com/casic/endoscope/extensions/Context.kt deleted file mode 100644 index a301aab..0000000 --- a/app/src/main/java/com/casic/endoscope/extensions/Context.kt +++ /dev/null @@ -1,23 +0,0 @@ -package com.casic.endoscope.extensions - -import android.content.Context -import android.os.Environment -import com.pengxh.kt.lite.extensions.timestampToDate -import java.io.File - -//扩展函数 -fun Context.createVideoFileDir(): File { - val videoDir = File(getExternalFilesDir(Environment.DIRECTORY_MOVIES), System.currentTimeMillis().timestampToDate()) - if (!videoDir.exists()) { - videoDir.mkdir() - } - return videoDir -} - -fun Context.createImageFileDir(): File { - val imageDir = File(getExternalFilesDir(Environment.DIRECTORY_PICTURES), System.currentTimeMillis().timestampToDate()) - if (!imageDir.exists()) { - imageDir.mkdir() - } - return imageDir -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/endoscope/utils/FileManager.kt b/app/src/main/java/com/casic/endoscope/utils/FileManager.kt new file mode 100644 index 0000000..7d0b476 --- /dev/null +++ b/app/src/main/java/com/casic/endoscope/utils/FileManager.kt @@ -0,0 +1,64 @@ +package com.casic.endoscope.utils + +import android.app.Activity +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.os.Environment +import android.provider.Settings +import android.util.Log +import com.pengxh.kt.lite.extensions.timestampToDate +import java.io.File + +object FileManager { + private const val kTag = "FileManager" + private lateinit var directory: File + + fun initRootDirectory(activity: Activity) { + //先判断MANAGE_EXTERNAL_STORAGE权限 + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + if (!Environment.isExternalStorageManager()) { + val intent = Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION) + intent.data = Uri.parse("package:${activity.packageName}") + activity.startActivity(intent) + } + } + + directory = File("${Environment.getExternalStorageDirectory()}/Endoscope") + if (!directory.exists()) { + Log.d(kTag, "createRootDirectory: 新建文件夹") + directory.mkdirs() + } + Log.d(kTag, "createRootDirectory: $directory") + } + + fun getRootDirectory(): File { + return directory + } + + fun getVideoFileDir(): File { + val videoDir = File(getRootDirectory(), "Video") + if (!videoDir.exists()) { + videoDir.mkdir() + } + + val childDir = File(videoDir, System.currentTimeMillis().timestampToDate()) + if (!childDir.exists()) { + childDir.mkdir() + } + return childDir + } + + fun getImageFileDir(): File { + val imageDir = File(getRootDirectory(), "Picture") + if (!imageDir.exists()) { + imageDir.mkdir() + } + + val childDir = File(imageDir, System.currentTimeMillis().timestampToDate()) + if (!childDir.exists()) { + childDir.mkdir() + } + return childDir + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/endoscope/utils/ProjectConstant.kt b/app/src/main/java/com/casic/endoscope/utils/ProjectConstant.kt index d278fdd..2c214b1 100644 --- a/app/src/main/java/com/casic/endoscope/utils/ProjectConstant.kt +++ b/app/src/main/java/com/casic/endoscope/utils/ProjectConstant.kt @@ -9,7 +9,6 @@ arrayOf( Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, - Manifest.permission.MANAGE_EXTERNAL_STORAGE, Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.READ_MEDIA_VIDEO, Manifest.permission.BLUETOOTH_CONNECT, @@ -21,7 +20,6 @@ arrayOf( Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, - Manifest.permission.MANAGE_EXTERNAL_STORAGE, Manifest.permission.BLUETOOTH_CONNECT, Manifest.permission.BLUETOOTH_SCAN, Manifest.permission.ACCESS_COARSE_LOCATION, @@ -31,7 +29,6 @@ arrayOf( Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, - Manifest.permission.MANAGE_EXTERNAL_STORAGE, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION ) diff --git a/app/src/main/java/com/casic/endoscope/view/MainActivity.kt b/app/src/main/java/com/casic/endoscope/view/MainActivity.kt index 5834b2a..c2f935b 100644 --- a/app/src/main/java/com/casic/endoscope/view/MainActivity.kt +++ b/app/src/main/java/com/casic/endoscope/view/MainActivity.kt @@ -20,14 +20,13 @@ import com.casic.endoscope.extensions.check import com.casic.endoscope.extensions.convertValue import com.casic.endoscope.extensions.createHorizontalCommand -import com.casic.endoscope.extensions.createImageFileDir import com.casic.endoscope.extensions.createVerticalCommand -import com.casic.endoscope.extensions.createVideoFileDir import com.casic.endoscope.extensions.getChannel import com.casic.endoscope.extensions.init import com.casic.endoscope.extensions.toTime import com.casic.endoscope.service.VideoTranscodeService import com.casic.endoscope.utils.DataBaseManager +import com.casic.endoscope.utils.FileManager import com.casic.endoscope.utils.ProjectConstant import com.casic.endoscope.utils.ble.BleDeviceManager import com.casic.endoscope.utils.ble.OnDeviceConnectListener @@ -57,10 +56,13 @@ import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.extensions.timestampToTime +import com.pengxh.kt.lite.extensions.toJson +import com.pengxh.kt.lite.extensions.writeToFile import com.pengxh.kt.lite.utils.LoadingDialogHub import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import java.io.File import java.text.SimpleDateFormat import java.util.Date @@ -109,7 +111,7 @@ private var timer: Timer? = null private var timerTask: TimerTask? = null private var seconds = 0L - private var inputVideoPath = "" + private var videoPath = "" private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var serviceIntent: Intent private lateinit var dataSet: LineDataSet @@ -195,6 +197,10 @@ binding.outputDataView.setOnClickListener { val valueBeans = DataBaseManager.get.loadAll() //导出到本地文件 + val rootDirectory = FileManager.getRootDirectory() + val file = File("${rootDirectory}/GasDensityValue.json") + valueBeans.toJson().writeToFile(file) + "数据导出成功,请在设备文件管理根目录【Endoscope】查看".show(this) } binding.upScaleButton.setOnTouchListener { _, event -> @@ -380,7 +386,7 @@ strJpeg.wPicQuality = 1 strJpeg.wPicSize = 2 - val imagePath = "/${createImageFileDir()}/${timeFormat.format(Date())}.png" + val imagePath = "/${FileManager.getImageFileDir()}/${timeFormat.format(Date())}.png" hkSDK.NET_DVR_CaptureJPEGPicture( returnUserId, selectChannel, strJpeg, imagePath ) @@ -400,8 +406,8 @@ //视频录制 binding.videoButton.setOnClickListener { if (isPreviewSuccess) { - inputVideoPath = "/${createVideoFileDir()}/${timeFormat.format(Date())}.mp4" - hkSDK.NET_DVR_SaveRealData(returnUserId, inputVideoPath) + videoPath = "/${FileManager.getVideoFileDir()}/${timeFormat.format(Date())}.mp4" + hkSDK.NET_DVR_SaveRealData(returnUserId, videoPath) binding.videoStateView.visibility = View.VISIBLE } else { "摄像头预览未打开,无法录制视频".show(this) @@ -412,7 +418,7 @@ //停止视频抓取 hkSDK.NET_DVR_StopSaveRealData(returnUserId) binding.videoStateView.visibility = View.INVISIBLE - ProjectConstant.VIDEO_PATH_STACK.push(inputVideoPath) + ProjectConstant.VIDEO_PATH_STACK.push(videoPath) "视频录制成功".show(this) true } @@ -650,12 +656,15 @@ if (value.check()) { /***将值渲染到曲线图****************************************************************/ lifecycleScope.launch(Dispatchers.Main) { + val currentTime = System.currentTimeMillis().timestampToTime() //解析返回值 val density = value.convertValue() - //将数据保存在数据库 -// DataBaseManager.get.saveGasDensity(density) + withContext(Dispatchers.IO) { + //协程切换为子线程将数据保存在数据库 + DataBaseManager.get.saveGasDensity(density, currentTime) + } //时间作为X轴 - xAxisLabels.add(System.currentTimeMillis().timestampToTime()) + xAxisLabels.add(currentTime) //浓度作为Y轴 val entry = Entry(i++.toFloat(), density.toFloat(), "浓度") diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5eb52f4..85791a0 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,23 +1,15 @@ - + - - + + @@ -35,6 +27,7 @@ android:allowNativeHeapPointerTagging="false" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" + android:requestLegacyExternalStorage="true" android:supportsRtl="true" android:theme="@style/Base.Theme.Endoscope" android:usesCleartextTraffic="true"> diff --git a/app/src/main/java/com/casic/endoscope/extensions/Context.kt b/app/src/main/java/com/casic/endoscope/extensions/Context.kt deleted file mode 100644 index a301aab..0000000 --- a/app/src/main/java/com/casic/endoscope/extensions/Context.kt +++ /dev/null @@ -1,23 +0,0 @@ -package com.casic.endoscope.extensions - -import android.content.Context -import android.os.Environment -import com.pengxh.kt.lite.extensions.timestampToDate -import java.io.File - -//扩展函数 -fun Context.createVideoFileDir(): File { - val videoDir = File(getExternalFilesDir(Environment.DIRECTORY_MOVIES), System.currentTimeMillis().timestampToDate()) - if (!videoDir.exists()) { - videoDir.mkdir() - } - return videoDir -} - -fun Context.createImageFileDir(): File { - val imageDir = File(getExternalFilesDir(Environment.DIRECTORY_PICTURES), System.currentTimeMillis().timestampToDate()) - if (!imageDir.exists()) { - imageDir.mkdir() - } - return imageDir -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/endoscope/utils/FileManager.kt b/app/src/main/java/com/casic/endoscope/utils/FileManager.kt new file mode 100644 index 0000000..7d0b476 --- /dev/null +++ b/app/src/main/java/com/casic/endoscope/utils/FileManager.kt @@ -0,0 +1,64 @@ +package com.casic.endoscope.utils + +import android.app.Activity +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.os.Environment +import android.provider.Settings +import android.util.Log +import com.pengxh.kt.lite.extensions.timestampToDate +import java.io.File + +object FileManager { + private const val kTag = "FileManager" + private lateinit var directory: File + + fun initRootDirectory(activity: Activity) { + //先判断MANAGE_EXTERNAL_STORAGE权限 + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + if (!Environment.isExternalStorageManager()) { + val intent = Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION) + intent.data = Uri.parse("package:${activity.packageName}") + activity.startActivity(intent) + } + } + + directory = File("${Environment.getExternalStorageDirectory()}/Endoscope") + if (!directory.exists()) { + Log.d(kTag, "createRootDirectory: 新建文件夹") + directory.mkdirs() + } + Log.d(kTag, "createRootDirectory: $directory") + } + + fun getRootDirectory(): File { + return directory + } + + fun getVideoFileDir(): File { + val videoDir = File(getRootDirectory(), "Video") + if (!videoDir.exists()) { + videoDir.mkdir() + } + + val childDir = File(videoDir, System.currentTimeMillis().timestampToDate()) + if (!childDir.exists()) { + childDir.mkdir() + } + return childDir + } + + fun getImageFileDir(): File { + val imageDir = File(getRootDirectory(), "Picture") + if (!imageDir.exists()) { + imageDir.mkdir() + } + + val childDir = File(imageDir, System.currentTimeMillis().timestampToDate()) + if (!childDir.exists()) { + childDir.mkdir() + } + return childDir + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/endoscope/utils/ProjectConstant.kt b/app/src/main/java/com/casic/endoscope/utils/ProjectConstant.kt index d278fdd..2c214b1 100644 --- a/app/src/main/java/com/casic/endoscope/utils/ProjectConstant.kt +++ b/app/src/main/java/com/casic/endoscope/utils/ProjectConstant.kt @@ -9,7 +9,6 @@ arrayOf( Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, - Manifest.permission.MANAGE_EXTERNAL_STORAGE, Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.READ_MEDIA_VIDEO, Manifest.permission.BLUETOOTH_CONNECT, @@ -21,7 +20,6 @@ arrayOf( Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, - Manifest.permission.MANAGE_EXTERNAL_STORAGE, Manifest.permission.BLUETOOTH_CONNECT, Manifest.permission.BLUETOOTH_SCAN, Manifest.permission.ACCESS_COARSE_LOCATION, @@ -31,7 +29,6 @@ arrayOf( Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, - Manifest.permission.MANAGE_EXTERNAL_STORAGE, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION ) diff --git a/app/src/main/java/com/casic/endoscope/view/MainActivity.kt b/app/src/main/java/com/casic/endoscope/view/MainActivity.kt index 5834b2a..c2f935b 100644 --- a/app/src/main/java/com/casic/endoscope/view/MainActivity.kt +++ b/app/src/main/java/com/casic/endoscope/view/MainActivity.kt @@ -20,14 +20,13 @@ import com.casic.endoscope.extensions.check import com.casic.endoscope.extensions.convertValue import com.casic.endoscope.extensions.createHorizontalCommand -import com.casic.endoscope.extensions.createImageFileDir import com.casic.endoscope.extensions.createVerticalCommand -import com.casic.endoscope.extensions.createVideoFileDir import com.casic.endoscope.extensions.getChannel import com.casic.endoscope.extensions.init import com.casic.endoscope.extensions.toTime import com.casic.endoscope.service.VideoTranscodeService import com.casic.endoscope.utils.DataBaseManager +import com.casic.endoscope.utils.FileManager import com.casic.endoscope.utils.ProjectConstant import com.casic.endoscope.utils.ble.BleDeviceManager import com.casic.endoscope.utils.ble.OnDeviceConnectListener @@ -57,10 +56,13 @@ import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.extensions.timestampToTime +import com.pengxh.kt.lite.extensions.toJson +import com.pengxh.kt.lite.extensions.writeToFile import com.pengxh.kt.lite.utils.LoadingDialogHub import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import java.io.File import java.text.SimpleDateFormat import java.util.Date @@ -109,7 +111,7 @@ private var timer: Timer? = null private var timerTask: TimerTask? = null private var seconds = 0L - private var inputVideoPath = "" + private var videoPath = "" private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var serviceIntent: Intent private lateinit var dataSet: LineDataSet @@ -195,6 +197,10 @@ binding.outputDataView.setOnClickListener { val valueBeans = DataBaseManager.get.loadAll() //导出到本地文件 + val rootDirectory = FileManager.getRootDirectory() + val file = File("${rootDirectory}/GasDensityValue.json") + valueBeans.toJson().writeToFile(file) + "数据导出成功,请在设备文件管理根目录【Endoscope】查看".show(this) } binding.upScaleButton.setOnTouchListener { _, event -> @@ -380,7 +386,7 @@ strJpeg.wPicQuality = 1 strJpeg.wPicSize = 2 - val imagePath = "/${createImageFileDir()}/${timeFormat.format(Date())}.png" + val imagePath = "/${FileManager.getImageFileDir()}/${timeFormat.format(Date())}.png" hkSDK.NET_DVR_CaptureJPEGPicture( returnUserId, selectChannel, strJpeg, imagePath ) @@ -400,8 +406,8 @@ //视频录制 binding.videoButton.setOnClickListener { if (isPreviewSuccess) { - inputVideoPath = "/${createVideoFileDir()}/${timeFormat.format(Date())}.mp4" - hkSDK.NET_DVR_SaveRealData(returnUserId, inputVideoPath) + videoPath = "/${FileManager.getVideoFileDir()}/${timeFormat.format(Date())}.mp4" + hkSDK.NET_DVR_SaveRealData(returnUserId, videoPath) binding.videoStateView.visibility = View.VISIBLE } else { "摄像头预览未打开,无法录制视频".show(this) @@ -412,7 +418,7 @@ //停止视频抓取 hkSDK.NET_DVR_StopSaveRealData(returnUserId) binding.videoStateView.visibility = View.INVISIBLE - ProjectConstant.VIDEO_PATH_STACK.push(inputVideoPath) + ProjectConstant.VIDEO_PATH_STACK.push(videoPath) "视频录制成功".show(this) true } @@ -650,12 +656,15 @@ if (value.check()) { /***将值渲染到曲线图****************************************************************/ lifecycleScope.launch(Dispatchers.Main) { + val currentTime = System.currentTimeMillis().timestampToTime() //解析返回值 val density = value.convertValue() - //将数据保存在数据库 -// DataBaseManager.get.saveGasDensity(density) + withContext(Dispatchers.IO) { + //协程切换为子线程将数据保存在数据库 + DataBaseManager.get.saveGasDensity(density, currentTime) + } //时间作为X轴 - xAxisLabels.add(System.currentTimeMillis().timestampToTime()) + xAxisLabels.add(currentTime) //浓度作为Y轴 val entry = Entry(i++.toFloat(), density.toFloat(), "浓度") diff --git a/app/src/main/java/com/casic/endoscope/view/PermissionActivity.kt b/app/src/main/java/com/casic/endoscope/view/PermissionActivity.kt index ed85113..770a441 100644 --- a/app/src/main/java/com/casic/endoscope/view/PermissionActivity.kt +++ b/app/src/main/java/com/casic/endoscope/view/PermissionActivity.kt @@ -3,6 +3,7 @@ import android.os.Bundle import com.casic.endoscope.R import com.casic.endoscope.databinding.ActivityPermissionBinding +import com.casic.endoscope.utils.FileManager import com.casic.endoscope.utils.ProjectConstant import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -16,6 +17,7 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { + FileManager.initRootDirectory(this) if (EasyPermissions.hasPermissions(this, *ProjectConstant.USER_PERMISSIONS)) { navigatePageTo() finish() diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5eb52f4..85791a0 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,23 +1,15 @@ - + - - + + @@ -35,6 +27,7 @@ android:allowNativeHeapPointerTagging="false" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" + android:requestLegacyExternalStorage="true" android:supportsRtl="true" android:theme="@style/Base.Theme.Endoscope" android:usesCleartextTraffic="true"> diff --git a/app/src/main/java/com/casic/endoscope/extensions/Context.kt b/app/src/main/java/com/casic/endoscope/extensions/Context.kt deleted file mode 100644 index a301aab..0000000 --- a/app/src/main/java/com/casic/endoscope/extensions/Context.kt +++ /dev/null @@ -1,23 +0,0 @@ -package com.casic.endoscope.extensions - -import android.content.Context -import android.os.Environment -import com.pengxh.kt.lite.extensions.timestampToDate -import java.io.File - -//扩展函数 -fun Context.createVideoFileDir(): File { - val videoDir = File(getExternalFilesDir(Environment.DIRECTORY_MOVIES), System.currentTimeMillis().timestampToDate()) - if (!videoDir.exists()) { - videoDir.mkdir() - } - return videoDir -} - -fun Context.createImageFileDir(): File { - val imageDir = File(getExternalFilesDir(Environment.DIRECTORY_PICTURES), System.currentTimeMillis().timestampToDate()) - if (!imageDir.exists()) { - imageDir.mkdir() - } - return imageDir -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/endoscope/utils/FileManager.kt b/app/src/main/java/com/casic/endoscope/utils/FileManager.kt new file mode 100644 index 0000000..7d0b476 --- /dev/null +++ b/app/src/main/java/com/casic/endoscope/utils/FileManager.kt @@ -0,0 +1,64 @@ +package com.casic.endoscope.utils + +import android.app.Activity +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.os.Environment +import android.provider.Settings +import android.util.Log +import com.pengxh.kt.lite.extensions.timestampToDate +import java.io.File + +object FileManager { + private const val kTag = "FileManager" + private lateinit var directory: File + + fun initRootDirectory(activity: Activity) { + //先判断MANAGE_EXTERNAL_STORAGE权限 + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + if (!Environment.isExternalStorageManager()) { + val intent = Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION) + intent.data = Uri.parse("package:${activity.packageName}") + activity.startActivity(intent) + } + } + + directory = File("${Environment.getExternalStorageDirectory()}/Endoscope") + if (!directory.exists()) { + Log.d(kTag, "createRootDirectory: 新建文件夹") + directory.mkdirs() + } + Log.d(kTag, "createRootDirectory: $directory") + } + + fun getRootDirectory(): File { + return directory + } + + fun getVideoFileDir(): File { + val videoDir = File(getRootDirectory(), "Video") + if (!videoDir.exists()) { + videoDir.mkdir() + } + + val childDir = File(videoDir, System.currentTimeMillis().timestampToDate()) + if (!childDir.exists()) { + childDir.mkdir() + } + return childDir + } + + fun getImageFileDir(): File { + val imageDir = File(getRootDirectory(), "Picture") + if (!imageDir.exists()) { + imageDir.mkdir() + } + + val childDir = File(imageDir, System.currentTimeMillis().timestampToDate()) + if (!childDir.exists()) { + childDir.mkdir() + } + return childDir + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/endoscope/utils/ProjectConstant.kt b/app/src/main/java/com/casic/endoscope/utils/ProjectConstant.kt index d278fdd..2c214b1 100644 --- a/app/src/main/java/com/casic/endoscope/utils/ProjectConstant.kt +++ b/app/src/main/java/com/casic/endoscope/utils/ProjectConstant.kt @@ -9,7 +9,6 @@ arrayOf( Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, - Manifest.permission.MANAGE_EXTERNAL_STORAGE, Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.READ_MEDIA_VIDEO, Manifest.permission.BLUETOOTH_CONNECT, @@ -21,7 +20,6 @@ arrayOf( Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, - Manifest.permission.MANAGE_EXTERNAL_STORAGE, Manifest.permission.BLUETOOTH_CONNECT, Manifest.permission.BLUETOOTH_SCAN, Manifest.permission.ACCESS_COARSE_LOCATION, @@ -31,7 +29,6 @@ arrayOf( Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, - Manifest.permission.MANAGE_EXTERNAL_STORAGE, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION ) diff --git a/app/src/main/java/com/casic/endoscope/view/MainActivity.kt b/app/src/main/java/com/casic/endoscope/view/MainActivity.kt index 5834b2a..c2f935b 100644 --- a/app/src/main/java/com/casic/endoscope/view/MainActivity.kt +++ b/app/src/main/java/com/casic/endoscope/view/MainActivity.kt @@ -20,14 +20,13 @@ import com.casic.endoscope.extensions.check import com.casic.endoscope.extensions.convertValue import com.casic.endoscope.extensions.createHorizontalCommand -import com.casic.endoscope.extensions.createImageFileDir import com.casic.endoscope.extensions.createVerticalCommand -import com.casic.endoscope.extensions.createVideoFileDir import com.casic.endoscope.extensions.getChannel import com.casic.endoscope.extensions.init import com.casic.endoscope.extensions.toTime import com.casic.endoscope.service.VideoTranscodeService import com.casic.endoscope.utils.DataBaseManager +import com.casic.endoscope.utils.FileManager import com.casic.endoscope.utils.ProjectConstant import com.casic.endoscope.utils.ble.BleDeviceManager import com.casic.endoscope.utils.ble.OnDeviceConnectListener @@ -57,10 +56,13 @@ import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.extensions.timestampToTime +import com.pengxh.kt.lite.extensions.toJson +import com.pengxh.kt.lite.extensions.writeToFile import com.pengxh.kt.lite.utils.LoadingDialogHub import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import java.io.File import java.text.SimpleDateFormat import java.util.Date @@ -109,7 +111,7 @@ private var timer: Timer? = null private var timerTask: TimerTask? = null private var seconds = 0L - private var inputVideoPath = "" + private var videoPath = "" private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var serviceIntent: Intent private lateinit var dataSet: LineDataSet @@ -195,6 +197,10 @@ binding.outputDataView.setOnClickListener { val valueBeans = DataBaseManager.get.loadAll() //导出到本地文件 + val rootDirectory = FileManager.getRootDirectory() + val file = File("${rootDirectory}/GasDensityValue.json") + valueBeans.toJson().writeToFile(file) + "数据导出成功,请在设备文件管理根目录【Endoscope】查看".show(this) } binding.upScaleButton.setOnTouchListener { _, event -> @@ -380,7 +386,7 @@ strJpeg.wPicQuality = 1 strJpeg.wPicSize = 2 - val imagePath = "/${createImageFileDir()}/${timeFormat.format(Date())}.png" + val imagePath = "/${FileManager.getImageFileDir()}/${timeFormat.format(Date())}.png" hkSDK.NET_DVR_CaptureJPEGPicture( returnUserId, selectChannel, strJpeg, imagePath ) @@ -400,8 +406,8 @@ //视频录制 binding.videoButton.setOnClickListener { if (isPreviewSuccess) { - inputVideoPath = "/${createVideoFileDir()}/${timeFormat.format(Date())}.mp4" - hkSDK.NET_DVR_SaveRealData(returnUserId, inputVideoPath) + videoPath = "/${FileManager.getVideoFileDir()}/${timeFormat.format(Date())}.mp4" + hkSDK.NET_DVR_SaveRealData(returnUserId, videoPath) binding.videoStateView.visibility = View.VISIBLE } else { "摄像头预览未打开,无法录制视频".show(this) @@ -412,7 +418,7 @@ //停止视频抓取 hkSDK.NET_DVR_StopSaveRealData(returnUserId) binding.videoStateView.visibility = View.INVISIBLE - ProjectConstant.VIDEO_PATH_STACK.push(inputVideoPath) + ProjectConstant.VIDEO_PATH_STACK.push(videoPath) "视频录制成功".show(this) true } @@ -650,12 +656,15 @@ if (value.check()) { /***将值渲染到曲线图****************************************************************/ lifecycleScope.launch(Dispatchers.Main) { + val currentTime = System.currentTimeMillis().timestampToTime() //解析返回值 val density = value.convertValue() - //将数据保存在数据库 -// DataBaseManager.get.saveGasDensity(density) + withContext(Dispatchers.IO) { + //协程切换为子线程将数据保存在数据库 + DataBaseManager.get.saveGasDensity(density, currentTime) + } //时间作为X轴 - xAxisLabels.add(System.currentTimeMillis().timestampToTime()) + xAxisLabels.add(currentTime) //浓度作为Y轴 val entry = Entry(i++.toFloat(), density.toFloat(), "浓度") diff --git a/app/src/main/java/com/casic/endoscope/view/PermissionActivity.kt b/app/src/main/java/com/casic/endoscope/view/PermissionActivity.kt index ed85113..770a441 100644 --- a/app/src/main/java/com/casic/endoscope/view/PermissionActivity.kt +++ b/app/src/main/java/com/casic/endoscope/view/PermissionActivity.kt @@ -3,6 +3,7 @@ import android.os.Bundle import com.casic.endoscope.R import com.casic.endoscope.databinding.ActivityPermissionBinding +import com.casic.endoscope.utils.FileManager import com.casic.endoscope.utils.ProjectConstant import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -16,6 +17,7 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { + FileManager.initRootDirectory(this) if (EasyPermissions.hasPermissions(this, *ProjectConstant.USER_PERMISSIONS)) { navigatePageTo() finish() diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index ab704fa..bca816f 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -115,15 +115,13 @@ android:textSize="@dimen/sp_16" /> - + android:textSize="@dimen/sp_16" />