<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      uniapp_03_獲取媒體文件

      關于 uniapp 獲取媒體文件

      • 什么是 MediaStore
      • MediaStore 內嵌類和常用查詢字段
      • 查詢圖片
      • 查詢視頻
      • 查詢音樂
      • 獲取其它文件
      • 參考

      什么是 MediaStore

      1. MediaStore 是 Android 中的多媒體數據庫,Android 中的多媒體數據都記錄在在這里面
      2. Android 對所有的多媒體數據庫接口進行了封裝,直接用 ContentResolver 調用接口去進行數據庫的操作就可以了
      3. 注:一般用于需要本地圖片、視頻、音樂的元數據查詢
      4. 打開 /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;
      },
      

      參考文檔

      1. 關于MediaStore.Files
      2. Android之MediaStore使用 (查找 音樂/視頻/文檔/自定義類型文件.apk .zip 等)
      3. Android系統詳解之獲取圖片和視頻的縮略圖
      4. Android視頻圖片縮略圖的獲取
      5. Android查詢手機媒體庫
      6. Android MediaStore的基本使用
      7. Android如何高效地進行文件查詢——MediaStore
      8. Android視頻縮略圖(二)
      9. Android 獲取視頻縮略圖(獲取視頻每幀數據)的優化方案
      10. 【Android】縮略圖Thumbnails
      11. Build.VERSION.SDK_INT < Build.VERSION_CODES.O的含義
      12. Android如何獲取視頻首幀圖片
      13. Android如何高效地進行文件查詢——MediaStore
      14. MediaStore.Video.Thumbnails
      15. Android 獲取多媒體文件的縮略圖
      posted @ 2023-01-04 22:47  tsuru  閱讀(829)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 极品少妇无套内射视频| 亚洲最大成人在线播放| 中文在线а√天堂| 中文字幕日韩有码av| 欧产日产国产精品精品| 国产高清一区二区不卡| 大陆熟妇丰满多毛xxxx| 成人免费无码av| 日本中文字幕有码在线视频 | 久久天堂综合亚洲伊人HD妓女| 丁香五月婷激情综合第九色| 息烽县| 亚洲最大av一区二区| 久久精品人妻无码专区| 白丝乳交内射一二三区| 亚洲精品日韩在线观看| 国产睡熟迷奷系列网站| 无码人妻h动漫| 国产成人精品亚洲资源| 久热这里只有精品在线观看| 国产萌白酱喷水视频在线观看| 久久人体视频| 国产精品多p对白交换绿帽| 密云县| 精品国产成人A区在线观看| 无码日韩精品一区二区三区免费 | 强奷漂亮人妻系列老师| 亚洲暴爽av天天爽日日碰| 精品人妻伦九区久久aaa片| 韩国午夜理伦三级| 欧美福利在线| 精品视频在线观看免费观看| 国产精品无码av不卡| 中文字幕人妻丝袜美腿乱| 亚洲av日韩av中文高清性色| 国产欧美亚洲精品a第一页| 欧美成本人视频免费播放| 亳州市| 亚洲偷偷自拍码高清视频| 少妇被粗大的猛烈进出69影院一 | 18禁免费无码无遮挡网站 |