今天小編分享的科技經驗:誰來管管 Android 的照片選擇器,歡迎閲讀。
Android 應用圖片選擇界面的「髒亂差」一直是個老大難問題,這與其歷史上的權限寬松和執行不力是分不開的,但往者不可谏,來者猶可追。
用 Android 手機的朋友,對于微信選圖發朋友圈的體驗可能都頗有微詞:縮略圖的來源太多太雜了。取決于你手機的生态環境,微信照片選擇器裏的圖片可能來自修圖工具,也可能來自系統相機,甚至可能卡組是微博的圖片保存路徑、系統的下載目錄……
當然,這個問題不只限于微信,在微博等很多常用應用中,情況也是類似。
那麼,Android 照片選擇器的這個問題是如何產生的,又是否能得到解決呢?這事還得從很久以前説起……
前 Android 10 時代:自由放任
在任何一台 Android 設備上打開檔案管理器,你都會看到一些固定名稱的目錄,例如:
圖片(包括照片和螢幕截圖),對應 DCIM/ 和 Pictures/ 目錄;
視頻,對應 DCIM/、Movies/ 和 Pictures/ 目錄;
音頻檔案,對應 Alarms/、Audiobooks/、Music/、Notifications/、Podcasts/ 和 Ringtones/ 目錄;
下載的檔案,對應 Download/ 目錄。
從 Android 的最早時期起,系統就會索引這些固定路徑。如果應用需要獲取這些類型的檔案列表,無需自己掃描,通過 MediaProvider 媒體模塊和 MediaStore API 就能獲得。
這套基于路徑的媒體檔案索引機制,是 Android 照片選擇器的設計基石,除非——
根本沒什麼人用。
早年,大多數應用為了獲取媒體檔案,都選擇「另辟蹊徑」,申請整個外部存儲空間的讀寫權限(READ_EXTERNAL_STORAGE),然後自己從中提取檔案。而當時,Android 的權限管理機制又很粗疏,外部存儲空間的讀寫只有「全有」或「全無」兩種狀态。
這就導致了兩個問題:
應用列出的媒體檔案可能來自外部存儲的各個角落,其中包含很多并不需要列出的内容,例如緩存的縮略圖、應用資源等;
任何以訪問媒體檔案名義獲得存儲權限的應用,都變成了事實上的「檔案管理器」,這給很多侵犯隐私的惡劣做法提供了温床,例如将敏感信息存放在外部存儲中供另一應用取用。
Android 10 — 12:漸有起色
這種情況直到 Android 10 才開始好轉。在 Android 10 開發者預覽版中,Google 引入了一項稱為分區存儲(scoped storage)的「沙盒」機制,使得應用只能訪問它們自己創建的外部存儲路徑中的檔案,而不能随意訪問其他應用的專用存儲目錄。相應地,「讀寫外部存儲空間」權限也被更名為「訪問檔案和媒體」,媒體檔案訪問的規範化就此開始。