麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > OS > 安卓 > 正文

AndroidQ 沙箱適配多媒體文件(小結)

2024-09-11 17:15:18
字體:
來源:轉載
供稿:網友

綜述

所有內容的訪問變化見下圖:

外部媒體文件的掃描,讀取和寫入

最容易被踩坑的應該是,對外部媒體文件,照片,視頻,圖片的讀取或寫入。

掃描

首先是掃描。掃描依然是使用 query MediaStore 的方式。一句話介紹 MediaStore,MediaStore 就是Android系統中的一個多媒體數據庫。代碼如下圖所示,以搜索本地視頻為例子:

protected List<VideoInfo> doInBackground(Void... params) {  mContentResolver = context.getContentResolver();  String[] mediaColumns = { MediaStore.Video.Media._ID, MediaStore.Video.Media.DATA,      MediaStore.Video.Media.TITLE, MediaStore.Video.Media.MIME_TYPE,      MediaStore.Video.Media.DISPLAY_NAME, MediaStore.Video.Media.SIZE,      MediaStore.Video.Media.DATE_ADDED, MediaStore.Video.Media.DURATION,      MediaStore.Video.Media.WIDTH, MediaStore.Video.Media.HEIGHT };  Cursor mCursor = mContentResolver.query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, mediaColumns,      null, null, MediaStore.Video.Media.DATE_ADDED);  if (mCursor == null) {    return null;  }  // 注意,DATA 數據在 Android Q 以前代表了文件的路徑,但在 Android Q上該路徑無法被訪問,因此沒有意義。  ixData = mCursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA);  ixMime = mCursor.getColumnIndexOrThrow(MediaStore.Video.Media.MIME_TYPE);  // ID 是在 Android Q 上讀取文件的關鍵字段  ixId = mCursor.getColumnIndexOrThrow(MediaStore.Video.Media._ID);  ixSize = mCursor.getColumnIndexOrThrow(MediaStore.Video.Media.SIZE);  ixTitle = mCursor.getColumnIndexOrThrow(MediaStore.Video.Media.TITLE);  allImages = new ArrayList<VideoInfo>();  mTotalVideoCount = 0;  mCursor.moveToLast();    while (mCursor.moveToPrevious()) {    if (addVideo(mCursor) == 0) {      continue;    } else if (addVideo(mCursor) == 1) {      break;    }  }  mCursor.close();    return allImages;}

既然 data 不可用,就需要知曉 id 的使用方式,首先是使用 id 拼裝出 content uri ,如下所示:

public getRealPath(String id) {  return MediaStore.Video.Media.EXTERNAL_CONTENT_URI.buildUpon().appendPath(String.valueOf(id)).build().toString();}

Image 同理換成 MediaStore.Images。

讀取和寫入

其次,是讀取 content uri。這里需要注意 File file = new File(contentUri); 是無法獲取到文件的。file.exist() 為 false。

那么就產生兩個問題:1. 如何確定 ContentUri 形式的文件存在 2. 如何讀取或寫入文件。

首先,對于 Content Uri 的讀取,必須借助于 ContentResolver。

其次,對于 1,沒有找到 Google 文檔中提供比較容易的API,只能采用打開 FileDescriptor 是否成功的形式,代碼如下所示:

public boolean isContentUriExists(Context context, Uri uri) {  if (null == context) {    return false;  }  ContentResolver cr = context.getContentResolver();  try {    AssetFileDescriptor afd = cr.openAssetFileDescriptor(uri, "r");    if (null == afd) {      iterator.remove();    } else {      try {        afd.close();      } catch (IOException e) {      }    }  } catch (FileNotFoundException e) {    return false;  }  return true;}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 爱逼av| 9797色| 欧美精品久久天天躁 | av在线影片 | 国产好片无限资源 | 久久福利剧场 | 护士hd欧美free性xxxx | 久久男 | 黑人一区二区三区四区五区 | 一区二区三区日韩 | 精品一区二区三区中文字幕老牛 | av免费在线免费观看 | www.54271.com| 久久国产综合视频 | 日韩美香港a一级毛片免费 欧美一级淫片007 | 黄网站免费入口 | 精品久久久久久久久久中出 | 2019中文字幕在线播放 | 黄污在线看 | 久草视频2| 国产中出在线观看 | 91资源在线观看 | 91九色国产视频 | 色妇视频| 中国黄色一级生活片 | 麻豆蜜桃在线观看 | 亚洲人成网站免费播放 | 国产成视频在线观看 | 亚洲成人黄色片 | 蜜桃网站在线 | 亚洲国产精品500在线观看 | 欧美一区二区三区免费不卡 | 中文字幕在线观看视频www | 性毛片视频 | 99国语露脸久久精品国产ktv | sese在线视频 | 国产精品一区二区三区在线 | 国内精品久久久久久久久久 | 欧美精品免费一区二区三区 | 国产精品av久久久久久久久久 | a视频网站|