簡體   English   中英

requestLegacyExternalStorage 在 Android 11 - API 30 中不起作用

[英]requestLegacyExternalStorage is not working in Android 11 - API 30

Google 最近在 API 29 中引入了一些與存儲 API 相關的更改,例如范圍存儲,我們通過在 Manifest 中添加“requestLegacyExternalStorage=true”來選擇退出。 但是現在當我以 SdkVersion 30 為目標時,這似乎不再起作用。 此更改后,下載目錄中的某些文件未列出 (File.listFiles)。

但是現在當我以 SdkVersion 30 為目標時,這似乎不再起作用

那是對的。 Android 11 (API 30+) requestLegacyExternalStorage=true什么都不做,您不能再“選擇退出”。 它在 Android 10 中可用,為開發人員提供過渡/寬限期,以便能夠遷移到范圍存儲 model。

Option 1: Migrate data in your app whilst still targeting API 29, then once you're migrated data is compatible with scoped storage you should be able to release an update targetting API 30 - https://developer.android.com/training/數據存儲/用例

如果用戶跳過此版本並直接從以前的版本更新到最新版本,並且您遇到無法訪問的未遷移數據,這可能會帶來其自身的問題。

選項 2:Google 似乎看到了這個明顯的警告,並在針對 API 30 時包含了一個preserveLegacyExternalStorage=true選項以允許您遷移數據。 https://developer.android.com/reference/android/R.attr#preserveLegacyExternalStorage

展望未來,您可以參考此表以根據用例決定使用什么存儲“框架”: https://developer.android.com/training/data-storage

有些應用程序可能根本無法成功遷移,這取決於它們與File API 的交互方式,因為 Google 的解決方案不會涵蓋所有當前用例,並且可能沒有遷移路徑。

例如,幾年前我發布了一個應用程序,允許用戶使用MediaStoreContentResolver更新專輯封面,以更新專輯封面圖像的數據 - 這存儲在共享存儲中。 查看 Android 10+ AOSP MediaProvider源代碼后,似乎過去使用MediaStore更新專輯插圖以指向數據文件的應用程序不再有效,這僅僅是因為MediaProvider在內部創建自己的插圖在隱藏的.thumbnails文件夾中查找直接在 mp3 上並使用MediaExtractor ,並且從不引用插入以引用藝術品的ContentValues 因此,即使您可以自己更新藝術品,查詢MediaStore並查看它,其他應用程序也必須使用 API 29+ 中的ContentResolver#loadThumbnail不引用您更新的值,並且要么懶惰地創建藝術品,要么選擇已經生成的.thumbnails文件夾中的文件。 顯然,這些都沒有記錄在案,我的應用程序遭到了強烈的負面評價,但這些變化是破壞性的變化,完全超出了我的控制,讓我查看了 AOSP 源代碼,發現 Android 從根本上改變了行為。

(這不是咆哮,而是一個示例,說明這些更改如何因為 AOSP 的基本未記錄行為而無法提供遷移路徑)。

https://developer.android.com/about/versions/11/privacy/storage中所述,Android 11 上的存儲有一些變化:

  • Android 10個設備
    • requestLegacyExternalStorage將繼續工作,無論目標 sdk
  • Android 11個設備
    • 針對 sdk 29 的新安裝:尊重requestLegacyExternalStorage
    • 針對 sdk 30 的新安裝: requestLegacyExternalStorage始終為false
    • 從目標 sdk 29 升級到 30:如果設置了preserveLegacyExternalStoragerequestLegacyExternalStoragetrue (這是純粹的遷移案例,如果用戶卸載/重新安裝應用程序,則不會保留此 state)

此時您幾乎被迫實施范圍存儲。 除非您准備好遷移,否則請繼續以 sdk 29 為目標,因為無法在目標為 sdk 30 的 Android 11 設備上強制執行舊存儲。

更新:截至 2021 年 8 月,Play 商店將需要目標 sdk 30,因此如果您計划在那里發布,那么您必須在那時准備好范圍存儲實現

直到 2021 年初才這樣做(谷歌說):-

如果你想定位到 android 11,你應該使用 MANAGE_EXTERNAL_STORAGE 權限。

訪問此頁面了解更多詳情: https://developer.android.com/training/data-storage/manage-all-files

在 Android 11 上運行但以 Android 10(API 級別 29)為目標的應用程序仍然可以請求 requestLegacyExternalStorage 屬性。 此標志允許應用程序臨時選擇退出與范圍存儲相關的更改,例如授予對不同目錄和不同類型媒體文件的訪問權限。 將應用程序更新為目標 Android 11 后,系統將忽略 requestLegacyExternalStorage 標志。

無需調用不適用於 Android 11+ 的“requestLegacyExternalStorage=true”。

https://github.com/apache/cordova-plugin-media中有一個新的更新來解決 android 11+ 的保存文件路徑問題。

如果您更新“/platforms/android/app/src/main/java/org/apache/cordova/media/AudioHandler.java”和“/platforms/android/app/src/main/java/org/apache/cordova/ media/AudioPlayer.java”在你的項目中,那么它應該可以工作。

https://raw.githubusercontent.com/apache/cordova-plugin-media/4093f7e14fe65f94ffbef072ed188a0205e78a59/src/android/AudioHandler.Z93F725A07423FE1C8846F448B33DZ21

https://raw.githubusercontent.com/apache/cordova-plugin-media/4093f7e14fe65f94ffbef072ed188a0205e78a59/src/android/AudioPlayer.Z93F725A07423FE1C889F448B33D

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM