Android 循环录像,保留加锁视频,flutter框架

这篇具有很好参考价值的文章主要介绍了Android 循环录像,保留加锁视频,flutter框架。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

return 0;

}

}

/**

  • 获取所有的视频信息

  • @return

*/

public List getAllDriveVideo() {

List driveVideoList = new ArrayList();

String selectQuery = "SELECT * FROM " + VIDEO_TABLE_NAME;

SQLiteDatabase db = this.getWritableDatabase();

Cursor cursor = db.rawQuery(selectQuery, null);

// looping through all rows and adding to list

if (cursor.moveToFirst()) {

do {

DriveVideo driveVideo = new DriveVideo(cursor.getInt(0),

cursor.getString(1), cursor.getInt(2), cursor.getInt(3));

driveVideoList.add(driveVideo);

} while (cursor.moveToNext());

}

db.close();

cursor.close();

// return list

return driveVideoList;

}

public Cursor getAllDriveVideoCursor() {

String selectQuery = "SELECT * FROM " + VIDEO_TABLE_NAME;

SQLiteDatabase db = this.getReadableDatabase();

Cursor cursor = db.rawQuery(selectQuery, null);

return cursor;

}

/**

  • 获取加锁视频Cursor

  • @return

*/

public Cursor getLockVideoCursor() {

String sqlLine = "SELECT * FROM " + VIDEO_TABLE_NAME + " WHERE "

  • VIDEO_COL_LOCK + “=?”;

String selection[] = new String[] { “1” };

SQLiteDatabase db = this.getReadableDatabase();

Cursor cursor = db.rawQuery(sqlLine, selection);

return cursor;

}

/**

  • 获取最旧且未加锁视频ID

  • @return

*/

public int getOldestUnlockVideoId() {

String sqlLine = "SELECT * FROM " + VIDEO_TABLE_NAME + " WHERE "

  • VIDEO_COL_LOCK + “=?”;

String selection[] = new String[] { “0” };

SQLiteDatabase db = this.getReadableDatabase();

Cursor cursor = db.rawQuery(sqlLine, selection);

if (cursor.getCount() > 0) {

cursor.moveToFirst();

int id = cursor.getInt(cursor.getColumnIndex(VIDEO_COL_ID));

db.close();

cursor.close();

return id;

} else {

db.close();

cursor.close();

return -1;

}

}

/**

  • 获取最旧视频(包括加锁)ID

  • @return

*/

public int getOldestVideoId() {

String sqlLine = "SELECT * FROM " + VIDEO_TABLE_NAME;

SQLiteDatabase db = this.getReadableDatabase();

Cursor cursor = db.rawQuery(sqlLine, null);

if (cursor.getCount() > 0) {

cursor.moveToFirst();

int id = cursor.getInt(cursor.getColumnIndex(VIDEO_COL_ID));

db.close();

cursor.close();

return id;

} else {

db.close();

cursor.close();

return -1;

}

}

public String getVideNameById(int id) {

String sqlLine = "SELECT * FROM " + VIDEO_TABLE_NAME + " WHERE "

  • VIDEO_COL_ID + “=?”;

String selection[] = new String[] { String.valueOf(id) };

SQLiteDatabase db = this.getReadableDatabase();

Cursor cursor = db.rawQuery(sqlLine, selection);

if (cursor.getCount() > 0) {

cursor.moveToFirst();

String videoName = cursor.getString(cursor

.getColumnIndex(VIDEO_COL_NAME));

db.close();

cursor.close();

return videoName;

} else {

db.close();

cursor.close();

return “”;

}

}

public int updateDriveVideo(DriveVideo driveVideo) {

SQLiteDatabase db = this.getWritableDatabase();

ContentValues values = new ContentValues();

values.put(VIDEO_COL_NAME, driveVideo.getName());

values.put(VIDEO_COL_LOCK, driveVideo.getLock());

values.put(VIDEO_COL_RESOLUTION, driveVideo.getResolution());

return db.update(VIDEO_TABLE_NAME, values, VIDEO_COL_ID + “=?”,

new String[] { String.valueOf(driveVideo.getId()) });

}

