最近參加了一個訓練營,要做一個本地圖片查看器的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 命令
1.adb shell
2.su
3.找到文件路徑 退出shell
4.拷貝 到 /sdcard/目錄下(沒有權限時需要這樣做)
5.再從/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”