视频下载功能

This commit is contained in:
2026-06-11 11:53:52 +08:00
parent e40403f7db
commit 57188d27cc
5 changed files with 131 additions and 11 deletions

View File

@@ -13,6 +13,17 @@
</DropdownSelection> </DropdownSelection>
<DialogSelection /> <DialogSelection />
</SelectionState> </SelectionState>
<SelectionState runConfigName="AlarmLogActivity">
<option name="selectionMode" value="DROPDOWN" />
<DropdownSelection timestamp="2026-05-18T09:18:19.023586Z">
<Target type="DEFAULT_BOOT">
<handle>
<DeviceId pluginId="PhysicalDevice" identifier="serial=80bece4" />
</handle>
</Target>
</DropdownSelection>
<DialogSelection />
</SelectionState>
</selectionStates> </selectionStates>
</component> </component>
</project> </project>

View File

@@ -103,6 +103,8 @@ dependencies {
implementation("com.contrarywind:Android-PickerView:4.1.9") implementation("com.contrarywind:Android-PickerView:4.1.9")
// GSYVideoPlayer // GSYVideoPlayer
implementation("io.github.carguo:gsyvideoplayer:13.0.0") implementation("io.github.carguo:gsyvideoplayer:13.0.0")
//下载
implementation("io.github.chiclaim:downloader:1.0.2")
} }

View File