public void deleteDriveVideoById(int driveVideoId) {

SQLiteDatabase db = this.getWritableDatabase();

db.delete(VIDEO_TABLE_NAME, VIDEO_COL_ID + “=?”,

new String[] { String.valueOf(driveVideoId) });

db.close();

}

public void deleteDriveVideoByName(String name) {

SQLiteDatabase db = this.getWritableDatabase();

db.delete(VIDEO_TABLE_NAME, VIDEO_COL_NAME + “=?”,

new String[] { name });

db.close();

}

public void deleteAllDriveVideo() {

SQLiteDatabase db = this.getWritableDatabase();

db.delete(VIDEO_TABLE_NAME, null, null);

db.close();

}

}

不过,函数写这么长真的好么?

/**

  • 删除最旧视频

*/

private boolean deleteOldestUnlockVideo() {

try {

String sdcardPath = Constant.Path.SDCARD_1 + File.separator;// “/storage/sdcard1/”;

if (Constant.Record.saveVideoToSD2) {

sdcardPath = Constant.Path.SDCARD_2 + File.separator;// “/storage/sdcard2/”;

}

// sharedPreferences.getString(“sdcardPath”,“/mnt/sdcard2”);

float sdFree = StorageUtil.getSDAvailableSize(sdcardPath);

float sdTotal = StorageUtil.getSDTotalSize(sdcardPath);

int intSdFree = (int) sdFree;

MyLog.v(“[deleteOldestUnlockVideo] sdFree:” + intSdFree);

while (sdFree < sdTotal * Constant.Record.SD_MIN_FREE_PERCENT

|| intSdFree < Constant.Record.SD_MIN_FREE_STORAGE) {

int oldestUnlockVideoId = videoDb.getOldestUnlockVideoId();

// 删除较旧未加锁视频文件

if (oldestUnlockVideoId != -1) {

String oldestUnlockVideoName = videoDb

.getVideNameById(oldestUnlockVideoId);

File f = new File(sdcardPath + “tachograph/”

  • oldestUnlockVideoName.split(“_”)[0]

  • File.separator + oldestUnlockVideoName);

if (f.exists() && f.isFile()) {

MyLog.d(“Delete Old Unlock Video:” + f.getName());

int i = 0;

while (!f.delete() && i < 5) {

i++;

MyLog.d(“Delete Old Unlock Video:” + f.getName()

  • " Filed!!! Try:" + i);

}

}

// 删除数据库记录

videoDb.deleteDriveVideoById(oldestUnlockVideoId);

} else {

int oldestVideoId = videoDb.getOldestVideoId();

if (oldestVideoId == -1) {

/**

  • 有一种情况:数据库中无视频信息。导致的原因:

  • 1:升级时选Download的话,不会清理USB存储空间,应用数据库被删除; 2:应用被清除数据

  • 这种情况下旧视频无法直接删除, 此时如果满存储,需要直接删除

*/

File file = new File(sdcardPath + “tachograph/”);

StorageUtil.RecursionDeleteFile(file);

MyLog.e(“!!! Delete tachograph/ Directory”);

sdFree = StorageUtil.getSDAvailableSize(sdcardPath);

intSdFree = (int) sdFree;

if (sdFree < sdTotal

  • Constant.Record.SD_MIN_FREE_PERCENT

|| intSdFree < Constant.Record.SD_MIN_FREE_STORAGE) {

// 此时若空间依然不足,提示用户清理存储(已不是行车视频的原因)

MyLog.e(“Storage is full…”);

String strNoStorage = getResources().getString(

R.string.storage_full_cause_by_other);

audioRecordDialog.showErrorDialog(strNoStorage);

// new Thread(new dismissDialogThread()).start();

startSpeak(strNoStorage);

return false;

}

} else {

// 提示用户清理空间,删除较旧的视频(加锁)

String strStorageFull = getResources().getString(

R.string.storage_full_and_delete_lock);

startSpeak(strStorageFull);

Toast.makeText(getApplicationContext(), strStorageFull,

Toast.LENGTH_SHORT).show();

String oldestVideoName = videoDb

.getVideNameById(oldestVideoId);

File f = new File(sdcardPath + “tachograph/”

  • oldestVideoName.split(“_”)[0]

  • File.separator + oldestVideoName);

if (f.exists() && f.isFile()) {

MyLog.d(“Delete Old lock Video:” + f.getName());

int i = 0;

while (!f.delete() && i < 5) {

i++;

MyLog.d(“Delete Old lock Video:” + f.getName()

  • " Filed!!! Try:" + i);

}

}

// 删除数据库记录

videoDb.deleteDriveVideoById(oldestVideoId);

}

}

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
Android 循环录像,保留加锁视频,flutter框架,2024年程序员学习,android,音视频,flutter
Android 循环录像,保留加锁视频,flutter框架,2024年程序员学习,android,音视频,flutter
Android 循环录像,保留加锁视频,flutter框架,2024年程序员学习,android,音视频,flutter
Android 循环录像,保留加锁视频,flutter框架,2024年程序员学习,android,音视频,flutter
Android 循环录像,保留加锁视频,flutter框架,2024年程序员学习,android,音视频,flutter
Android 循环录像,保留加锁视频,flutter框架,2024年程序员学习,android,音视频,flutter
Android 循环录像,保留加锁视频,flutter框架,2024年程序员学习,android,音视频,flutter

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
Android 循环录像,保留加锁视频,flutter框架,2024年程序员学习,android,音视频,flutter

总结

可以看出,笔者的工作学习模式便是由以下 「六个要点」 组成:

❝ 多层次的工作/学习计划 + 番茄工作法 + 定额工作法 + 批处理 + 多任务并行 + 图层工作法❞

希望大家能将这些要点融入自己的工作学习当中,我相信一定会工作与学习地更富有成效。

下面是我学习用到的一些书籍学习导图,以及系统的学习资料。每一个知识点,都有对应的导图,学习的资料,视频,面试题目。

**如:我需要学习 **Flutter的知识。(大家可以参考我的学习方法)

  • Flutter 的思维导图(无论学习什么,有学习路线都会事半功倍)

Android 循环录像,保留加锁视频,flutter框架,2024年程序员学习,android,音视频,flutter

  • Flutter进阶学习全套手册

Android 循环录像,保留加锁视频,flutter框架,2024年程序员学习,android,音视频,flutter

  • Flutter进阶学习全套视频

Android 循环录像,保留加锁视频,flutter框架,2024年程序员学习,android,音视频,flutter

大概就上面这几个步骤,这样学习不仅高效,而且能系统的学习新的知识。

本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算文章来源地址https://www.toymoban.com/news/detail-850049.html

61994)]

  • Flutter进阶学习全套手册

[外链图片转存中…(img-rDGpbj1u-1712100961995)]

  • Flutter进阶学习全套视频

[外链图片转存中…(img-dmhlBULg-1712100961995)]

大概就上面这几个步骤,这样学习不仅高效,而且能系统的学习新的知识。

本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

到了这里,关于Android 循环录像,保留加锁视频,flutter框架的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Flutter视频播放器在iOS端和Android端都能实现全屏播放

    Flutter开发过程中,对于视频播放的三方组件有很多,在Android端适配都挺好,但是在适配iPhone手机的时候,如果设置了 UIInterfaceOrientationLandscapeLeft 和 UIInterfaceOrientationLandscapeRight 都为false的情况下,无法做到全屏播放,因为FLutter的 SystemChrome.setPreferredOrientations 方法不适配iOS端

    2024年02月05日
    浏览(37)
  • Android:手把手带你入门跨平台UI开发框架Flutter,渣本Android开发小伙如何一步步成为架构师

    3.1 框架结构 Flutter框架主要分为两层:FrameWork层、Engine层,如下图所示: 说明:开发时,主要基于Framework层;运行时,则是运行在 Engine上。每层的具体介绍如下: 3.2 原理概述 开发时,主要基于Framework层;运行时,则是运行在 Engine上 Engine是Flutter的独立虚拟机,由它适配 提

    2024年04月16日
    浏览(45)
  • 视频监控录像服务器(中心录像服务器)功能详细介绍

    目                     录 一、概述 (一)定义 (二)视频监控中心录像服务器 二、存储策略服务 (一)存储策略配置 1、 录入页面 2、 选择需要进行录像的视频 3、批量选择多个通道号 4、其他关键参数选择 5、最后选择时间段 6、确认策略参数正确 (二)存储策略维

    2024年01月25日
    浏览(30)
  • Android音视频——OpenMAX (OMX)框架

    本文分为两个部分进行讲解 Codec 部分中的 AwesomePlayer 到 OMX 服务 前面介绍了NuPlayer最终解码都会到达OMX框架,也就是 OpenMAX框架,本文开始分析编解码部分中的AwesomePlayer到OMX服务过程,也就是开启OpenMAX准备相关内容。Android系统中用OpenMAX来做编解码,Android向上抽象了一 层O

    2023年04月09日
    浏览(37)
  • LiveNVR监控流媒体Onvif/RTSP功能-支持云端录像监控视频集中存储录像回看录像计划配置NVR硬件设备录像回看

    LiveNVR可接入传统监控行业里面的高清网络摄像机的RTSP直播流,及 RTMP、HTTP-FLV、M3U8等其它直播流, 实现互联网直播分发;可分发多种格式流,HTTP-FLV/WS-FLV/RTMP/RTSP/WebRTC/HLS。支持GB28181注册级联到第三方国标平台; 同时能实时云端存储、录像计划、检索、时移回放,也可以查看

    2024年04月12日
    浏览(53)
  • Android 使用自带的MediaCodec 框架进行本地视频压缩

    原文出自 这是之前的项目 因为找不到原文作者 只是找到了一个转载的文章 所以就把链接放了进来 这个项目个人亲测是可以用的 速度也比较快 但是有一点点小问题 简单的做了一个说明 1.我把项目重新Fock了一下适配到了Androidx 2.经个人测试 当视频文件放到 /storage/emulated/0/

    2024年02月12日
    浏览(30)
  • Android 计时器Chronometer 使用及源码分析(1),android音视频框架

    @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_textview_chronometer);//加载布局文件 initView(); } private void initView() { btn_start = findViewById(R.id.btn_start); btn_stop = findViewById(R.id.btn_stop); btn_reset = findViewById(R.id.btn_reset); chronome

    2024年04月14日
    浏览(33)
  • android项目实战之使用框架 集成多图片、视频的上传

    效果图  实现方式,本功能使用PictureSelector 第三方库  。作者项目地址:https://github.com/LuckSiege/PictureSelector 1. builder.gradle 增加 2. XML布局 3. 适配器,这里对GridImageAdapter进行了改进。 5. 点击增加弹框布局 6. 弹框页面初始化 7.  弹框页面监听初始化 8. 增加拍照回调,不加这

    2024年01月23日
    浏览(29)
  • LiveGBS流媒体平台-GBT28181国标视频平台录像存储设备录像回看解决方案

    28181协议全称为GB/T28181《安全防范视频监控联网系统信息传输、交换、控制技术要求》,是由公安部科技信息化局提出,由全国安全防范报警系统标准化技术委员会(SAC/TC100)归口,公安部一所等多家单位共同起草的一部国家标准(以下简称28181)。28181协议在全国平安城市、交

    2023年04月24日
    浏览(39)
  • 海康威视摄像头播放录像视频(RTSP协议)

    旧URL:rtsp://[username]:[password]@[ipaddress]/[videotype]/ch[number]/[streamtype] 如:rtsp://admin:12345@192.168.25.64:554/h264/ch1/main/av_stream 新URL:rtsp://[username]:[password]@[IP]:554/Streaming/Channels/[channelID][streamID] 如:rtsp://admin:12345@192.168.25.64:554/Streaming/Channels/101 录像机其实和摄像机基本一样,旧URL中摄像

    2024年02月12日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包