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移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
总结
可以看出,笔者的工作学习模式便是由以下 「六个要点」 组成:
❝ 多层次的工作/学习计划 + 番茄工作法 + 定额工作法 + 批处理 + 多任务并行 + 图层工作法❞
希望大家能将这些要点融入自己的工作学习当中,我相信一定会工作与学习地更富有成效。
下面是我学习用到的一些书籍学习导图,以及系统的学习资料。每一个知识点,都有对应的导图,学习的资料,视频,面试题目。
**如:我需要学习 **Flutter的知识。(大家可以参考我的学习方法)
- Flutter 的思维导图(无论学习什么,有学习路线都会事半功倍)
- Flutter进阶学习全套手册
- Flutter进阶学习全套视频
大概就上面这几个步骤,这样学习不仅高效,而且能系统的学习新的知识。
本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录
一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!文章来源:https://www.toymoban.com/news/detail-850049.html
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模板网!