uniapp_03_獲取媒體文件
關于 uniapp 獲取媒體文件
- 什么是 MediaStore
- MediaStore 內嵌類和常用查詢字段
- 查詢圖片
- 查詢視頻
- 查詢音樂
- 獲取其它文件
- 參考
什么是 MediaStore
- MediaStore 是 Android 中的多媒體數據庫,Android 中的多媒體數據都記錄在在這里面
- Android 對所有的多媒體數據庫接口進行了封裝,直接用 ContentResolver 調用接口去進行數據庫的操作就可以了
- 注:一般用于需要本地圖片、視頻、音樂的元數據查詢
- 打開 /data/data/com.android.provider.media 下對應的數據庫文件 然后導入到電腦用SQLite數據庫查看軟件之后打開數據庫就可以看到對應的字段
MediaStore 內嵌類和常用查詢字段
查詢圖片
查詢相冊中所有圖片
/**
* @method getPhotoAlbum
* @return {Object} { "相冊1": [ { filePath: "文件路徑", dataAdded: "大小" } ],... }
* @description 獲取相冊中內容
* @description https://blog.csdn.net/zhang0114/article/details/127669677#:~:text=%E5%9C%A8uni-app,d%E7%9B%B8%E5%86%8C%E7%9A%84%E4%BB%A3%E7%A0%81%E6%AE%B5%EF%BC%9A
* @description https://blog.csdn.net/Jonly_W/article/details/106440072
* @description https://www.jianshu.com/p/34a7e7d85ecc
* @description https://blog.csdn.net/u013470102/article/details/89703973
* @description https://blog.csdn.net/weixin_44008788/article/details/123532073
* @description http://www.rzrgm.cn/alwayswyy/p/4807248.html
* @description https://blog.csdn.net/u013233097/article/details/50704360
* */
getPhotoAlbum: function() {
// #ifdef APP-PLUS
let list = {};
// MediaStore這個類是Android系統提供的一個多媒體數據庫,android中多媒體信息都可以從這里提取
// MediaStore包括了多媒體數據庫的所有信息,包括音頻,視頻和圖像,android把所有的多媒體數據庫接口進行了封裝,
// 所有的數據庫不用自己進行創建,直接使用ContentResolver去調用那些封裝好的接口就可以進行數據庫的操作了。
const MediaStore = plus.android.importClass('android.provider.MediaStore');
const PhotoColumns= [
MediaStore.Images.Media._ID,
MediaStore.Images.Media.DATA,
MediaStore.Images.Media.DATE_ADDED,
MediaStore.Images.Media.Thumbnails
];
const Main = plus.android.runtimeMainActivity(); // 此處相當于 context
const Resolver = Main.getContentResolver(); // 獲取ContentResolver實例
plus.android.importClass(Resolver);
// url 需要操作的數據, projection resolver需要返回的數據 selection:類似于where selectionArgs: where的參數 sortOrder:排序Order by
// resolver.query(url, projection, selection, selectionArgs, sortOrder)
const Cursor = Resolver.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, PhotoColumns, null, null, null);
plus.android.importClass(Cursor);
// Cursor默認是行的集合 cursor.moveToFirst()指向查詢結果的第一個位置
// 一般通過判斷cursor.moveToFirst()的值為true或false來確定查詢結果是否為空。
// 遍歷數據
while(Cursor.moveToNext()){
const _id = Cursor.getString(Cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID));
const FilePath = Cursor.getString(Cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA));
const DateAdded = Cursor.getLong(Cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATE_ADDED));
// 父路徑
const File = plus.android.newObject("java.io.File", `${FilePath}`); // 導入包并new這個類
const ParentFile = plus.android.invoke(File, "getParentFile");
// const ParentPath = plus.android.invoke(ParentFile, "getAbsolutePath");
const ParentName = plus.android.invoke(ParentFile, "getName");
const item = { filePath: FilePath, dataAdded: DateAdded, }
// 判斷 相冊是否存在 ? 添加 item : 添加相冊
if(ParentName in list) list[ParentName].push(item);
else list[ParentName] = [item];
}
Cursor.close(); // 關閉游標
return list;
// #endif
},
查詢視頻
視頻縮略圖會專門開一篇
/**
* @method getVideoGather
* @description 獲取視頻集合
* @description https://blog.csdn.net/IrisJaneny/article/details/73807218
* @description https://blog.csdn.net/LoneySmoke/article/details/108944485
* @description https://www.jianshu.com/p/ca73161e5509
* @description https://blog.csdn.net/weixin_44008788/article/details/123532073
* @description https://blog.csdn.net/yann02/article/details/92844364
* @description https://developer.aliyun.com/article/267936
* @description https://blog.csdn.net/zhutoushifu/article/details/50667862
* @description https://www.jianshu.com/p/f93b874043ae
* @return {Objetc}
* */
getVideoGather: function() {
let list = {}
const MediaStore = plus.android.importClass('android.provider.MediaStore');
// const thumbColumns = [
// MediaStore.Video.Thumbnails.DATA,
// MediaStore.Video.Thumbnails.VIDEO_ID
// ];
const videoColumns = [
MediaStore.Video.Media._ID, // 獲取 id
MediaStore.Video.Media.ALBUM, // 專輯
MediaStore.Video.Media.ARTIST, // 藝術家姓名
MediaStore.Video.Media.DATE_ADDED, // 視頻文件創建時間
MediaStore.Video.Media.DATE_MODIFIED, // 視頻最后更改時間
MediaStore.Video.Media.DISPLAY_NAME, // 視頻文件名稱
MediaStore.Video.Media.TITLE, // 視頻名
MediaStore.Video.Media.DURATION, // 視頻時長
// MediaStore.Video.Media.WIDTH, // 視頻寬
// MediaStore.Video.Media.HEIGHT, // 視頻搞、高
// MediaStore.Video.Media.BITRATE, // 視頻碼率
MediaStore.Video.Media.SIZE, // 視頻時長
MediaStore.Video.Media.DATA, // 視頻保存路徑
MediaStore.Video.Media.MIME_TYPE, // 視頻類型
];
const Main = plus.android.runtimeMainActivity(); // 此處相當于 context
const Resolver = Main.getContentResolver(); // 獲取ContentResolver實例
plus.android.importClass(Resolver);
const cursor = Resolver.query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, videoColumns, null, null, null);
plus.android.importClass(cursor);
// 獲得索引
while(cursor !=null && cursor.moveToNext()){
const _id = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media._ID));
const album = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.ALBUM));
const artist = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.ARTIST));
const dateAdded = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATE_ADDED));
const displayName = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DISPLAY_NAME));
const title = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.TITLE));
const duration = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATION));
const size = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.SIZE));
const fileParh = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA));
const mimtType = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.MIME_TYPE));
const item = { _id, album, artist, dateAdded, displayName, title, duration, size, fileParh, mimtType }
// 判斷 專輯是否存在與列表中 list.hasOwnProperty(album)
if(album in list) list[album].push(item);
else list[album] = [item];
}
console.log(list);
cursor.close(); // 關閉游標
return list;
},
獲取音樂
/**
* @method getAudioGather
* @description 獲取本機所有音頻
* @return {Object}
* */
getAudioGather: function() {
let list = {};
const MediaStore = plus.android.importClass('android.provider.MediaStore');
const audioColumns = [
MediaStore.Audio.Media._ID,// 歌曲ID
MediaStore.Audio.Media.ARTIST,// 歌曲的歌手名
MediaStore.Audio.Media.ALBUM,// 歌曲的唱片集
MediaStore.Audio.Media.TITLE,// 歌曲標題
MediaStore.Audio.Media.DISPLAY_NAME,// 歌曲名稱
MediaStore.Audio.Media.MIME_TYPE,// 歌曲的播放格式
MediaStore.Audio.Media.IS_RINGTONE,//
MediaStore.Audio.Media.IS_ALARM,// 歌曲的專輯名
MediaStore.Audio.Media.IS_MUSIC,//
MediaStore.Audio.Media.IS_NOTIFICATION,//
MediaStore.Audio.Media.DATA,// 歌曲文件的路徑
MediaStore.Audio.Media.DURATION // 歌曲的總播放時長
];
const Main = plus.android.runtimeMainActivity(); // 此處相當于 context
const Resolver = Main.getContentResolver(); // 獲取ContentResolver實例
plus.android.importClass(Resolver);
const cursor = Resolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, audioColumns, null, null, null);
plus.android.importClass(cursor);
while(cursor !=null && cursor.moveToNext()) {
const _id = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media._ID));
const artist = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST));
const album = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM));
const title = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE));
const displayName = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME));
const mimtType = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.MIME_TYPE));
const isRingtone = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.IS_RINGTONE));
const isAlarm = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.IS_ALARM));
const isMusic = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.IS_MUSIC));
const isNotification = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.IS_NOTIFICATION));
const fileParh = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));
const duration = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION));
const item = { _id, artist, album, title, displayName, mimtType, isRingtone, isAlarm, isMusic, isNotification, fileParh, duration};
album = album == "<unknown>" ? "default" : album;
if(album in list) list[album].push(item);
else list[album] = [item];
}
cursor.close();
return list;
},
獲取其它文件
/**
* @method getOtherFileGather
* @return {Object}
* @description 獲取其它文件
* TODO 需要優化現在是獲取所有的文件包括文件夾
* */
getOtherFileGather: function(type) {
let list = [];
const MediaStore = plus.android.importClass('android.provider.MediaStore');
const otherColumns = [
MediaStore.Files.FileColumns._ID, // id
MediaStore.Files.FileColumns.DATA, // 路徑
MediaStore.Files.FileColumns.SIZE, // 大小
MediaStore.Files.FileColumns.DATE_MODIFIED, //
MediaStore.Files.FileColumns.MIME_TYPE, // 文件類型
MediaStore.Files.FileColumns.TITLE, // 文件標題
MediaStore.Files.FileColumns.DATE_MODIFIED, //
MediaStore.Files.FileColumns.DATE_ADDED,
];
const selection = MediaStore.Files.FileColumns.MIME_TYPE + '= ?'
const selectionArgs = ["text/plain"];
const Main = plus.android.runtimeMainActivity(); // 此處相當于 context
const Resolver = Main.getContentResolver(); // 獲取ContentResolver實例
plus.android.importClass(Resolver);
const url = MediaStore.Files.getContentUri("external");
// TODO 需要優化現在是獲取所有的文件包括文件夾
// MediaStore.Files.FileColumns.DATA + " LIKE '%" + keyword + "%'"
// const cursor = Resolver.query(url, otherColumns, selection, selectionArgs, MediaStore.Files.FileColumns.DATE_ADDED + " DESC");
const cursor = Resolver.query(url, otherColumns, MediaStore.Files.FileColumns.DATA + " LIKE '%" + zip ?? '.zip' + "%'", null, null);
plus.android.importClass(cursor);
while(cursor !=null && cursor.moveToNext()) {
const _id = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns._ID));
const filePath = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.DATA));
const size = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.SIZE));
const dateModified = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.DATE_MODIFIED));
const mimtType = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.MIME_TYPE));
const title = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.TITLE));
list.push({ _id, filePath, size, dateModified, mimtType, title, })
}
cursor.close();
return list;
},
參考文檔
- 關于MediaStore.Files
- Android之MediaStore使用 (查找 音樂/視頻/文檔/自定義類型文件.apk .zip 等)
- Android系統詳解之獲取圖片和視頻的縮略圖
- Android視頻圖片縮略圖的獲取
- Android查詢手機媒體庫
- Android MediaStore的基本使用
- Android如何高效地進行文件查詢——MediaStore
- Android視頻縮略圖(二)
- Android 獲取視頻縮略圖(獲取視頻每幀數據)的優化方案
- 【Android】縮略圖Thumbnails
- Build.VERSION.SDK_INT < Build.VERSION_CODES.O的含義
- Android如何獲取視頻首幀圖片
- Android如何高效地進行文件查詢——MediaStore
- MediaStore.Video.Thumbnails
- Android 獲取多媒體文件的縮略圖

浙公網安備 33010602011771號