Android 13這些許可權廢棄,你的應用受影響了嗎?
hi 大家好,我是 DHL。公眾號:ByteCode ,專注分享最新技術原創文章,涉及 Kotlin、Jetpack、演算法動畫、資料結構、系統原始碼、 LeetCode / 劍指 Offer / 多執行緒 / 國內外大廠演算法題等等。 * 原文: https://medium.com/androiddeve... * 譯者:程式設計師 DHL * 本文已收錄於倉庫 Technical-Article-Translation
無論是更改個人頭像、分享照片、還是在電子郵件中新增附件,選擇和分享媒體檔案是使用者最常見的操作之一。在聽取了 Android 使用者反饋之後,我們對應用程式訪問媒體檔案的方式做了一些改變。
Android 13 已被廢棄的許可權
許多使用者告訴我們,檔案和媒體許可權讓他們很困擾,因為他們不知道應用程式想要訪問哪些檔案。
在 Android 13 上廢棄了 READ_EXTERNAL_STORAGE
和 WRITE_EXTERNAL_STORAGE
許可權,用更好的檔案訪問方式代替這些廢棄的 API。
從 Android 10 開始向共享儲存中新增檔案不需要任何許可權。因此,如果你的 App 只在共享儲存中新增檔案,你可以停止在 Android 10+ 上申請任何許可權。
在之前的系統版本中 App 需要申請 READ_EXTERNAL_STORAGE
許可權訪問裝置的檔案和媒體,然後選擇自己的媒體選擇器,這為開發者增加了開發和維護成本,另外 App 依賴於通過 ACTION_GET_CONTENT
或者 ACTION_OPEN_CONTENT
的系統檔案選擇器,但是我們從開發者那裡瞭解到,它感覺沒有很好地整合到他們的 App 中。
圖片選擇器
在 Android 13 中,我們引入了一個新的媒體工具 Android 照片選擇器。該工具為使用者提供了一種選擇媒體檔案的方法,而不需要授予對其整個媒體庫的訪問許可權。
它提供了一個簡潔介面,展示照片和影片,按照日期排序。另外在 "Albums" 頁面,使用者可以按照螢幕截圖或下載等等分類瀏覽,通過指定一些使用者是否僅看到照片或影片,也可以設定選擇最大檔案數量,也可以根據自己的需求定製照片選擇器。簡而言之,這個照片選擇器是為私人設計的,具有乾淨和簡潔的 UI 易於實現。
我們還通過谷歌 Play 系統更新 (2022 年 5 月 1 日釋出),將照片選擇器反向移植到 Android 11 和 12 上,以將其帶給更多的 Android 使用者。
開發一個照片選擇器是一個複雜的專案,新的照片選擇器不需要團隊進行任何維護。我們已經在 ActivityX 1.6.0
版本中為它建立了一個 ActivityResultContract
。如果照片選擇器在你的系統上可用,將會優先使用照片選擇器。
kotlin
// Registering Photo Picker activity launcher with a max limit of 5 items
val pickMultipleVisualMedia = registerForActivityResult(PickMultipleVisualMedia(5)) { uris ->
// TODO: process URIs
}
// Launching the photo picker (photos & video included)
pickMultipleVisualMedia.launch(PickVisualMediaRequest(PickVisualMedia.ImageAndVideo))
如果希望新增型別進行篩選,可以採用這種方式。
kotlin
// Launching the photo picker (photos only)
pickMultipleVisualMedia.launch(PickVisualMediaRequest(PickVisualMedia.ImageOnly))
// Launching the photo picker (video only)
pickMultipleVisualMedia.launch(PickVisualMediaRequest(PickVisualMedia.VideoOnly))
// Launching the photo picker (GIF only)
pickMultipleVisualMedia.launch(PickVisualMediaRequest(PickVisualMedia.SingleMimeType("image/gif")))
可以呼叫 isPhotoPickerAvailable
方法來驗證在當前裝置上照片選擇器是否可用。
ACTION_GET_CONTENT 將會發生改變
正如你所見,使用新的照片選擇器只需要幾行程式碼。雖然我們希望所有的 Apps 都使用它,但在 App 中遷移可能需要一些時間。
這就是為什麼我們使用 ACTION_GET_CONTENT
將系統檔案選擇器轉換為照片選擇器,而不需要進行任何程式碼更改,從而將新的照片選擇器引入到現有的 App 中。
針對特定場景的新許可權
雖然我們強烈建議您使用新的照片選擇器,而不是訪問所有媒體檔案,但是您的 App 可能有一個場景,需要訪問所有媒體檔案(例如相簿照片備份)。對於這些特定的場景,我們將引入新的許可權,以提供對特定型別的媒體檔案的訪問,包括影象、影片或音訊。您可以在文件中閱讀更多關於它們的內容。
如果使用者之前授予你的應用程式 READ_EXTERNAL_STORAGE
許可權,系統會自動授予你的 App 訪問許可權。否則,當你的 App 請求任何新的許可權時,系統會顯示一個面向使用者的對話方塊。
所以您必須始終檢查是否仍然授予了許可權,而不是儲存它們的授予狀態。
下面的決策樹可以幫助您更好的瀏覽這些更改。
我們承諾在保護使用者隱私的同時,繼續改進照片選擇器和整體儲存開發者體驗,以建立一個安全透明的 Android 生態系統。
新的照片選擇器被反向移植到所有 Android 11 和 12 裝置,不包括 Android Go 和非 gms 裝置。
全文到這裡就結束了,感謝你的閱讀,堅持原創不易,歡迎在看、點贊、分享給身邊的小夥伴,我會持續分享原創乾貨!!!
真誠推薦你關注我,公眾號:ByteCode ,持續分享硬核原創內容,Kotlin、Jetpack、效能優化、系統原始碼、演算法及資料結構、動畫、大廠面經。
我開了一個雲同步編譯工具(SyncKit),主要用於本地寫程式碼,然後同步到遠端裝置,在遠端裝置上進行編譯,最將編譯的結果同步到本地,程式碼已經上傳到 Github,歡迎前往倉庫 hi-dhl/SyncKit 檢視。
近期必讀熱門文章
- Android 利器,我開發了雲同步編譯工具
- Twitter 上有趣的程式碼
- 誰動了我的記憶體,揭祕 OOM 崩潰下降 90% 的祕密
- 反射技巧讓你的效能提升 N 倍
- 90%人不懂的泛型侷限性,泛型擦除,星投影
- 90%的人都不知道的知識點,Kotlin 和 Java 的協變和逆變
- 揭祕反射真的很耗時嗎,射 10 萬次耗時多久
- Android 12 已來,你的 App 崩潰了嗎?
- Google 宣佈廢棄 LiveData.observe 方法
- 影響效能的 Kotlin 程式碼(一)
- 揭祕 Kotlin 中的 == 和 ===
開源新專案
-
雲同步編譯工具(SyncKit),本地寫程式碼,遠端編譯,歡迎前去檢視 SyncKit
-
KtKit 小巧而實用,用 Kotlin 語言編寫的工具庫,歡迎前去檢視 KtKit
-
AndroidX Jetpack 相關元件的實戰專案以及相關元件原理分析文章,正在逐漸增加 Jetpack 新成員,倉庫持續更新,歡迎前去檢視 AndroidX-Jetpack-Practice
-
LeetCode / 劍指 offer,包含多種解題思路、時間複雜度、空間複雜度分析,線上閱讀