@@ -3,7 +3,9 @@ package com.example.defenseapplication.liveVideo
import android.content.Context import android.content.Context
import android.graphics.Color import android.graphics.Color
import android.media.AudioManager import android.media.AudioManager
import android.media.MediaScannerConnection
import android.os.Bundle import android.os.Bundle
import android.os.Environment
import android.util.Log import android.util.Log
import android.view.View import android.view.View
import android.widget.Toast import android.widget.Toast
@@ -11,6 +13,7 @@ import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.media3.exoplayer.offline.Download
import com.example.defenseapplication.R import com.example.defenseapplication.R
import com.example.defenseapplication.adapter.AlarmLogAdapter import com.example.defenseapplication.adapter.AlarmLogAdapter
import com.example.defenseapplication.bean.DeviceAlarmBean import com.example.defenseapplication.bean.DeviceAlarmBean
@@ -22,6 +25,7 @@ import com.shuyu.gsyvideoplayer.utils.OrientationUtils
import com.shuyu.gsyvideoplayer.video.StandardGSYVideoPlayer import com.shuyu.gsyvideoplayer.video.StandardGSYVideoPlayer
import com.bigkoo.pickerview.builder.TimePickerBuilder import com.bigkoo.pickerview.builder.TimePickerBuilder
import com.bigkoo.pickerview.listener.OnTimeSelectListener import com.bigkoo.pickerview.listener.OnTimeSelectListener
import com.chiclaim.android.downloader.Downloader
import com.example.defenseapplication.view.CustomDialogFragment import com.example.defenseapplication.view.CustomDialogFragment
import com.example.defenseapplication.view.LoadingDialog import com.example.defenseapplication.view.LoadingDialog
import com.example.defenseapplication.view.MyGSYVideoPlayer import com.example.defenseapplication.view.MyGSYVideoPlayer
@@ -29,8 +33,12 @@ import com.example.defenseapplication.view.showDefenseDialog
import com.gyf.immersionbar.ImmersionBar import com.gyf.immersionbar.ImmersionBar
import com.shuyu.gsyvideoplayer.GSYVideoManager import com.shuyu.gsyvideoplayer.GSYVideoManager
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import java.io.File
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.* import java.util.*
import android.net.Uri
import com.chiclaim.android.downloader.DownloadRequest
import com.chiclaim.android.downloader.DownloadListener
//告警记录 //告警记录
class AlarmLogActivity : AppCompatActivity() { class AlarmLogActivity : AppCompatActivity() {
@@ -46,7 +54,6 @@ class AlarmLogActivity : AppCompatActivity() {
private var isMute = false private var isMute = false
private lateinit var audioManager: AudioManager private lateinit var audioManager: AudioManager
private var isRightMenuVisible = false
private var currentAlarmItem: DeviceAlarmBean? = null private var currentAlarmItem: DeviceAlarmBean? = null
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
@@ -234,9 +241,39 @@ class AlarmLogActivity : AppCompatActivity() {
} }
binding.ivDownload.setOnClickListener { binding.ivDownload.setOnClickListener {
showConfirmDialog(getString(R.string.tip), getString(R.string.download_alarm_video_confirm)) {
// 下载逻辑 // val item = currentAlarmItem
Toast.makeText(this, getString(R.string.download_start), Toast.LENGTH_SHORT).show() //
// if (item?.video.isNullOrEmpty()) {
// Toast.makeText(
// this,
// "没有可下载的视频",
// Toast.LENGTH_SHORT
// ).show()
// return@setOnClickListener
// }
showConfirmDialog(
getString(R.string.tip),
getString(R.string.download_alarm_video_confirm)
) {
//downloadVideo(item!!.video)
downloadVideo(
"https://media.w3.org/2010/05/sintel/trailer.mp4"
)
Toast.makeText(
this,
"开始下载",
Toast.LENGTH_SHORT
).show()
Toast.makeText(
this,
getString(R.string.download_start),
Toast.LENGTH_SHORT
).show()
} }
} }
binding.ivDelete.setOnClickListener { binding.ivDelete.setOnClickListener {
@@ -307,6 +344,69 @@ class AlarmLogActivity : AppCompatActivity() {
showDefenseDialog(config, onPositiveClick = { onConfirm() }) showDefenseDialog(config, onPositiveClick = { onConfirm() })
} }
private fun downloadVideo(url: String) {
val dir = File(
Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_MOVIES
),
"AlarmVideo"
)
if (!dir.exists()) {
dir.mkdirs()
}
val targetFile = File(
dir,
"${System.currentTimeMillis()}.mp4"
)
val request = DownloadRequest(
this,
url
)
.setDestinationUri(Uri.fromFile(targetFile))
.registerListener(object : DownloadListener {
override fun onDownloadStart() {
Log.d("DOWNLOAD", "开始下载")
}
override fun onProgressUpdate(percent: Int) {
Log.d("DOWNLOAD", "进度:$percent%")
}
override fun onDownloadComplete(uri: Uri) {
MediaScannerConnection.scanFile(
this@AlarmLogActivity,
arrayOf(targetFile.absolutePath),
arrayOf("video/mp4"),
null
)
runOnUiThread {
Toast.makeText(
this@AlarmLogActivity,
"下载成功",
Toast.LENGTH_SHORT
).show()
}
}
override fun onDownloadFailed(e: Throwable) {
runOnUiThread {
Toast.makeText(
this@AlarmLogActivity,
"下载失败:${e.message}",
Toast.LENGTH_SHORT
).show()
}
}
})
request.startDownload()
}
private fun deleteAlarmItem(id: String, loadingDialog: LoadingDialog) { private fun deleteAlarmItem(id: String, loadingDialog: LoadingDialog) {
lifecycleScope.launch { lifecycleScope.launch {
try { try {

View File

@@ -260,6 +260,12 @@
<!-- Dialog --> <!-- Dialog -->
<string name="tip">提示</string> <string name="tip">提示</string>
<string name="download_alarm_video_confirm">确定下载该入侵告警视频?</string>
<string name="delete_alarm_video_confirm">确定删除该入侵告警视频?</string>
<string name="download_alarm_photo_confirm">确定下载该入侵告警照片?</string>
<string name="delete_alarm_photo_confirm">确定删除该入侵告警照片?</string>
<string name="download_start">开始下载</string>
<string name="delete_success">删除成功</string>
<string name="please_wait">请稍候...</string> <string name="please_wait">请稍候...</string>
<string name="operation_success">操作成功</string> <string name="operation_success">操作成功</string>
<string name="operation_failed">操作失败</string> <string name="operation_failed">操作失败</string>
@@ -488,4 +494,5 @@
<string name="verify_failed">验证失败</string> <string name="verify_failed">验证失败</string>
<string name="password_update_success">密码修改成功</string> <string name="password_update_success">密码修改成功</string>
<string name="password_update_failed">密码修改失败</string> <string name="password_update_failed">密码修改失败</string>
<string name="update_failed">更新失败</string>
</resources> </resources>

View File

@@ -235,13 +235,13 @@
<string name="generate_invite_code">Generate Invite Code</string> <string name="generate_invite_code">Generate Invite Code</string>
<!-- Dialog --> <!-- Dialog -->
<string name="tip">提示</string> <string name="tip">Tip</string>
<string name="download_alarm_video_confirm">确定下载该入侵告警视频?</string> <string name="download_alarm_video_confirm">Confirm to download this intrusion alarm video?</string>
<string name="delete_alarm_video_confirm">确定删除该入侵告警视频?</string> <string name="delete_alarm_video_confirm">Confirm to delete this intrusion alarm video?</string>
<string name="download_alarm_photo_confirm">确定下载该入侵告警照片?</string> <string name="download_alarm_photo_confirm">Confirm to download this intrusion alarm photo?</string>
<string name="delete_alarm_photo_confirm">确定删除该入侵告警照片?</string> <string name="delete_alarm_photo_confirm">Confirm to delete this intrusion alarm photo?</string>
<string name="download_start">开始下载</string> <string name="download_start">Start Download</string>
<string name="delete_success">删除成功</string> <string name="delete_success">Deleted successfully</string>
<string name="please_wait">Please wait...</string> <string name="please_wait">Please wait...</string>
<string name="operation_success">Operation successful</string> <string name="operation_success">Operation successful</string>
<string name="operation_failed">Operation failed</string> <string name="operation_failed">Operation failed</string>