desc:展示本地录制视频

main
xiaowusky 2 years ago
parent 2de439bf9a
commit ef6b84334f

@ -2,13 +2,23 @@ package com.yinuo.safetywatcher.watcher.ui
import android.content.Intent
import android.view.View
import androidx.activity.result.contract.ActivityResultContracts
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager
import com.common.commonlib.db.DBUtils
import com.common.commonlib.db.entity.Video
import com.yinuo.safetywatcher.R
import com.yinuo.safetywatcher.databinding.ActivityHistoryVideoBinding
import com.yinuo.safetywatcher.player.ProVideoActivity
import com.yinuo.safetywatcher.watcher.base.BaseActivity
import com.yinuo.safetywatcher.watcher.constant.DEFAULT_QUERY_TIME_INTERVAL
import com.yinuo.safetywatcher.watcher.ui.adapter.HistoryVideoAdapter
import com.yinuo.safetywatcher.watcher.ui.view.CommonTopBar
import com.yinuo.safetywatcher.watcher.utils.DateUtils
import com.yinuo.safetywatcher.watcher.utils.LztekUtil
import com.yinuo.safetywatcher.watcher.utils.showToast
import com.yinuo.safetywatcher.watcher.ui.view.CommonTopBar
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import java.io.File
@ -18,9 +28,17 @@ class HistoryVideoActivity : BaseActivity() {
ActivityHistoryVideoBinding.inflate(layoutInflater)
}
private val mAdapter = HistoryVideoAdapter().apply {
mItemClickListener = object : HistoryVideoAdapter.OnItemClickListener {
override fun onItemClick(data: Video) {
gotoPlayVideo(data.path)
}
}
}
override fun onOptionClick(type: Int, target: View) {
if (0 == type) {
queryData()
} else if (1 == type) {
val usbStoragePath = LztekUtil.getLztek()?.usbStoragePath
if (usbStoragePath.isNullOrEmpty() || !File(usbStoragePath).exists()) {
@ -33,7 +51,7 @@ class HistoryVideoActivity : BaseActivity() {
override fun getOptions(): List<CommonTopBar.Option>? {
val ops = mutableListOf<CommonTopBar.Option>()
// ops.add(CommonTopBar.Option(0, getString(R.string.search)))
ops.add(CommonTopBar.Option(0, getString(R.string.search)))
ops.add(CommonTopBar.Option(1, getString(R.string.export)))
return ops
}
@ -46,7 +64,61 @@ class HistoryVideoActivity : BaseActivity() {
return mBinding.root
}
private var startTime = -1L
private var endTime = -1L
private val paramsLauncher =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
if (result.resultCode == RESULT_OK) {
val intent = result.data
intent?.apply {
startTime = getLongExtra(ChooseParamsActivity.START_TIME, startTime)
endTime = getLongExtra(ChooseParamsActivity.END_TIME, endTime)
initDefaultParamsUi()
queryData()
}
}
}
private fun initDefaultParamsUi() {
if (startTime < 0) {
startTime = System.currentTimeMillis() - DEFAULT_QUERY_TIME_INTERVAL
}
if (endTime < 0) {
endTime = System.currentTimeMillis()
}
val startTimeStr = DateUtils.formatHistoryTime(this.startTime)
val endTimeStr = DateUtils.formatHistoryTime(this.endTime)
mBinding.tvParams.text =
"时间: $startTimeStr——$endTimeStr"
}
private fun queryData() {
lifecycleScope.launch {
val videoDao = DBUtils.videoDao()
val videos = videoDao.getAllByTime(startTime, endTime)
launch(Dispatchers.Main) {
mAdapter.setData(videos)
}
}
}
override fun initView() {
mBinding.tvModifyParams.setOnClickListener {
paramsLauncher.launch(
ChooseParamsActivity.open(
this@HistoryVideoActivity,
startTime,
endTime,
)
)
}
mBinding.rvData.layoutManager = LinearLayoutManager(this@HistoryVideoActivity)
mBinding.rvData.adapter = mAdapter
initDefaultParamsUi()
queryData()
}
private fun export2Upan() {

@ -0,0 +1,43 @@
package com.yinuo.safetywatcher.watcher.ui.adapter
import android.view.LayoutInflater
import android.view.ViewGroup
import com.yinuo.safetywatcher.databinding.LayoutItemHistoryBinding
import com.yinuo.safetywatcher.watcher.base.BaseRvAdapter
import com.common.commonlib.db.entity.Video
import com.yinuo.safetywatcher.watcher.utils.DateUtils
class HistoryVideoAdapter :
BaseRvAdapter<Video, LayoutItemHistoryBinding, HistoryVideoAdapter.HViewHolder>() {
class HViewHolder(
val binding: LayoutItemHistoryBinding,
val mItemClickListener: OnItemClickListener?
) :
BaseRvAdapter.BaseViewHolder<Video, LayoutItemHistoryBinding>(binding) {
override fun bindView(data: Video) {
binding.tvTime.text = formatTime(data.time)
binding.tvSensor.text = data.path
binding.root.setOnClickListener {
mItemClickListener?.onItemClick(data)
}
}
private fun formatTime(time: Long): CharSequence? {
return DateUtils.formatHistoryTime(time)
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): HViewHolder {
val binding =
LayoutItemHistoryBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return HViewHolder(binding, mItemClickListener)
}
var mItemClickListener: OnItemClickListener? = null
interface OnItemClickListener {
fun onItemClick(data: Video)
}
}

@ -1,7 +1,34 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="@dimen/_108dp"
android:gravity="center_vertical">
<TextView
android:id="@+id/tv_params"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/_172dp"
android:textColor="@color/white"
android:textSize="@dimen/_32dp" />
<TextView
android:id="@+id/tv_modify_params"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/_20dp"
android:background="@drawable/save_btn_bg"
android:paddingHorizontal="@dimen/_18dp"
android:paddingVertical="@dimen/_12dp"
android:text="@string/modify_params"
android:textColor="@color/white"
android:textSize="@dimen/_32dp" />
</LinearLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_data"

@ -4,7 +4,7 @@ project.ext.setLibDefaultConfig project
android {
defaultConfig {
ndk {
abiFilters 'armeabi', 'armeabi-v7a', 'x86'
abiFilters 'armeabi-v7a'
}
}
sourceSets {

@ -12,6 +12,8 @@ import com.common.commonlib.db.entity.Gas
import com.common.commonlib.db.entity.GasType
import com.common.commonlib.db.entity.Video
import com.common.commonlib.db.entity.Warning
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
@Database(
entities = [Warning::class, Gas::class, GasType::class, Video::class],
@ -48,4 +50,10 @@ object DBUtils {
fun videoDao(): VideoDao {
return db.videoDao()
}
fun insertCacheVideo(cacheVideo: Video) {
GlobalScope.launch {
videoDao().insert(cacheVideo)
}
}
}

@ -4,6 +4,7 @@ import androidx.room.Dao
import androidx.room.Delete
import androidx.room.Insert
import androidx.room.Query
import com.common.commonlib.db.entity.Gas
import com.common.commonlib.db.entity.Video
@Dao
@ -11,12 +12,15 @@ interface VideoDao {
@Query("SELECT * FROM video")
suspend fun getAll(): List<Video>
@Query("SELECT * FROM video WHERE time BETWEEN :startTime AND :endTime")
suspend fun getAllByTime(startTime: Long, endTime: Long): List<Video>
@Insert
suspend fun insert(gas: Video)
suspend fun insert(video: Video)
@Insert
suspend fun insertAll(types: List<Video>)
@Delete
suspend fun delete(gas: Video)
suspend fun delete(video: Video)
}

@ -7,7 +7,7 @@ import androidx.room.PrimaryKey
@Entity
data class Video(
@ColumnInfo(name = "time") var time: Long,
@ColumnInfo(name = "file_name") var name: Long,
@ColumnInfo(name = "file_name") var name: String,
@ColumnInfo(name = "uploaded") var uploaded: Boolean = false,
@PrimaryKey @ColumnInfo(name = "file_path") var path: String
)

@ -12,6 +12,6 @@ dependencies {
//ijk
implementation 'tv.danmaku.ijk.media:ijkplayer-java:0.8.8'
implementation 'tv.danmaku.ijk.media:ijkplayer-arm64:0.8.8'
implementation 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.8.8'
}

@ -4,6 +4,9 @@ import android.media.MediaCodec;
import android.media.MediaFormat;
import android.media.MediaMuxer;
import com.common.commonlib.db.DBUtils;
import com.common.commonlib.db.entity.Video;
import java.io.File;
import java.io.IOException;
import java.nio.ByteBuffer;
@ -25,7 +28,8 @@ public class AndroidMuxer {
private volatile int mNumReleases;
private long mStartRecordTime = 0L;
private static final long DEFAULT_RECORD_DURATION = 30 * 60 * 1000;
// private static final long DEFAULT_RECORD_DURATION = 30 * 60 * 1000;
private static final long DEFAULT_RECORD_DURATION = 10 * 1000;
public AndroidMuxer() {
createMediaMuxer();
@ -37,11 +41,18 @@ public class AndroidMuxer {
String filePath = output.getAbsolutePath();
mMuxer = new MediaMuxer(filePath, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);
mStarted = false;
insertToDB(filePath);
} catch (IOException e) {
e.printStackTrace();
}
}
private void insertToDB(String filePath) {
String[] splits = filePath.split("/");
Video cacheVideo = new Video(System.currentTimeMillis(), splits[splits.length - 1], false, filePath);
DBUtils.INSTANCE.insertCacheVideo(cacheVideo);
}
public int addTrack(MediaFormat trackFormat) {
if (mStarted) {
throw new IllegalStateException();

Loading…
Cancel
Save