视频下载功能
This commit is contained in:
11
.idea/deploymentTargetSelector.xml
generated
11
.idea/deploymentTargetSelector.xml
generated
@@ -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>
|
||||||
@@ -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")
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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>
|
||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user