Android图库(系统相册)的数据库
最近参加了一个训练营,要做一个本地图片查看器的App(Android端),基础功能要支持图片列表的展示,参考了我的手机相册,它是按日期分类展示,于是我也想做成这样。
系统相册的样子:

网上搜索了一番,数据库中主要有3个字段跟时间有关的
date_added
:图片添加的时间date_modify
:图片上一次修改的时间date_taken
:图片拍摄时间(不确定是不是,暂且这么认为)
分别用这3个字段按降序排序,最后发现date_taken
的效果跟系统相册是一样的,于是只用了这个字段。
后来想看看数据库中的表长什么样,看有没有字段的定义,经过一番搜索,发现
图片数据库实际是 /data/data/com.android.providers.media/external.db
中files
表的视图
external.db
中的表和视图如下:
1.该数据库文件从Android模拟器获取的方式:
①adb 命令
adb shell
su
adb pull 到 /sdcard/目录下
再从/sdcard/ 导出到电脑硬盘上
注:android 7.0的系统模拟器没有访问data/data的权限,su的权限都没有
②AndroidStudio(3.6.3) 中菜单栏View->Tool Windows->Device File Explorer
注:拷出来的时候.db-shm 还有.db-wal一并拷出来
2.表结构
该视图创建语句:
CREATE VIEW images AS SELECT _id,_data,_size,_display_name,mime_type,title,date_added,date_modified,description,picasa_id,isprivate,latitude,longitude,datetaken,orientation,mini_thumb_magic,bucket_id,bucket_display_name,width,height FROM files WHERE media_type=1
files表 建表语句
CREATE TABLE "files" (
"_id" INTEGER,
"_data" TEXT UNIQUE COLLATE NOCASE,
"_size" INTEGER,
"format" INTEGER,
"parent" INTEGER,
"date_added" INTEGER,
"date_modified" INTEGER,
"mime_type" TEXT,
"title" TEXT,
"description" TEXT,
"_display_name" TEXT,
"picasa_id" TEXT,
"orientation" INTEGER,
"latitude" DOUBLE,
"longitude" DOUBLE,
"datetaken" INTEGER,
"mini_thumb_magic" INTEGER,
"bucket_id" TEXT,
"bucket_display_name" TEXT,
"isprivate" INTEGER,
"title_key" TEXT,
"artist_id" INTEGER,
"album_id" INTEGER,
"composer" TEXT,
"track" INTEGER,
"year" INTEGER CHECK("year" != 0),
"is_ringtone" INTEGER,
"is_music" INTEGER,
"is_alarm" INTEGER,
"is_notification" INTEGER,
"is_podcast" INTEGER,
"album_artist" TEXT,
"duration" INTEGER,
"bookmark" INTEGER,
"artist" TEXT,
"album" TEXT,
"resolution" TEXT,
"tags" TEXT,
"category" TEXT,
"language" TEXT,
"mini_thumb_data" TEXT,
"name" TEXT,
"media_type" INTEGER,
"old_id" INTEGER,
"storage_id" INTEGER,
"is_drm" INTEGER,
"width" INTEGER,
"height" INTEGER,
PRIMARY KEY("_id" AUTOINCREMENT)
);
3.这个.db文件macOS的打开方法之一
下载地址http://www.sqlitebrowser.org/
4.MediaStore.Images.Media.EXTERNAL_CONTENT_URI
这个uri对象的getPath()方法返回的值是“/external/images/media”
5.更新图库
5.1不建议调用insertImage
try {
MediaStore.Images.Media.insertImage(getContentResolver(),
croppedFile.getAbsolutePath(),croppedFile.getName() , null);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
- insertImage中传的图片路径的话,系统会再拷贝一张放到Pictures里面,系统相册会更新,但是你自己的相册应用可能更新不了,更新时机可能在重启之后,我试了一下,自己的相册应用在重启之后才更新,我的手机是Android8.0的
5.2发广播
Intent intent = new Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
intent.setData(croppedUri);
PreviewActivity.this.sendBroadcast(intent);
这种方式你看源码会发现他只能更新 路径只能是 Environment.getExternalStorageDirectory()
方法的返回值开头才有效, 我试了保存在 getFilesDir getCacheDir 都不能更新
5.3
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!