○-○–○—○----○-----○------○ 呆萌的分割线 ○------○-----○----○—○–○-○
言归正传,总结一下Android循环录像的逻辑:
1.保存视频时,存储视频信息到数据库,包括:
id | 视频ID |
name | 视频名称 |
lock | 是否锁定(0,1) |
resolution | 分辨率(720,1080) |
2.每次开始录像和保存视频时检查剩余存储空间
sdFree < sdTotal * Constant.Record.SD_MIN_FREE_PERCENT || intSdFree < Constant.Record.SD_MIN_FREE_STORAGE
3.如果低于预设底限,则开始删除较旧的未加锁视频
4.如果删除所有的未加锁视频后,空间依然不足,则开始删除加锁视频
5.如果删除所有的加锁视频,空间依然不足,提示用户清理SD卡
[ Well well. Talk is cheap. Show me the code. ]
完整代码:
/**
-
获得SD卡总大小
-
@return 总大小,单位:字节B
*/
public static long getSDTotalSize(String SDCardPath) {
StatFs stat = new StatFs(SDCardPath);
long blockSize = stat.getBlockSize();
long totalBlocks = stat.getBlockCount();
return blockSize * totalBlocks;
}
/**
-
获得sd卡剩余容量,即可用大小
-
@return 剩余空间,单位:字节B
*/
public static long getSDAvailableSize(String SDCardPath) {
// StatFs stat = new StatFs(“/storage/sdcard1”);
StatFs stat = new StatFs(SDCardPath);
long blockSize = stat.getBlockSize();
long availableBlocks = stat.getAvailableBlocks();
return blockSize * availableBlocks;
}
/**
-
录像SD卡是否存在
-
@return
*/
public static boolean isVideoCardExists() {
try {
String pathVideo = Constant.Path.SDCARD_1 + “/tachograph/”;
if (Constant.Record.saveVideoToSD2) {
pathVideo = Constant.Path.SDCARD_2 + “/tachograph/”;
}
File fileVideo = new File(pathVideo);
fileVideo.mkdirs();
File file = new File(pathVideo);
if (!file.exists()) {
return false;
}
} catch (Exception e) {
MyLog.e(“[StorageUtil]isVideoCardExists:Catch Exception!”);
return false;
}
return true;
}
package com.tchip.carlauncher.model;
import java.util.ArrayList;
import java.util.List;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DriveVideoDbHelper extends SQLiteOpenHelper {
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = “video_db”;
private static final String VIDEO_TABLE_NAME = “video”;
private static final String VIDEO_COL_ID = “_id”;
private static final String VIDEO_COL_NAME = “name”; // 视频文件名称,如:2015-07-01_105536.mp4
private static final String VIDEO_COL_LOCK = “lock”; // 是否加锁:0-否 1-是
private static final String VIDEO_COL_RESOLUTION = “resolution”; // 视频分辨率:720/1080
private static final String[] VIDEO_COL_PROJECTION = new String[] {
VIDEO_COL_ID, VIDEO_COL_NAME, VIDEO_COL_LOCK, VIDEO_COL_RESOLUTION, };
public DriveVideoDbHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
// Create table
@Override
public void onCreate(SQLiteDatabase db) {
String createRouteTableSql = “CREATE TABLE " + VIDEO_TABLE_NAME + " (”
-
VIDEO_COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
-
VIDEO_COL_NAME + " TEXT," + VIDEO_COL_LOCK + " INTEGER,"
-
VIDEO_COL_RESOLUTION + " INTEGER" + “);”;
db.execSQL(createRouteTableSql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// Drop older table if existed
db.execSQL("DROP TABLE IF EXISTS " + VIDEO_TABLE_NAME);
// Create tables again
onCreate(db);
}
// Add new DriveVideo
public int addDriveVideo(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());
// Insert to database
long rowId = db.insert(VIDEO_TABLE_NAME, null, values);
// Close the database
db.close();
return (int) rowId;
}
// Get DriveVideo By ID
public DriveVideo getRouteDistanceById(int id) {
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.query(VIDEO_TABLE_NAME, VIDEO_COL_PROJECTION,
VIDEO_COL_ID + “=?”, new String[] { String.valueOf(id) }, null,
null, null, null);
if (cursor != null)
cursor.moveToFirst();
DriveVideo driveVideo = new DriveVideo(cursor.getInt(0),
cursor.getString(1), cursor.getInt(2), cursor.getInt(3));
db.close();
cursor.close();
return driveVideo;
}
// Get DriveVideo By Name
public DriveVideo getDriveVideoByName(String name) {
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.query(VIDEO_TABLE_NAME, VIDEO_COL_PROJECTION,
VIDEO_COL_NAME + “=?”, new String[] { name }, null, null, null,
null);
if (cursor != null)
cursor.moveToFirst();
DriveVideo driveVideo = new DriveVideo(cursor.getInt(0),
cursor.getString(1), cursor.getInt(2), cursor.getInt(3));
db.close();
cursor.close();
return driveVideo;
}
public boolean isVideoExist(String name) {
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.query(VIDEO_TABLE_NAME, VIDEO_COL_PROJECTION,
VIDEO_COL_NAME + “=?”, new String[] { name }, null, null, null,
null);
if (cursor.getCount() > 0) {
db.close();
cursor.close();
return true;
} else {
db.close();
cursor.close();
return false;
}
}
/**
-
根据视频名查询是否加锁
-
@param name
-
@return
*/
public int getLockStateByVideoName(String name) {
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.query(VIDEO_TABLE_NAME, VIDEO_COL_PROJECTION,
VIDEO_COL_NAME + “=?”, new String[] { name }, null, null, null,
null);
if (cursor.getCount() > 0) {
cursor.moveToFirst();
int videoLock = cursor
.getInt(cursor.getColumnIndex(VIDEO_COL_LOCK));
db.close();
cursor.close();
return videoLock;
} else {
db.close();
cursor.close();
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));
最后
想要了解更多关于大厂面试的同学可以点赞支持一下,除此之外,我也分享一些优质资源,包括:Android学习PDF+架构视频+源码笔记,高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 这几块的内容。非常适合近期有面试和想在技术道路上继续精进的朋友。
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!